簡體   English   中英

您如何在 ggplot 中按大小對堆疊的條形類別進行排序?

[英]How do you order stacked bar categories by size in ggplot?

我正在嘗試按變量的大小對 ggplot 條形圖中的類別重新排序,首先是最大的類別,然后是越來越小的類別。 我試過以幾種方式處理訂單,但似乎只能手動設置訂單,這對大數據集不是很有幫助。

例如:假設我有以下數據:

mydata <- read.table(header=TRUE, text="
shop    fruit   varieties   km_away
shop1   apple   0   12
                     shop1  banana  0   12
                     shop1  pear    2   12
                     shop1  melon   1   12
                     shop1  orange  1   12
                     shop1  peach   3   12
                     shop1  apricot 6   12
                     shop1  lime    1   12
                     shop2  apple   1   1
                     shop2  banana  0   1
                     shop2  pear    2   1
                     shop2  melon   2   1
                     shop2  orange  5   1
                     shop2  peach   4   1
                     shop2  apricot 11  1
                     shop2  lime    0   1
                     shop3  apple   0   2
                     shop3  banana  1   2
                     shop3  pear    2   2
                     shop3  melon   1   2
                     shop3  orange  4   2
                     shop3  peach   1   2
                     shop3  apricot 11  2
                     shop3  lime    1   2
                     shop4  apple   0   5
                     shop4  banana  0   5
                     shop4  pear    3   5
                     shop4  melon   2   5
                     shop4  orange  6   5
                     shop4  peach   1   5
                     shop4  apricot 9   5
                     shop4  lime    0   5
                     ")

我可以像這樣有用地可視化它:

library(ggplot2)
library(RColorBrewer)
p <- ggplot(data = mydata, aes(x=reorder(shop, km_away), y=varieties, fill=fruit))+
  geom_bar(stat="identity") + coord_flip()+scale_fill_brewer(palette="Accent")
p

但是我如何告訴 ggplot 先繪制杏子,然后是橙子等? 這將使在視覺上比較不同商店的不同類別變得更加容易。

您可以先獲取類別的向量,按您感興趣的數量排序:

fruit_levels <- names(sort(tapply(mydata$varieties, mydata$fruit, sum)))

然后,在調用ggplot ,將fill映射到具有相應級別的因子變量:

p <- ggplot(data = mydata, 
    aes(x=reorder(shop, km_away), y=varieties, 
        fill=factor(fruit, levels = fruit_levels)))+
  geom_bar(stat="identity") + coord_flip()+
  scale_fill_brewer(name = "fruit", palette="Accent") 
p

輸出:

在此處輸入圖片說明


更新。 更直接的方法是對原始數據ggplot的因子級別重新排序,並像在原始代碼中一樣調用ggplot

mydata$fruit <- reorder(mydata$fruit, mydata$varieties, sum)
p <- ggplot(data = mydata, aes(x=reorder(shop, km_away), y=varieties, fill=fruit))+
  geom_bar(stat="identity") + coord_flip()+scale_fill_brewer(palette="Accent")
p

更新 2.在舊版本的ggplot2 (版本 2 之前)上,嘗試指定order美學:

p <- ggplot(data = mydata, aes(x=reorder(shop, km_away), 
                               y=varieties, 
                               fill=fruit, order=fruit)) +
  geom_bar(stat="identity") + coord_flip()+scale_fill_brewer(palette="Accent")
p

如果要反轉排序,請在排序變量前添加一個負號:

reorder(mydata$fruit, -mydata$varieties, sum)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM