2013-01-08 62 views
2

說我創造一個情節:存儲在ggplot2對象中的比例顏色在哪裏?

df <- data.frame(A = 1:100, B = jitter(1:100, 25), C = c('One', 'Two')) 

p <- ggplot(df, aes(A, B, colour = C)) + 
    geom_point() + 
    scale_colour_manual(values = c('red', 'green')) 

那些人在那裏的顏色(紅,綠)存儲在p


我可以看到在這裏的功能被使用的功能的調色板:

p$scales$scales[[1]]$palette 

這個函數的內容是:

function (n) 
{ 
    if (n > length(values)) { 
    stop("Insufficient values in manual scale. ", n, " needed but only ", 
     length(values), " provided.", call. = FALSE) 
    } 
    values 
} 

我覺得顏色必須存儲在values但是我不知道他們在p的實際位置。


P.s.我見過這個問題:How to extract the fill colours from a ggplot object?。但對於我想要做的事情,我無法建立情節。我需要在製造之前弄清楚顏色。

如果有對人物遞歸搜索p某種方式「紅色」或「綠色」,可能會幫助找到這些值。


編輯:我最終試圖做什麼。

我想他們繪製之前編輯地塊。這個想法是,給定的一些情節p你可以做這樣的事情:

apply_theme(p) 

...和顏色方案應用於整個小區(包括規模,漸變等)。這是爲了避免不得不做這樣的事情:

p + some_theme + scales_colour_manual(values = plot_theme) 

我試圖通過爲用戶減少工作量,使他們可以將主題應用到整個情節,而不必擔心他們是否填色漸變,離散比例或其他。

構建情節的部分解決方案。但我希望能夠應用這個主題,並且仍然可以在稍後編輯該圖。

我已經能夠編輯p所以,無論顏色追溯適用於geoms。但我無法找到如何使用縮放顏色來實現這一點。我知道顏色必須在某處!

+0

對不起,我剛纔看到你不能建立情節。因此,我刪除了我的答案。你能解釋爲什麼建立劇情不是一種選擇嗎? – Roland

+0

@Roland添加了編輯。也許我正在以完全錯誤的方式去解決這個問題。 – MadScone

回答

3

沒有太大的進展,但我已經排除了,它可能隱藏了幾個地方。

你可以看到所有的字符向量p包含

Filter(is.character, unlist(p)) 
# $labels.x 
# [1] "A" 

# $labels.y 
# [1] "B" 

# $labels.colour 
# [1] "C" 

所以它不直接存儲。

通過設置options(error = recover),然後通過僅提供一種顏色迫使一個錯誤,我們可以檢查調用堆棧。

(p <- ggplot(df, aes(A, B, colour = C)) + 
    geom_point() + 
    scale_colour_manual(values = 'red') 
) 

1: print(list(data = list(A = 1:100, B = c(4.32692646654323, 3.46481398493052, 0.4989527114667, 
... 
13: scale$palette(n) 

輸入框13: scale$palette(n),我們可以看到,可變values確實存儲的顏色信息。

Browse[1]> values 
[1] "red" 

我們可以通過調用堆棧每一幀尋找,但一個奇怪的現象正在發生 - 它不會出現在任何地方。

Browse[1]> sapply(
    sys.frames(), 
    function(envir) 
    { 
    exists("values", envir, inherits = FALSE) 
    } 
) 
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 
[16] FALSE FALSE 

(參見sys.status()調用堆棧的全部細節。)

我懷疑某些奇評價技術正在與Scales參考類使用。

+0

+1感謝您的付出。部分難題來自'p'中嵌套的數量。例如。 '過濾器(is.character,unlist(p))'只返回三個字符......但我知道有更多的事情(嘗試:'過濾器(is.character,unlist(p $ scales $ scales))'只是舉個例子)。 'values'可能不存在於'p'中......顏色可能在其他名稱下。我可能需要一些方法來完全'unlist()''p'。 – MadScone