正如我在评论中所希望的那样,如果图已经绘制完成,一个解决方法可能是重新排序图层。这对于通用的ggplots应该适用。
library('ggplot2')
pl <- ggplot(data.frame(x = factor(c(1:2, NA)), y = 1), aes(x, y)) +
geom_point() +
geom_blank(data = data.frame(x = addNA(factor(c(0:3, NA))), y = 1))
## not what I want
pl
## this is what I want
pl$layers <- rev(pl$layers)
pl
不幸的是,当您有多个具有单独数据集的图层时,因子水平可能会被覆盖。您可以通过在离散比例尺上设置限制来解决此问题:
pl <- ggplot(data.frame(x = factor(c(1:2, NA)), y = 1), aes(x, y)) + geom_point()
pl +
geom_blank(data = data.frame(x = addNA(factor(c(0:3, NA))), y = 1)) +
scale_x_discrete(limits=addNA(factor(c(0:3, NA))))
[
pl <- ggplot(data.frame(x = factor(c(1:2, NA)), y = 1), aes(x, y)) + geom_point()
pl +
geom_blank(data = data.frame(x = addNA(factor(c(0:3, NA))), y = 1)) +
scale_x_discrete(limits=addNA(factor(c(0:3, NA))), expand=c(0.25,0.25))
ggplot(data.frame(x = factor(c(1:2, NA)), y = 1), aes(x, y)) + geom_blank(data = data.frame(x = addNA(factor(c(0:3, NA))), y = 1))
按预期工作(除了没有点),在删除NA之间添加点层,之后添加它们。这不奇怪吗? - rawr
ggplot(data.frame(x = factor(c(1:2, NA)), y = 1), aes(x, y)) + geom_blank(data = data.frame(x = addNA(factor(c(0:3, NA))), y = 1)) + geom_point()
虽然不是很理想--那么我可能会问如何重新排序已经创建的ggplot对象的层(或在某个索引处插入一个层)。 - rawrx
中使用paste()
,它就能正常工作:pl <- ggplot(data.frame(x = paste(factor(c(1:2, NA))), y = 1), aes(x, y)) + geom_point(); pl + geom_blank(data = data.frame(x = paste(addNA(factor(c(0:3, NA)))), y = 1), aes(x, y))
。 - javNA
转换为字符串,不再是NA
。 - rawr