ggplot 使用第二个数据源作为错误栏失败
ggplot using second data source for error bars fails
这是关于获取一些自定义错误栏的上一个问题的后续问题。
- 情节的外观正是我所需要的,所以不要担心仅就此发表评论(不过很高兴听到其他帮助的意见)
- 因为这些图是在循环中生成的,而且误差条实际上只有在满足条件时才会添加,我不能简单地预先合并所有数据,所以为了这个练习的目的假设图数据和errorbar数据来自不同的dfs.
我有一个 ggplot
,我尝试使用不同的数据框向其添加一些错误栏。当我调用绘图时,它说它无法从父绘图中找到 y 值,即使我只是尝试使用新数据添加误差线。我知道这一定是语法错误,但我很难过...
首先让我们生成数据和绘图
library(ggplot2)
library(scales)
# some data
data.2015 = data.frame(score = c(-50,20,15,-40,-10,60),
area = c("first","second","third","first","second","third"),
group = c("Findings","Findings","Findings","Benchmark","Benchmark","Benchmark"))
data.2014 = data.frame(score = c(-30,40,-15),
area = c("first","second","third"),
group = c("Findings","Findings","Findings"))
# breaks and limits
breaks.major = c(-60,-40,-22.5,-10, 0,10, 22.5, 40, 60)
breaks.minor = c(-50,-30,-15,-5,0, 5, 15,30,50)
limits =c(-70,70)
# plot 2015 data
ggplot(data.2015, aes(x = area, y = score, fill = group)) +
geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
coord_flip() +
scale_y_continuous(limit = limits, oob = squish, minor_breaks = breaks.minor,
breaks = breaks.major)
调用绘图 (c) 会按预期生成漂亮的绘图,现在让我们设置误差线并尝试将它们添加为绘图中的新层 "c"
# get the error bar values
alldat = merge(data.2015, data.2014, all = TRUE, by = c("area", "group"),
suffixes = c(".2015", ".2014"))
alldat$plotscore = with(alldat, ifelse(is.na(score.2014), NA, score.2015))
alldat$direction = with(alldat, ifelse(score.2015 < score.2014, "dec", "inc"))
alldat$direction[is.na(alldat$score.2014)] = "absent"
#add error bars to original plot
c <- c+
geom_errorbar(data=alldat, aes(ymin = plotscore, ymax = score.2014, color = direction),
position = position_dodge(width = .9), lwd = 1.5, show.legend = FALSE)
当我现在调用 c 时,我得到
"Error in eval(expr, envir, enclos) : object 'score' not found"
为什么它会查找 data.2015$score 而我只是希望它使用第二个 alldat 数据帧覆盖 geom_errorbar
?
EDIT* 我尝试使用 alldata$plotscore 和 alldat$score.2014(我确信这是不好的做法)为误差条指定 ymin/ymax 值,它绘制,但条与图的顺序错误 positions/out(例如,调换位置,改为在基准柱上等)
根据我的经验,这个有关未找到某个变量的错误告诉我 R 去 data.frame 中查找一个变量,但它不存在。有时解决方案就像修复拼写错误一样简单,但在您的情况下, score
变量不在您用来制作错误栏的数据集中。
names(alldat)
[1] "area" "group" "score.2015" "score.2014" "plotscore" "direction"
y
变量是 geom_errorbar
所必需的美学。因为你在 ggplot
中全局设置了一个 y
变量,其他 geoms 继承全局 y
除非你专门将它映射到一个不同的变量。在当前数据集中,您需要将 y
映射到 2015 年得分变量。
geom_errorbar(data=alldat, aes(y = score.2015, ymin = plotscore,
ymax = score.2014, color = direction),
position = position_dodge(width = .9), lwd = 1.5, show.legend = FALSE)
在您的评论中,您指出您还必须将 fill
添加到 geom_errobar
,但是当我 运行 代码时我发现没有必要(您可以见上文,group
是您给出的示例中第二个数据集中的变量。
另一种选择是确保 2015 年得分变量在合并后仍命名为 score
。这可以通过更改 merge
中的 suffixes
参数来完成。然后 score
将在第二个数据集中,您不必在 geom_errorbar
.
中设置 y
变量
alldat2 = merge(data.2015, data.2014, all = TRUE, by = c("area", "group"),
suffixes = c("", ".2014"))
...
names(alldat2)
[1] "area" "group" "score" "score.2014" "plotscore" "direction"
这是关于获取一些自定义错误栏的上一个问题的后续问题。
- 情节的外观正是我所需要的,所以不要担心仅就此发表评论(不过很高兴听到其他帮助的意见)
- 因为这些图是在循环中生成的,而且误差条实际上只有在满足条件时才会添加,我不能简单地预先合并所有数据,所以为了这个练习的目的假设图数据和errorbar数据来自不同的dfs.
我有一个 ggplot
,我尝试使用不同的数据框向其添加一些错误栏。当我调用绘图时,它说它无法从父绘图中找到 y 值,即使我只是尝试使用新数据添加误差线。我知道这一定是语法错误,但我很难过...
首先让我们生成数据和绘图
library(ggplot2)
library(scales)
# some data
data.2015 = data.frame(score = c(-50,20,15,-40,-10,60),
area = c("first","second","third","first","second","third"),
group = c("Findings","Findings","Findings","Benchmark","Benchmark","Benchmark"))
data.2014 = data.frame(score = c(-30,40,-15),
area = c("first","second","third"),
group = c("Findings","Findings","Findings"))
# breaks and limits
breaks.major = c(-60,-40,-22.5,-10, 0,10, 22.5, 40, 60)
breaks.minor = c(-50,-30,-15,-5,0, 5, 15,30,50)
limits =c(-70,70)
# plot 2015 data
ggplot(data.2015, aes(x = area, y = score, fill = group)) +
geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
coord_flip() +
scale_y_continuous(limit = limits, oob = squish, minor_breaks = breaks.minor,
breaks = breaks.major)
调用绘图 (c) 会按预期生成漂亮的绘图,现在让我们设置误差线并尝试将它们添加为绘图中的新层 "c"
# get the error bar values
alldat = merge(data.2015, data.2014, all = TRUE, by = c("area", "group"),
suffixes = c(".2015", ".2014"))
alldat$plotscore = with(alldat, ifelse(is.na(score.2014), NA, score.2015))
alldat$direction = with(alldat, ifelse(score.2015 < score.2014, "dec", "inc"))
alldat$direction[is.na(alldat$score.2014)] = "absent"
#add error bars to original plot
c <- c+
geom_errorbar(data=alldat, aes(ymin = plotscore, ymax = score.2014, color = direction),
position = position_dodge(width = .9), lwd = 1.5, show.legend = FALSE)
当我现在调用 c 时,我得到
"Error in eval(expr, envir, enclos) : object 'score' not found"
为什么它会查找 data.2015$score 而我只是希望它使用第二个 alldat 数据帧覆盖 geom_errorbar
?
EDIT* 我尝试使用 alldata$plotscore 和 alldat$score.2014(我确信这是不好的做法)为误差条指定 ymin/ymax 值,它绘制,但条与图的顺序错误 positions/out(例如,调换位置,改为在基准柱上等)
根据我的经验,这个有关未找到某个变量的错误告诉我 R 去 data.frame 中查找一个变量,但它不存在。有时解决方案就像修复拼写错误一样简单,但在您的情况下, score
变量不在您用来制作错误栏的数据集中。
names(alldat)
[1] "area" "group" "score.2015" "score.2014" "plotscore" "direction"
y
变量是 geom_errorbar
所必需的美学。因为你在 ggplot
中全局设置了一个 y
变量,其他 geoms 继承全局 y
除非你专门将它映射到一个不同的变量。在当前数据集中,您需要将 y
映射到 2015 年得分变量。
geom_errorbar(data=alldat, aes(y = score.2015, ymin = plotscore,
ymax = score.2014, color = direction),
position = position_dodge(width = .9), lwd = 1.5, show.legend = FALSE)
在您的评论中,您指出您还必须将 fill
添加到 geom_errobar
,但是当我 运行 代码时我发现没有必要(您可以见上文,group
是您给出的示例中第二个数据集中的变量。
另一种选择是确保 2015 年得分变量在合并后仍命名为 score
。这可以通过更改 merge
中的 suffixes
参数来完成。然后 score
将在第二个数据集中,您不必在 geom_errorbar
.
y
变量
alldat2 = merge(data.2015, data.2014, all = TRUE, by = c("area", "group"),
suffixes = c("", ".2014"))
...
names(alldat2)
[1] "area" "group" "score" "score.2014" "plotscore" "direction"