使用错误栏的第二个数据源的ggplot失败

时间:2015-08-20 01:45:21

标签: r ggplot2 errorbar

这是关于获取一些自定义错误栏的上一个问题的后续内容。

  1. 情节的外观是我需要它的方式,所以不要担心只是为了评论(很高兴听到其他帮助的意见)
  2. 因为这些图是在循环中生成的,并且实际上只在满足条件时才添加误差条,所以我不能简单地合并所有数据,因此为了本练习的目的,假设绘图数据和错误栏数据来自不同的dfs。
  3. 我有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"
    

    为什么在我希望它使用第二个alldat数据帧覆盖geom_errorbar时,它会查找data.2015 $得分?

    编辑*我试图使用alldata $ plotscore和alldat $ score.2014指定误差线的ymin / ymax值(我肯定是不好的做法),它是情节,但条形图是错误的情节的位置/不按顺序(例如交换,在基准条上,等等)

1 个答案:

答案 0 :(得分:2)

根据我的经验,这个关于某个变量未找到的错误告诉我R在数据框中查找变量并且它不存在。有时解决方案就像修复拼写错误一样简单,但在您的情况下,score变量不是用于制作错误栏的数据集中的。{1}}变量。

names(alldat)
[1] "area"       "group"      "score.2015" "score.2014" "plotscore"  "direction"

y变量是geom_errorbar的必需美学。由于您在y内全局设置了ggplot变量,因此除非您专门将其映射到其他变量,否则其他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,但我在运行代码时没有找到必要的内容(您可以在上面看到{ {1}}是您给出的示例中第二个数据集中的变量。

另一个选择是确保合并后2015得分变量仍然命名为group。这可以通过更改score中的suffixes参数来完成。然后merge将出现在第二个数据集中,您不必在score中设置y变量。

geom_errorbar