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

Vin*_*ent 8 r ggplot2

关于这个主题已经有很多问题了,但我找不到能够回答我这个问题的问题.

我有一个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))
                )
Run Code Online (Sandbox Code Playgroud)

现在testplot1工作得很好,但是testplot2给出了错误

factor(colorname)出错:找不到对象'colorname'.

我不明白他为什么这么说,并且想知道,但这不是我的主要问题,因为有一个简单的解决方法,见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)))
Run Code Online (Sandbox Code Playgroud)

现在这个程序说:

错误:美学必须是长度为1或与dataProblems相同的长度:xname,ypos,factor(ptyname).

所以我的问题是:这甚至意味着什么?显然,两者aes和数据都是长度为3.行数pointdata小于bardata,但这本身不是问题,请参阅此答案:https://stackoverflow.com/a/2330825/2298323

那么这里发生了什么?(我怎样才能在我的情节中获得积分?)

Tut*_*han 12

问题是您要fill = factor(colorname)qplot通话中的整个情节分配.

所以testplot2也会尝试映射colornamefill审美,但data.frame中没有colorname列,pointdata这就是为什么你有这个错误信息.如果你用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)))
Run Code Online (Sandbox Code Playgroud)

您需要做的是仅将映射应用于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)))
Run Code Online (Sandbox Code Playgroud)


ton*_*nov 5

是的,有时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
Run Code Online (Sandbox Code Playgroud)

这就是问题所在:当您aesggplot()(或qplot()在您的情况下)指定映射时,此设置将自动应用于任何后续geom.你指定了x,yfill.因为geom_bar,一切都很好.对于geom_point你覆盖xy,但fill仍然映射到colorname不存在pointdata,因此错误.

如果您混合使用多个数据框,建议采用以下方法:清空ggplot()以及aes每个geom的特定数据.

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

在此输入图像描述