关于这个主题已经有很多问题了,但我找不到能够回答我这个问题的问题.
我有一个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))
)
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也会尝试映射colorname到fill审美,但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)
是的,有时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)
这就是问题所在:当您aes在ggplot()(或qplot()在您的情况下)指定映射时,此设置将自动应用于任何后续geom.你指定了x,y和fill.因为geom_bar,一切都很好.对于geom_point你覆盖x和y,但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)
