关于这个主题已经有很多问题,但是我找不到一个可以回答我的特定问题的问题。

我有一个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给出了错误


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


现在这次程序说:


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


所以我的问题是:这甚至意味着什么?显然,aes和数据的长度均为3。pointdata中的行数少于bardata中的行数,但这本身不是问题,例如,参见以下答案:https://stackoverflow.com/a/2330825/2298323

那么这是怎么回事? (以及如何在情节中得到我的观点?)

最佳答案

问题是您要在fill = factor(colorname)调用中为整个图分配qplot

因此,testplot2还将尝试将colorname映射到fill美观度,但是colorname data.frame中没有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)))


您需要做的是仅将映射应用于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)))

08-19 22:36