如何在ggplot堆叠条形图中显式设置fill变量的顺序?
解决堆叠条形图fill顺序的问题
你之前误用了scale_y_discrete来设置fill的顺序——y轴是连续数值型变量(对应你的value列),这个函数只会修改y轴的显示,和fill的堆叠顺序完全无关,反而会把连续轴强制转成离散,导致轴标签异常。
要设置堆叠部分的顺序,需要针对fill对应的分类变量(也就是Name)来操作,有两种常用方法:
方法1:直接用scale_fill_discrete指定顺序
在绘图代码里添加scale_fill_discrete(limits = names),它会直接控制fill图例和堆叠的顺序:
library(ggplot2) library(reshape2) df_dtype <- data.frame(Name = c("Jim","Bob","Sue","Sally"), Pre = c(150, 200, 325, 120), Post = c(70,120,200,100) ) mdtype <- melt(df_dtype) names = c("Jim","Bob","Sue","Sally") p <- ggplot(mdtype, aes(x=variable, y=value, fill=Name)) + geom_bar(position="stack", stat="identity") + ylab("Frequency") + xlab("") + ggtitle("Report Type") + theme(axis.ticks.x = element_blank(),axis.text.x = element_text(angle = 45, vjust = 1, hjust=1)) + scale_fill_discrete(limits = names) # 关键修改 p
方法2:将Name转为因子并指定levels
提前把Name列设置为因子,指定你想要的顺序,ggplot会自动沿用这个顺序来堆叠:
library(ggplot2) library(reshape2) df_dtype <- data.frame(Name = c("Jim","Bob","Sue","Sally"), Pre = c(150, 200, 325, 120), Post = c(70,120,200,100) ) # 将Name转为因子,指定levels顺序 df_dtype$Name <- factor(df_dtype$Name, levels = c("Jim","Bob","Sue","Sally")) mdtype <- melt(df_dtype) p <- ggplot(mdtype, aes(x=variable, y=value, fill=Name)) + geom_bar(position="stack", stat="identity") + ylab("Frequency") + xlab("") + ggtitle("Report Type") + theme(axis.ticks.x = element_blank(),axis.text.x = element_text(angle = 45, vjust = 1, hjust=1)) p
两种方法都能让堆叠部分按照Jim→Bob→Sue→Sally的顺序排列,推荐第二种,因为它从数据层面定义了分类顺序,后续其他可视化操作也能沿用这个逻辑。
内容的提问来源于stack exchange,提问作者John Conor
相关产品推荐
相关产品推荐

