2016-11-17 90 views
0

下面的代码工作正常错误与等高线图GGPLOT2

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)) 

给出了一个错误

Error: Aesthetics must be either length 1 or the same as the data (2): x, y, z

可有人请解释一下为什么?谢谢。

回答

1

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

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

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没有列±您也可以明确地说明它在AES功能geom_point

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)) 
+0

我其实是让在EVAL错误“错误(表达式,ENVIR,enclos) :找不到对象'z'“。希望我的回答有所帮助。 – DataJack

+0

非常感谢。但是,当我指定dat2是数据源时,为什么'geom_point()'函数期望z?不应该覆盖从'ggplot()'传递的aes吗? – slabofguinness

+0

这只是它的设计如何工作。我猜部分原因是因为它意味着在90%的情况下,像我的第一个例子那样,代码更简单。如果使用新的数据参数意味着即使某些内容相同,也重新输入了所有的美学内容,那么它只是生成不必要的大小的脚本,这似乎违背了ggplot2标语是“图形语法”。 – DataJack