r - 是否可以在数据之前先绘制轴线?
问题描述
这是我之前的问题的后续,我正在寻找一种解决方案来首先绘制轴,然后是数据。答案适用于该特定问题和示例,但它提出了一个更一般的问题,即如何更改底层 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()
解决方案
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))
到图中,轴不再被部分遮挡。这既证明了这是导致轴线变细的原因,也提供了一个合理的解决方法,前提是您不需要彩色面板背景。
推荐阅读
- drools - 如何在循环中触发规则
- html - CSS动画时间延迟问题
- java - spring boot oauth2 不要在 oauth_access_token 中插入值
- symfony-4.4 - 按字母数字列重新排序 gedmo 嵌套树
- hazelcast - Hazelcast Jet“mapFn”必须是可序列化的错误
- ios - 如何创建一个在多个 ViewController 上保持相同的标题层?
- java - Java 内存模型 - 令人惊讶的行为
- javascript - Discord bot 'connect' 命令与 discordjs v13、@discordjs/voice 和 SlashCommandBuilder
- python - 在python中使用xslt转换xml
- reactjs - 当我点击 li 标签时,路由不起作用我的 url 没有改变