关于这个主题已经有很多问题,但是我找不到一个可以回答我的特定问题的问题。
我有一个barplot
(请参见下面的testplot1
和testplot3
)正在绘制一个数据集(下面的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)))