2017-02-27 33 views
1

我實際上找到答案是我的問題,但我想知道這是否是一個錯誤。ggplot2問geom_errorbar中不存在的審美

假設我有這樣的:

library(ggplot2) 
library(dplyr) 
first <- 
mtcars %>% 
    group_by(vs) %>% 
    summarise(mean = mean(mpg), 
      lower_ci = mean(mpg) - 2 * sd(mpg), 
      upper_ci = mean(mpg) + 2 * sd(mpg)) 

我可以做一個分層的情節是這樣的:

ggplot(data = mtcars, aes(x = as.factor(vs))) + 
    geom_point(aes(y = mpg), alpha = 0.2) + 
    geom_point(data = first, aes(y = mean), colour = "red") + 
    geom_errorbar(data = first, aes(ymin = lower_ci, ymax = upper_ci)) 

大,沒問題。讓我們一步一步重新創建劇情。

graph <- ggplot() 
graph <- graph + geom_point(alpha = 0.2) 
graph <- graph %+% mtcars + aes(x = as.factor(vs), y = mpg) 
graph <- graph + geom_point(data = first, aes(x = as.factor(vs), y = mean, colour = "red")) 

在這一點上,我只需要覆蓋其需要的xyminymaxaes thethics錯誤吧。但是,對象在對象的結構中具有預定義的y。出於某種原因,如果我補充一點:

graph + geom_errorbar(data = first, 
           aes(x = as.factor(vs), ymin = lower_ci, ymax = upper_ci)) 

,我會認爲這是正確的方式,它拋出一個錯誤有關aes正題的長度。當然,first數據幀具有正確的長度,所以我認爲它應該通過全局選項中的頂點。

如果我補充一點:

graph + geom_errorbar(data = first, 
           aes(x = as.factor(vs), y = NULL, ymin = lower_ci, ymax = upper_ci)) 

它修復它,並預期拋出Warning: Ignoring unknown aesthetics: y

我會假設該對象的全局選項將認識到geom_errorbar不需要yaes正題。

我在這裏錯過了什麼嗎?

回答

2

我在這裏錯過了什麼嗎?

不是。您確定問題正確;你只是假設還有別的東西。這是一個小bug,可能不值得修復。

我會假設對象的全局選項會認識到geom_errorbar不需要y美學。

美學默認繼承(你可以通過設置inherit.aes = FALSE避免誤差)),以及它們對現有的數據立即檢查。如果繼承的映射列不可用,因爲它不在圖層的數據框中,則會引發錯誤。

這是另一個例子。這不是從一個在你的問題真的不一樣,但它使用更常見geom S和有點簡單:

df1 = data.frame(x1 = 1:2, y1 = 3:4, ty = 'a') 
df2 = data.frame(x2 = 1, y2 = 5) 

ggplot(df1, aes(x1, y1, linetype = ty)) + 
    geom_line() + 
    geom_point(data = df2, aes(x = x2, y = y2)) 
# Error in eval(expr, envir, enclos) : object 'ty' not found 

即使geom_point不採取linetype美學,因爲沒有數據列在df2名爲ty,我們得到一個錯誤。以下,對簡單的辦法是設置inherit.aes = FALSE

ggplot(df1, aes(x1, y1, lintype = ty)) + 
    geom_line() + 
    geom_point(data = df2, aes(x = x2, y = y2), inherit.aes = FALSE) 
## works 
+0

在你的代碼和@ cimentadaj的代碼,你都在第二AES指定一個新的數據源()。所以geom_中的引用就是新的數據集。假設在兩個獨立的數據框中匹配變量名稱的先驗表示相同的變量看起來像問題的配方。我不認爲這是一個錯誤,默認不做這個假設。 – Elin

+0

我不確定我看到你的觀點。我使用的數據與問題中的數據相似 - 兩個數據框的共享列名指示相同的變量。如果一個人在不同的數據框中有相同的變量(如OP似乎),我認爲使用相同的列名可能是一個好主意。 – Gregor

+0

我認爲如果你想討論'ggplot2'中的設計決定,這不是你正在尋找的論壇。從軟件的角度來看,這個實現對我來說很有意義,因爲每個層都知道要查看哪些數據,但不需要擔心其他層正在查看哪些數據。點層不應該根據線層是否引用相同的數據框來改變行爲。 – Gregor