首页 > 解决方案 > 是否可以在数据之前先绘制轴线?

问题描述

这是我之前的问题的后续,我正在寻找一种解决方案来首先绘制轴,然后是数据。答案适用于该特定问题和示例,但它提出了一个更一般的问题,即如何更改底层 grobs 的绘图顺序。首先是轴,然后是数据。

非常类似于面板网格 grob 可以绘制在顶部或不绘制的方式。

面板网格和轴 grobs 的生成显然不同 - 轴更多地作为引导对象而不是“简单”grobs。(轴是用 绘制的ggplot2:::draw_axis(),而面板网格是作为ggplot2:::Layout对象的一部分构建的)。

我想这就是为什么在顶部绘制轴的原因,我想知道绘制顺序是否可以更改。

# An example to play with 

library(ggplot2)
df <- data.frame(var = "", val = 0)

ggplot(df) + 
  geom_point(aes(val, var), color = "red", size = 10) +
  scale_x_continuous(
    expand = c(0, 0),
    limits = c(0,1)
  ) +
  coord_cartesian(clip = "off") +
  theme_classic() 

标签: rggplot2grob

解决方案


Aggplot可以用它的 来表示gtable。grobs 的位置由layout元素给出,“z 列用于定义 grobs 的绘制顺序”

然后可以增加包含点 grob的 的z值,以便最后绘制它。panel

所以如果p是你的情节那么

g <- ggplotGrob(p) ;
g$layout[g$layout$name == "panel", "z"] <-  max(g$layout$z) + 1L
grid::grid.draw(g)

但是,如评论中所述,这会改变轴的外观,这可能是由于面板被绘制在某些轴上。

但在来自dww的令人振奋的新消息中

如果我们添加theme(panel.background = element_rect(fill = NA))到图中,轴不再被部分遮挡。这既证明了这是导致轴线变细的原因,也提供了一个合理的解决方法,前提是您不需要彩色面板背景。


推荐阅读