2016-11-17 71 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