2017-10-20 66 views
1

documentation爲條形圖中ggplot2說(見例3):當多個棒放置在同一位置依次層疊酒吧GGPLOT2 - 土壤剖面

條形圖自動堆疊。填充順序的設計與圖例相匹配。

由於某種原因,第二句對我不起作用。下面是一個例子的數據集,其代表土層上述(落葉層等)和地下(實際土):

df <- structure(list(horizon = structure(c(5L, 3L, 4L, 2L, 1L, 5L, 
3L, 4L, 2L, 1L, 5L, 3L, 4L, 2L, 1L, 5L, 3L, 4L, 2L, 1L, 5L, 3L, 
4L, 2L, 1L, 5L, 3L, 4L, 2L, 1L), .Label = c("A", "B", "F", "H", 
"L"), class = "factor"), site = structure(c(1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 5L, 
5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L), .Label = c("A", "B", "C", 
"D", "E", "F"), class = "factor"), value = c(2.75, 0.5, 0.25, 
-4.125, -3.375, 3.78125, 1.375, 0.625, -10.6875, -6.34375, 4.28, 
2.065, 0.68, -12.1, -10.75, 8.583333333, 4.541666667, 2.166666667, 
-10.70833333, -4.25, 7.35, 4, 1.8, -13.95, -5.175, 1.933333333, 
1.245833333, 0.641666667, -11.16666667, -2.291666667)), .Names = c("horizon", 
"site", "value"), class = "data.frame", row.names = c(NA, -30L 
)) 

現在我嘗試通過首先指定土壤層級別的順序繪製數據(即視野,自上而下地):

require(ggplot2); require(dplyr) 
df %>% 
    mutate(horizon = factor(horizon, levels = c("L","F","H","A","B"))) %>% 
    ggplot(aes(site, value)) + geom_col(aes(fill = horizon)) + labs(y = "Soil depth (cm)") 

enter image description here

它爲LFH而不是AB(以下GR即負值)。其原因可能不起作用的原因是,堆疊酒吧的排序從最大到最小爲site(分別爲正值和負值),然後以上下方式堆疊。它是否正確?如果是這樣的話,那麼對於我的積極價值來說,這只是巧合,這個傳說與我相信的堆疊酒吧相匹配。

我想要實現的是在圖例中疊加條形圖的順序(從頂部到底部),因此在橫截面視圖中查看土壤剖面時,我不確定如何來解決這個問題。

我曾嘗試改變總體排序行爲,但它產生同樣的情節如上:

df %>% 
    mutate(horizon = factor(horizon, levels = c("L","F","H","A","B"))) %>% 
    arrange(desc(value)) %>% 
    ggplot(aes(site, value)) + geom_col(aes(fill=horizon)) + labs(y = "Soil depth (cm)") 

df %>% 
    mutate(horizon = factor(horizon, levels = c("L","F","H","A","B"))) %>% 
    arrange(value) %>% 
    ggplot(aes(site, value)) + geom_col(aes(fill=horizon)) + labs(y = "Soil depth (cm)") 

我可能得正值和負值分別進行排序,即分別下降和上升,?

+0

什麼是預期Ø本安輸出? 'factor'中的'levels'參數是否與預期的輸出相匹配? –

+0

@AdamQuek是的'factor'中的''參數'的水平應該與期望的輸出相匹配。 – Stefan

回答

2

根據相應因子的等級對堆積條形圖進行排序。潛在的問題出現在反向堆疊的負值(從負向頂部朝向0)。爲了闡明問題讓讓所有的值負:

df %>% 
    mutate(horizon = factor(horizon, levels = c("L","F","H","B","A"))) %>% 
    ggplot(aes(site, value - 20)) + geom_col(aes(fill = horizon)) + labs(y = "Soil depth (cm)") 

enter image description here

一種解決方法是指定一個不同的順序水平,這將導致以期望填充次序的(在這種情況下:levels = c("L","F","H","B","A"))和手動調整使用scale_fill_discrete傳說:

df %>% 
    mutate(horizon = factor(horizon, levels = c("L","F","H","B","A"))) %>% 
    ggplot(aes(site, value)) + geom_col(aes(fill = horizon)) + labs(y = "Soil depth (cm)")+ 
    scale_fill_discrete(breaks = c("L","F","H","A","B")) 

enter image description here

+0

是的,這就是我已經猜測的堆疊行爲。由於這些土壤地平線按照定義按特定順序排列,因此我無法切換它們,即在挖掘土壤剖面時地平線A出現在地平線B之前。所以A更接近表面,然後出現B.這是否有意義? – Stefan

+0

我想實現的是以與我的傳奇相同的方式堆疊酒吧:L,F,H,A,B。因此,我的情節中圖例的順序是正確的,但我希望堆疊反映也是如此。目前它只對L,F,H做它,它轉換爲A,B。我希望我不會讓事情太複雜。 – Stefan

+0

是的,就是這樣!也許如果你能寫一兩句話來解釋發生了什麼,爲什麼,那真是太棒了! – Stefan