2017-04-07 32 views
0

我想在同一調用中使用傳遞給另一個ggplot2函數中的data函數參數data參數的數據幀的變量。引用在ggplot函數的'data'參數中傳遞的數據幀的變量

例如,在下面的例子中,我想指的是傳遞給data參數數據框的變量xggplot在另一個函數scale_x_continuous如:

library(ggplot2) 

set.seed(2017) 

samp <- sample(x = 20, size= 1000, replace = T) 

ggplot(data = data.frame(x = samp), mapping = aes(x = x)) + geom_bar() + 
scale_x_continuous(breaks = seq(min(x), max(x))) 

而且我得到的錯誤:

Error in seq(min(x)) : object 'x' not found 

我明白了。當然,我可以這樣做避免了問題:

df <- data.frame(x = samp) 
ggplot(data = df, mapping = aes(x = x)) + geom_bar() + 
scale_x_continuous(breaks = seq(min(df$x), max(df$x))) 

但我不希望被迫定義調用ggplot外界物體df。我希望能夠直接引用我在data中傳遞的數據框中的變量。

非常感謝

+1

那是根本不可能的。 ggplot不評估數據環境中'scale_x_continuous'的參數。另外,每個圖層都可以擁有自己的數據源,因此,當您達到規模時,不再清楚哪個數據環境是「正確」的。您可能需要設置一個輔助函數,該函數根據請求的列同時添加圖層和比例尺。 – MrFlick

+0

感謝MrFlick提供的這種精確性,由於我主要使用獨特的數據源,因此我沒有看到您提到的缺點。您認爲可以強制'scale_x_continuous'在同一個環境中查找在ggplot調用? 通過創建幫助函數,您的意思是創建函數,如: 'helper < - function(df){ggplot(data = df,mapping = aes(x = x))+ scale_x_continuous(breaks = seq(min (df $ x),max(df $ x))) } 然後調用: 'helper(data.frame(x = samp))+ geom_bar()' ? –

+0

'scale_x_continuous'將永遠不會評估它的參數,而不是它調用時的參數。它無法直接看到任何數據屬性或審美映射。如果你想做一些不同的事情(不是簡單的任務),你必須編寫自己的函數。 – MrFlick

回答

1

你可以寫一個輔助函數來initilialize情節

helper <- function(df, col) { 
    ggplot(data = df, mapping = aes_string(x = col)) + 
    scale_x_continuous(breaks = seq(min(df[[col]]), max(df[[col]]))) 
} 

,然後調用

helper(data.frame(x = samp), "x") + geom_bar() 
+0

我明白了,感謝'aes_string'技巧 –