2017-09-13 72 views
3

我有這個ggplot:不同的填充訂單

pic

我想要做的是改變的cat2順序在每個不同的cat1 -category遞減的順序share

  • 對於CAT1 == Z:i將是第一位的,因爲它在cat1最大的份額,其次是k,然後j
  • 對於CAT1 == Y:j將是第一位的,因爲它在cat1最大的份額,其次是hkfg
  • 等所有CAT1類別。

我知道我可以通過定義因子水平來控制順序,但是由於我需要不同的cat1類別中的不同順序,所以我不確定如何執行此操作。

有人能夠啓發我嗎?


df <- structure(list(cat2 = c("i", "k", "j", "h", "g", "j", "h", "k", 
"f", "g", "j", "h", "k", "f", "g", "i", "k", "j", "h", "f"), 
    cat1 = c("Z", "Z", "Z", "Z", "Z", "Y", "Y", "Y", "Y", "Y", 
    "X", "X", "X", "X", "X", "W", "W", "W", "W", "W"), share = c(0.254318086442458, 
    0.217254586570476, 0.13303361614456, 0.107317457057957, 0.0796390207719751, 
    0.255762968963295, 0.198921069216629, 0.177295815678624, 
    0.100770340584133, 0.0971042138291394, 0.222007778896866, 
    0.177174367182501, 0.156891912894117, 0.097677432116308, 
    0.0975337223454565, 0.503295513011454, 0.154491050393999, 
    0.114284166914891, 0.0802892036069214, 0.0549053589320047 
    ), pos = c(0.477447245936265, 0.108627293285238, 0.283771394642756, 
    0.658265017686473, 0.751743256601439, 0.305177300160272, 
    0.532519319250233, 0.088647907839312, 0.779469237979754, 
    0.680531960773118, 0.26789580234255, 0.467486875382234, 0.0784459564470585, 
    0.702446497377094, 0.604840920146212, 0.520422973814617, 
    0.0772455251969995, 0.211633133851444, 0.812215332123805, 
    0.879812613393268)), .Names = c("cat2", "cat1", "share", 
"pos"), class = "data.frame", row.names = c(NA, -20L)) 

library(ggplot2) 
ggplot(df, aes(cat1, share)) + 
    geom_bar(stat = "identity", aes(fill = cat2)) + 
    geom_text(aes(label = cat2, y = pos)) + 
    coord_flip() 

注:我目前的想法是,或許可以使用帶有設置爲1,第2,第3,第4,第5級別的新類別來完成,但如果我用的填充,例如i對於Zj的不同cat2值(例如i對於Y將具有相同的填充顏色,因爲它們在我不想要的相應cat1類別中是第一的。

+1

[訂購通過尺寸堆疊在一個堆疊GGPLOT2條形圖]的可能的複製(https://stackoverflow.com/questions/9227389/ordering-stacks-by-size-in-a -ggplot2-stacked-bar-graph) – Mako212

+0

@ Mako212,謝謝你的鏈接。我可能是錯的,但不會定義一個「靜態」的順序,將以同樣的方式應用在所有堆積的酒吧? –

回答

3

您可以通過創建一個新的因子列,我們稱之爲cat3,基於cat1cat2。根據cat1share設置此列的因子排序。然後使用這個新的cat3因子列作爲group唯美性來設置條的堆疊順序。

在下面的代碼中,arrange設置了排序。我們在cat1的每個級別內分別排列數據幀share。現在數據框是按照我們想要的順序。然後我們通過粘貼cat1cat2創建cat3,並將級別的順序設置爲數據幀的當前排序順序。最後,在ggplot內,我們使用cat3作爲group唯美性來設置geom_bar中的堆疊順序。

另一個補充是使用position_stack(vjust=0.5)來設置標籤的位置,而不是y美學。

library(tidyverse) 

df %>% 
    arrange(cat1, share) %>% 
    mutate(cat3 = factor(paste(cat1, cat2), levels=paste(cat1, cat2))) %>% 
    ggplot(aes(cat1, share, group=cat3)) + 
    geom_bar(stat = "identity", aes(fill = cat2)) + 
    geom_text(aes(label = cat2), position=position_stack(vjust=0.5)) + 
    coord_flip() 

enter image description here

+0

完美,謝謝! (也用於介紹'position_stack') –