【问题标题】:can I separately control the x and y axes using ggplot?我可以使用 ggplot 分别控制 x 轴和 y 轴吗?
【发布时间】:2011-09-26 08:19:46
【问题描述】:

这是来自ggplot wiki的ggplot:

baseplot <- ggplot(data.frame(x=1:10, y=10:1)) +
    geom_point(aes(x = x, y = y))
baseplot

问题

是否可以单独控制这些轴,例如只使 x 轴变黑? axis.line.xaxis.line.y 似乎不在选项之列。

我尝试过的

  1. wiki 演示了,例如,可以控制轴的颜色

    baseplot + opts(axis.line = theme_segment(colour = 'black', size = 2))
    

  2. 使用geom_segment 可以工作,但存在线条必须与情节编号匹配的限制。

    有没有办法得到,例如baseplot 对象的最大和最小轴以及刻度?这将减少潜在的错误。 更新这个问题的答案,“不,还没有”,已覆盖previously

    baseplot + geom_segment(aes(x = c(0,0), y = c(0,0), 
                            yend = c(0, max(y)), xend = c(max(x), 0), 
                            size = c(0.5, 0.1))) + 
               geom_segment(aes(x = 0, y = y, 
                            xend = -1, 
                            yend = y, 
                            size = 0.1))
    

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    不支持单独控制轴线。 您可以在绘制后删除或编辑线条:

    > baseplot + opts(axis.line = theme_segment(colour = 'black', size = 2))
    > grid.remove(gPath("axis_v", "axis.line.segments"), grep=TRUE)
    
    > baseplot + opts(axis.line = theme_segment(colour = 'black', size = 2))
    > grid.edit(gPath("axis_v", "axis.line.segments"), grep=TRUE, gp=gpar(col="red"))
    > grid.edit(gPath("axis_h", "axis.line.segments"), grep=TRUE, gp=gpar(col="blue"))
    

    更新

    在 0.9.1- 中,这可能会发生如下变化:

    grid.edit(gPath("axis-l", "axis.line.segments"), grep=TRUE, gp=gpar(col="red"))
    grid.edit(gPath("axis-b", "axis.line.segments"), grep=TRUE, gp=gpar(col="blue"))
    

    【讨论】:

    • @kohske 效果很好,但是有没有办法可以将新图分配给对象?例如,这样我就可以打电话给baseplot,它会绘制编辑后的情节?
    • @kohske 我无法让它在 ggplot 0.9.0 中工作。 ggplot2 版本之间有变化吗?
    • @Misha 在 0.9.1 中?这是轻微的修改。查看更新。
    • @kohske 这创造了奇迹。谢谢一百万。如果我能以某种方式接受你的回答,我会的。
    【解决方案2】:

    您似乎也可以通过调整主题轻松实现它:

    mytheme <- theme_classic()
    mytheme$axis.line.x <- mytheme$axis.line.y <- mytheme$axis.line
    mytheme$axis.line.x$colour <- 'red'
    ggplot(iris, aes(Sepal.Length, Sepal.Width)) + geom_point() + mytheme
    

    【讨论】:

      【解决方案3】:

      我怀疑你的分析是正确的。

      但是,还有另一种可能的解决方法:geom_hlinegeom_vline

      baseplot + 
          geom_hline(yintercept=0, colour="red", size = 3) +
          geom_vline(xintercept=0, colour="blue", size = 2) 
      

      同样不理想,因为线条跨越整个绘图区域,而不是仅仅框定轴,如果你知道我的意思的话。

      【讨论】:

        【解决方案4】:

        这个问题指出,您可以打开两条线路,然后关闭其中一条:https://github.com/hadley/ggplot2/issues/778。我发现这个策略既简单又有效。

        【讨论】:

        • 我不认为这是正确的。您链接到的问题似乎是对您建议的预期行为的此类功能/识别的请求。但是,该问题已关闭,并且没有计划实施此行为。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多