根据数量重新排列堆积条形图中的类别

时间:2018-10-22 12:23:37

标签: r ggplot2

我想在ggplot2中生成一个堆积的条形图,其中堆栈中的条形根据该类别的计数排序。当我使用下面的代码尝试这种操作时,ggplot2似乎根据字母顺序排列了堆叠图中条形的顺序。关于Stackoverflow的其他答案表明ggplot2根据R消耗数据的顺序对条形进行排序,但是在“ a”数据框中,设备列的顺序为“ Radio”,“ Laptop”,“ TV”,“ Fridge” '(前4行),这也不是图形中显示的方式。

 library(ggplot2)
 library(tidyr)

 #some data 
 SalesData<-data.frame(Appliance=c("Radio", "Laptop", "TV", "Fridge"), ThisYear=c(5,25,5,8), LastYear=c(6,20,5,8))

 #transform the data into 'long format' for ggplot2
 a<- gather(SalesData, Sales, Total, ThisYear, LastYear)

 #Produce the bar chart
 p<-ggplot(a, aes(fill=Appliance, y=Total, x=Sales)) + 
 geom_bar( stat="identity")
 p

我想要发生的是最大数量的计数位于图的底部,因此我需要一种以这种方式对数据进行排序的方法。因此,在此示例中,其底部将是“笔记本电脑”,然后是“冰箱”,“广播”和“电视”,并为图例匹配此顺序。

有人有什么建议吗?

3 个答案:

答案 0 :(得分:2)

在绘制堆叠的条形图之前,需要重新排序因子水平。为此,有几种可能性:

以R为底

order_appliance <- unique(a$Appliance[order(a$Total)])
a$Appliance <- factor(a$Appliance, levels = order_appliance)

与dplyr

library(dplyr)
a <- a %>% 
  arrange(Total) %>% 
  mutate(Appliance = factor(Appliance, levels = unique(Appliance)))

与forcats

library(forcats)
a$Appliance <- fct_reorder(a$Appliance, a$Total)

For the plot you can use `geom_col` instead of `geom_bar(stat = "identity")`: 

ggplot(a, aes(fill = Appliance, y = Total, x = Sales)) +
  geom_col()

enter image description here

答案 1 :(得分:1)

Geom_bar使用因素创建堆栈。您可以使用factor(a$Appliance)查看数据中显示的级别。默认情况下,这些级别按字母顺序排序。但是,您可以手动设置级别的顺序,如下所示:

a$Appliance = factor(a$Appliance, levels=c("TV", "Radio", "Fridge", "Laptop"))

如果在创建ggplot之前执行此操作,则将获得所需的订单。

答案 2 :(得分:1)

我们可以基于总和对因子进行重新排序,然后进行绘制,请参见示例:

# reorder labels based on row sums
myFac <- SalesData$Appliance[ order(rowSums(SalesData[, 2:3])) ]

# wide-to-long, then reorder factor
a <- gather(SalesData, Sales, Total, ThisYear, LastYear) %>% 
  mutate(Appliance = factor(Appliance, labels = myFac, levels = myFac ))

# then plot
ggplot(a, aes(fill = Appliance, y = Total, x = Sales)) + 
  geom_bar(stat = "identity")

enter image description here