2017-01-03 48 views
0

我有基於此answer,一個後續問題,其中在下面的代碼行的scale_fill_manual位:ggplot_build的組列如何對應原始因子水平?

ggplot(data = temp2, aes(x = x, y = y2, fill = group)) + 
geom_bar(width = 0.1, stat = "identity") + 
scale_fill_manual(name = "key", labels = c("a", "b", "c", "d", "e", "others"), 
      values = c("#F8766D", "#A3A500", "#00BF7D", "#00B0F6", "#E76BF3", "#000000")) + 
labs(x = "value", y = "count") -> g2 

的顏色值和圖例標籤使用一些映射到在所述group柱測定數據幀由ggplot_build生成。我的問題是關於這種映射的確定,尤其是當group列是從具有不完整因子水平的因子列派生的時候。

例如:

set.seed(111) 
tmp_df <- 
    data.frame(a = rnorm(100, 0, 1), 
       b = rnorm(100, 0.5, 1), 
       c = rnorm(100, -0.5, 1), 
       d = rnorm(100, 1, 1), 
       e = rnorm(100, -1, 1)) %>% 
    tidyr::gather() %>% 
    mutate(key = factor(key, levels = letters[1:5])) 

現在創建堆積條形圖,併產生底層的原始數據:

tmp_df %>% 
    filter(key != "c") %>% 
    ggplot(aes(x = value, fill = key)) + 
    geom_histogram(binwidth = 0.1, position = 'stack') -> 
    p 

tmp_raw_df <- ggplot_build(p)$data[[1]] 

檢查tmp_raw_df

> head(tmp_raw_df) 
    fill y count x xmin xmax density ncount ndensity PANEL group ymin ymax colour size linetype alpha 
1 #C77CFF 1  1 -4.2 -4.25 -4.15  0.1 0.125  1.25  1  4 0 1  NA 0.5  1 NA 
2 #00BFC4 1  0 -4.2 -4.25 -4.15  0.0 0.000  0.00  1  3 1 1  NA 0.5  1 NA 
3 #7CAE00 1  0 -4.2 -4.25 -4.15  0.0 0.000  0.00  1  2 1 1  NA 0.5  1 NA 
4 #F8766D 1  0 -4.2 -4.25 -4.15  0.0 0.000  0.00  1  1 1 1  NA 0.5  1 NA 
5 #C77CFF 0  0 -4.1 -4.15 -4.05  0.0 0.000  0.00  1  4 0 0  NA 0.5  1 NA 
6 #00BFC4 0  0 -4.1 -4.15 -4.05  0.0 0.000  0.00  1  3 0 0  NA 0.5  1 NA 

我們看到的key的值具有被映射到組號1-4。我的問題是,該映射如何完成,以及如何從tmp_raw_dfgroup列恢復關鍵或因子級別的原始值?

+0

我不能說映射是如何完成的(雖然我通過重構'key',未使用的下降水平,並轉換爲整數懷疑),但我確信'ggplot_build(p)$ data'不再包含'key'的原始值。這些值現在應該生活在情節的一個尺度上。 –

+0

謝謝,那麼如何/應該在哪裏去檢索這些值? – Alex

+0

很可能,應該出現在劇情的'ggproto'對象之一中,但考慮到如何評估這些對象,我不確定您將能夠(輕鬆地)找回您正在尋找的內容。 –

回答

1

呀,即使您嘗試使用drop=FALSE保護因素完整性ggplot目前REV將保留該圖例顯示,但最終仍下跌他們最終數據打造爲grid圖。您可以使用手動填充值提供反向映射:

library(tidyverse) 

set.seed(111) 

data.frame(a = rnorm(100, 0, 1), 
      b = rnorm(100, 0.5, 1), 
      c = rnorm(100, -0.5, 1), 
      d = rnorm(100, 1, 1), 
      e = rnorm(100, -1, 1)) %>% 
    tidyr::gather() %>% 
    mutate(key = factor(key, levels = letters[1:5])) -> tmp_df 

factor_map <- c(a="#111111", b="#222222", c="#333333", d="#444444", e="#555555") 
rev_map <- setNames(names(factor_map), unname(factor_map)) 

tmp_df %>% 
    filter(key != "c") %>% 
    ggplot(aes(x = value, fill = key)) + 
    geom_histogram(binwidth = 0.1, position = 'stack') + 
    scale_fill_manual(drop=FALSE, values=factor_map) -> p 

tmp_raw_df <- tbl_df(ggplot_build(p)$data[[1]]) 

tmp_raw_df <- mutate(tmp_raw_df, orig_factor=rev_map[fill]) 

distinct(tmp_raw_df, fill, group, orig_factor) 
## # A tibble: 4 × 3 
##  fill group orig_factor 
##  <chr> <int>  <chr> 
## 1 #555555  4   e 
## 2 #444444  3   d 
## 3 #222222  2   b 
## 4 #111111  1   a