[英]How to order stacked bar plot x categories by value of one of the fill categories in ggplot2/R
[英]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.