【问题标题】:Can I stop axis ticks from being drawn over axis lines in ggplot?我可以停止在ggplot中的轴线上绘制轴刻度吗?
【发布时间】:2018-03-28 19:04:52
【问题描述】:

我正在自定义 ggplot 图形的外观,其主题涉及粗而暗的轴线。但是,我注意到带有刻度线和轴线的绘图将在绘制线条后绘制刻度线。

这不是细轴的问题,因为刻度从默认轴线粗细的边缘开始。但是如果你把线加粗,你最终会在这条线上画出刻度线:

ggplot(mpg, aes(cty, hwy)) +
    geom_col() +
    theme_light() +
    theme(axis.line.x = element_line(color = "black", size = 2),
          axis.line.y = element_line(color = "black", size = 2))

有没有办法让刻度线在轴线下方绘制?在轴线的范围而不是中点开始它们?或者以其他方式包括刻度线和与刻度线不同颜色的粗轴线,而没有这种奇怪的重叠?谢谢。

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    我不知道如何更改顺序,以便在 ggplot 中的轴线下方绘制刻度,但如果将绘图转换为 grob 就可以做到。

    为了演示,这里有一个丑陋但明显的颜色对比图:

    p <- ggplot(mpg, aes(cty, hwy)) +
      geom_col() +
      theme_light() +
      theme(axis.line.x = element_line(color = "black", size = 2),
            axis.line.y = element_line(color = "black", size = 2),
            axis.ticks = element_line(color = "yellow", size = 1),
            axis.ticks.length = unit(5, "pt"),
            plot.background = element_rect(fill = "grey"))
    

    在上图中,黄色刻度线明显位于黑色轴线上方。

    # convert to grob object
    pg <- ggplotGrob(p) 
    
    # swap order for y-axis
    orig.order <- pg$grobs[[which(pg$layout$name == "axis-l")]]$childrenOrder
    pg$grobs[[which(pg$layout$name == "axis-l")]]$childrenOrder <- orig.order[2:1]
    
    # swap order for x-axis
    orig.order <- pg$grobs[[which(pg$layout$name == "axis-b")]]$childrenOrder
    pg$grobs[[which(pg$layout$name == "axis-b")]]$childrenOrder <- orig.order[2:1]
    
    rm(orig.order)
    
    # plot
    grid::grid.draw(pg)
    

    在上图中,黄色刻度线现在位于黑色轴线下方。

    【讨论】:

    • 这不是我希望的解决方案,但事实证明它是我需要的解决方案!我仍然认为这在基础 ggplot 中是可能的,但我对我正在编写的主题有其他需求,结果证明只有进入 gtable 才有可能,你的回答帮助我找到了一个起点。谢谢。
    【解决方案2】:

    您可以像使用axis.ticksaxis.ticks.length 修改轴线一样修改刻度。例如:

    ggplot(mpg, aes(cty, hwy)) +
      geom_col() +
      theme_light() +
      theme(axis.line.x = element_line(color = "black", size = 2),
            axis.line.y = element_line(color = "black", size = 2),
            axis.ticks = element_line(color = "black", size = 2),
            axis.ticks.length = unit(2, "mm"))
    

    【讨论】:

    • 所以这可以通过使刻度线与线的颜色相同来解决问题,对吗?
    • 是的,并且使它们更长,以便它们超出线
    猜你喜欢
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 2014-06-26
    • 1970-01-01
    相关资源
    最近更新 更多