如何反转ggplot2中堆叠条形图的堆叠顺序?
如何反转ggplot2中堆叠条形图的堆叠顺序?
看起来你遇到了堆叠条形图顺序不符合预期的问题,别担心,这在ggplot2里很容易解决,我给你两种实用的处理方式:
方法一:改用长格式数据(推荐,更符合ggplot设计思路)
你现在的代码是用两个geom_bar分别绘制两组数据,这种宽格式的写法不仅繁琐,还不容易调整堆叠顺序。更规范的做法是先把数据转换成长格式(tidy data),然后用单个geom_bar处理,再通过参数直接反转堆叠顺序。
步骤如下:
- 先加载
tidyr包(如果没安装的话先运行install.packages("tidyr")),把宽格式数据转成长格式:
library(tidyr) library(ggplot2) # 将宽格式数据转换为长格式 data_long <- pivot_longer(data_2019, cols = c(CO_emissions, CO_emissionsSD), # 指定要转换的列 names_to = "Emission_Type", # 新的类别列名 values_to = "Tons") # 数值列名
- 用长格式数据绘图,通过
position_stack(reverse = TRUE)反转堆叠顺序,同时自定义颜色匹配你的需求:
COChart <- ggplot(data_long, aes(x = year, y = Tons, fill = Emission_Type)) + geom_bar(stat = "identity", position = position_stack(reverse = TRUE)) + # 自定义颜色,对应原数据的两个类别 scale_fill_manual(values = c("CO_emissions" = "green", "CO_emissionsSD" = "red")) + labs(title = "CO Emissions from Pleasants Power Plant from 2001 to 2023", x = "Year", y = "Tons") + theme_light()
这种方法的好处是后续如果要添加更多排放类型,只需要修改数据整理部分,不用重复添加geom_bar,代码更简洁易维护。
方法二:直接调整geom_bar的绘制顺序
如果你不想修改数据格式,也可以通过调换两个geom_bar的顺序来反转堆叠——因为ggplot是按绘制顺序堆叠的:先画的元素会在底层,后画的在顶层。
你现在的代码先画了绿色的CO_emissions,再画红色的CO_emissionsSD,所以绿色在下方、红色在上方。如果想反转,只需要把两个geom_bar的顺序调换即可:
COChart <- ggplot(data_2019, aes(x = year)) + # 先画红色的CO_emissionsSD,让它在底层 geom_bar(aes(y = CO_emissionsSD, fill = "red"), stat = "identity", position = "stack") + # 再画绿色的CO_emissions,让它在顶层 geom_bar(aes(y = CO_emissions, fill = "green"), stat = "identity", position = "stack") + labs(title = "CO Emissions from Pleasants Power Plant from 2001 to 2023", x = "Year", y = "Tons") + theme_light()
不过这种方法只适合类别较少的场景,数据格式不够规范,长期来看还是推荐第一种方法哦。
备注:内容来源于stack exchange,提问作者CJS
相关产品推荐
相关产品推荐

