geom_blank删除NA值

12
使用 geom_blank 我想添加一些新的因子水平,但我似乎无法实现这一点,并且保持 NA 水平。
library('ggplot2')
pl <- ggplot(data.frame(x = factor(c(1:2, NA)), y = 1), aes(x, y)) + geom_point()
pl

在此输入图片描述

pl + geom_blank(data = data.frame(x = addNA(factor(c(0:3, NA))), y = 1))

我想要使用geom_blank使x在0、1、2、3和NA处可见:

输入图像描述


1
我想我可以交换顺序: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对象的层(或在某个索引处插入一个层)。 - rawr
那只疯狂的猫@baptiste在哪里? - rawr
如果我在 x 中使用 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)) - jav
在这种情况下,@jav将NA转换为字符串,不再是NA - rawr
2个回答

9

正如我在评论中所希望的那样,如果图已经绘制完成,一个解决方法可能是重新排序图层。这对于通用的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

enter image description here


如果您像这样自我回答赏金问题,您的积分会发生什么变化? - Hack-R
根据这里,我将失去那些点数。 - rawr
那太糟糕了。 - Hack-R

1

不幸的是,当您有多个具有单独数据集的图层时,因子水平可能会被覆盖。您可以通过在离散比例尺上设置限制来解决此问题:

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))))

由于某些原因,这会破坏轴上的扩展,而NA中断点位于右边缘。

[Almost Working[1]

这可以通过手动设置扩展参数来解决。
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))

Working, but must manually specify expand


如果pl已经包含了scale_x_discrete,那么这样做会更加混乱。我不明白为什么geom_blank应该删除NA,特别是如果我已经有了它,并且默认情况下不删除NA(即geom_point)。 - 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))按预期工作(除了没有点),在删除NA之间添加点层,之后添加它们。这不奇怪吗? - rawr
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - jrdnmdhl
更多关于这个普遍问题的信息请参见:https://github.com/hadley/ggplot2/issues/577 简而言之,Hadley 建议在将数据集输入之前,在所有数据集上一致设置因子级别或在比例尺中指定。 - jrdnmdhl
是的,调整比例尺是显而易见的解决方案,但我正在尝试避免在各个层之间保持一致性,这就是为什么我采用了geom_blank方法而不是设置比例尺。 - rawr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接