【问题标题】:Error with contour plot ggplot2等高线图ggplot2错误
【发布时间】:2016-11-17 22:17:35
【问题描述】:

以下代码运行良好

dat1 <- data.frame(x=c(-1,-1,1,1),y=c(-1,1,-1,1),z=c(1,2,3,4))
dat2 <- data.frame(x=c(-0.5,0.5),y=c(-0.5,0.5))

ggplot(dat1, aes(x=x, y=y, z=z)) +
geom_tile(aes(fill=z)) +
scale_fill_gradient(limits = c(0, 1), low = "yellow", high = "red")

但是,这个

ggplot(dat1, aes(x=x, y=y, z=z)) +
geom_tile(aes(fill=z)) +
scale_fill_gradient(limits = c(0, 1), low = "yellow", high = "red") +
geom_point(data=dat2, aes(x=x,y=y))

报错

错误:美学必须是长度1或与数据相同(2):x,y,z

有人能解释一下原因吗?谢谢。

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    ggplot 函数会将嵌套在其中的 aes 函数中声明的所有美学传递给它后面的所有 geom 函数。为了说明我的观点,以下两项工作。

    最干净的答案是从 aes 函数中删除 z,因为它只需要第一个几何图形。

    ggplot(dat1, aes(x=x, y=y) )+
      geom_tile(aes(fill=z)) +
      scale_fill_gradient(limits = c(0, 1), low = "yellow", high = "red") +
      geom_point(data=dat2)
    

    由于 dat2 中没有 z 列,您也可以在 geom_point 的 aes 函数中明确声明它

    ggplot(dat1, aes(x=x, y=y, z=z) )+
      geom_tile(aes(fill=z)) +
      scale_fill_gradient(limits = c(0, 1), low = "yellow", high = "red") +
      geom_point(data=dat2, aes( z=NULL))
    

    【讨论】:

    • 我实际上得到了错误“eval(expr,envir,enclos)中的错误:找不到对象'z'”。希望我的回答对您有所帮助。
    • 非常感谢。但是,当我指定 dat2 是数据源时,为什么 geom_point() 函数需要 z 呢?那不应该覆盖从ggplot()传递的aes吗?
    • 这就是它的工作原理。我猜测的部分原因是因为这意味着在 90% 的情况下,代码看起来更简单,就像我的第一个示例一样。如果使用新的数据参数意味着你已经重新输入了所有的美学,即使有些是相同的,那么它只是生成不必要地大的脚本,这似乎与 ggplot2 标语“图形语法”相反。
    • @JamesBarrett 以上
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 2013-08-26
    • 2017-09-18
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多