我想在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
我想要发生的是最大数量的计数位于图的底部,因此我需要一种以这种方式对数据进行排序的方法。因此,在此示例中,其底部将是“笔记本电脑”,然后是“冰箱”,“广播”和“电视”,并为图例匹配此顺序。
有人有什么建议吗?
答案 0 :(得分:2)
在绘制堆叠的条形图之前,需要重新排序因子水平。为此,有几种可能性:
order_appliance <- unique(a$Appliance[order(a$Total)])
a$Appliance <- factor(a$Appliance, levels = order_appliance)
library(dplyr)
a <- a %>%
arrange(Total) %>%
mutate(Appliance = factor(Appliance, levels = unique(Appliance)))
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()
答案 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")