求助:修复Stacked Rank Bar Graph(堆叠排名条形图)绘制代码
问题描述
我需要绘制降序堆叠排名条形图,已有2018、2019年及现有年份的排名数据,要求:
- X轴为年份
- Y轴为用水量(water-use)
- 按行业(sectors)填充颜色并显示图例
但以下代码无法正常运行,请求协助修复。示例图为降序堆叠条形图:每个年份对应一个堆叠条形,条形按行业用水量从高到低堆叠,右侧配有行业分类图例。
报错代码
rank_use%>% ggplot(., aes(x = fct_rev(fct_infreq(year)), y = water_use, fill = sectors)) + geom_bar(position = 'stack', stat = 'identity') + theme_economist_white() + theme(axis.text.x = element_text(angle = 90), axis.text = element_text(face= "bold"),legend.position = 'right') + labs(fill = "Sectors", face="bold")+ ylab('Water Use (Thousand m3)') + xlab("Year")+ ylim(0,50000)+ theme(text=element_text(size=10, family="Arial"))+ ggtitle("Top 10 sectors by water use for 2018, 2019, and with existing year")+ theme(plot.title=element_text( hjust=0.5, vjust=0.5, face='bold'))+ theme(axis.title = element_text(face="bold"))+ theme(axis.title.x = element_text(margin = unit(c(3, 0, 0, 0), "mm")), axis.title.y = element_text(margin = unit(c(0, 3, 0, 0), "mm")), plot.title = element_text(vjust = 3))+ theme(legend.title = element_text(colour="black", size=10, face="bold"))
修复方案及代码
问题排查与解决
- 年份排序逻辑错误:
fct_rev(fct_infreq(year))是按年份出现频率倒序,而非指定的年份顺序,需手动指定年份层级。 - 依赖包未加载:
theme_economist_white()来自ggthemes包,需确保已安装并加载。 - 字体兼容性问题:
Arial字体可能在部分系统中不存在,建议移除或替换为系统可用字体。 - 数据截断风险:
ylim(0,50000)会直接删除超出范围的数据,改用coord_cartesian()仅缩放显示范围。 - 重复主题设置:合并多个
theme()调用,避免设置冲突与冗余。
修复后完整代码
# 加载依赖包 library(tidyverse) library(ggthemes) library(forcats) rank_use %>% ggplot(aes( x = factor(year, levels = c("Existing_Year", "2019", "2018")), # 自定义年份显示顺序 y = water_use, fill = sectors )) + geom_bar(position = 'stack', stat = 'identity') + theme_economist_white() + theme( axis.text.x = element_text(angle = 90), axis.text = element_text(face = "bold"), legend.position = 'right', text = element_text(size = 10), # 若需Arial字体,确保系统已安装并替换此处 plot.title = element_text(hjust = 0.5, vjust = 3, face = 'bold'), axis.title = element_text(face = "bold"), axis.title.x = element_text(margin = unit(c(3, 0, 0, 0), "mm")), axis.title.y = element_text(margin = unit(c(0, 3, 0, 0), "mm")), legend.title = element_text(colour = "black", size = 10, face = "bold") ) + labs( fill = "Sectors", y = 'Water Use (Thousand m3)', x = "Year", title = "Top 10 sectors by water use for 2018, 2019, and existing year" ) + coord_cartesian(ylim = c(0, 50000)) # 安全设置Y轴显示范围
内容的提问来源于stack exchange,提问作者RJ34
相关产品推荐
相关产品推荐

