将其他数据集中的点添加到ggplot2中

15

已经有很多关于这个主题的问题,但我找不到一个解决我的具体问题的答案。

我有一个barplot(见下面的testplot1testplot3)绘制了一个数据集(bardata),并希望从另一个数据集(pointdata)中添加点。看下面的简化示例:

bardata <- data.frame(
               xname = c(1, 1, 1, 2, 2, 2, 3, 3, 3), 
               yvalue = c(1, 2, 3, 2, 3, 1, 4, 2, 1), 
               colorname = c("a", "b", "c", "a", "b", "c", "a", "b", "c")
               )  
pointdata <- data.frame(
                xname = c(1, 1, 3), 
                ypos = c(2, 4, 3), 
                ptyname = c("p", "q", "r")
             ) 

testplot1 <- qplot(xname, yvalue, data= bardata, stat = "identity", 
               fill= factor(colorname),  geom = "bar")
testplot2 <- testplot1 + 
                geom_point(data = pointdata, mapping = 
                  aes(x = xname, y = ypos, shape = factor(ptyname))
                )

现在testplot1运行得很好,但是testplot2会报错:

Error in factor(colorname) : object 'colorname' not found.

我不明白他为什么这么说,想知道原因,但这不是我的主要问题,因为有一个简单的解决方法,请参见下面的testplot3

 testplot3 <- qplot(xname, yvalue, data= bardata, stat = "identity", 
                      fill= factor(bardata$colorname),  geom = "bar")
 testplot4 <- testplot3 + 
                  geom_point(data = pointdata, mapping = 
                    aes(x = xname, y = ypos, shape = factor(ptyname)))

现在程序提示:

错误:美学必须是长度为1,或与数据相同的长度问题:xname、ypos、factor(ptyname)。

那么我的问题是:这到底是什么意思?显然aes 和数据都是长度为3。 在pointdata中的行数少于bardata,但这本身不是一个问题,例如请参见这个答案:https://dev59.com/AXE95IYBdhLWcg3wY9D6#2330825

那么这里究竟发生了什么?(我该如何将我的点绘制在图中?)

3个回答

20
问题在于你在qplot调用中为整个图形赋值了fill = factor(colorname)。所以testplot2也会尝试将colorname映射到fill美学,但是pointdata数据框中没有colorname列,这就是为什么会出现错误消息的原因。如果你使用ggplot重写它,它看起来像这样:
ggplot(bardata, aes(xname, yvalue, fill = factor(colorname))) +
  geom_bar(stat = "identity")+ 
  geom_point(data = pointdata, 
             mapping = aes(x = xname, y = ypos, shape = factor(ptyname)))

您需要做的是仅将映射应用于 geom_bar 调用,如下所示:

ggplot(bardata, aes(xname, yvalue)) +
  geom_bar(stat = "identity", aes(fill = factor(colorname)))+ 
  geom_point(data = pointdata, 
             mapping = aes(x = xname, y = ypos, shape = factor(ptyname)))

11

是的,有时候ggplot的错误描述很难理解。首先请注意:尽量避免使用qplot,对于相当复杂的图表,它可能会掩盖细节。

你的代码与

ggplot(bardata, aes(xname, yvalue, fill = factor(colorname))) + 
  geom_bar(stat = "identity") + 
  geom_point(data = pointdata, aes(x = xname, y = ypos, shape = factor(ptyname))

#Error in factor(colorname) : object 'colorname' not found

问题在于:当您在ggplot()(或您的情况下的qplot())中指定aes映射时,此设置会自动应用于任何后续的geom。您已经指定了xyfill。对于geom_bar,一切正常。对于geom_point,您覆盖了xy,但是fill仍然映射到colorname,而pointdata中不存在该映射,因此会出现错误。

如果您混合使用几个数据框,则建议采用以下方法:使用空的ggplot()加上每个geom的特定aes

ggplot() + 
  geom_bar(data = bardata, aes(xname, yvalue, fill = factor(colorname)), stat = "identity") + 
  geom_point(data = pointdata, aes(xname, ypos, shape = factor(ptyname)))

输入图像描述


1

另一种解决方案是在geom_point调用中添加inherit.aes=FALSE。然后,点的美学特征将分别确定。


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