【问题标题】:Adding points from other dataset to ggplot2将其他数据集中的点添加到 ggplot2
【发布时间】:2015-06-26 09:15:15
【问题描述】:

关于这个主题已经有很多问题了,但我找不到能回答我具体问题的问题。

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

因素(颜色名称)错误:找不到对象“颜色名称”。

我不明白他为什么这么说,我想知道,但这不是我的主要问题,因为有一个简单的解决方法,请参阅下面的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,或与 数据问题:xname、ypos、因素(ptyname)。

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

那么这里发生了什么? (以及如何在我的情节中获得我的观点?)

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

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

    所以testplot2 也会尝试将colorname 映射到fill 美学,但pointdata data.frame 中没有colorname 列,这就是您收到此错误消息的原因。如果你用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)))
    

    【讨论】:

      【解决方案2】:

      是的,有时 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
      

      这就是问题所在:当您在ggplot()(或您的情况下为qplot())中指定aes 映射时,此设置会自动应用于任何后续geom。您指定了xyfill。对于geom_bar,一切正常。对于geom_point,您覆盖xy,但fill 仍映射到colornamepointdata 中不存在,因此出现错误。

      如果您混合多个数据框,推荐的方法是:空ggplot() 加上每个几何图形的特定aes

      ggplot() + 
        geom_bar(data = bardata, aes(xname, yvalue, fill = factor(colorname)), stat = "identity") + 
        geom_point(data = pointdata, aes(xname, ypos, shape = factor(ptyname)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多