ggplot2中geom_bar同组多类别重叠问题的解决求助
解决ggplot2柱状图同一x值下不同分组合并的问题
这个问题我之前也碰到过!核心原因是你的msgs变量是数值类型,ggplot默认会把连续型变量的fill映射处理成渐变填充,而不是离散的分组标识,所以同一threads对应的不同msgs数据被合并到了同一根柱子里。
两种快速修正方案:
方案1:将msgs转换为因子类型
把msgs转成因子后,ggplot会自动识别它是离散分组变量,配合position="dodge"就能让同一threads下的不同msgs柱子并排显示:
library("ggplot2") exec <- data.frame( threads = c(2,4,8,16,32,64,2,4,8,16,32,64,2,4,8,16,32,64,2,4,8,16,32,64), msgs=c(100,100,100,100,100,100,400,400,400,400,400,400,1600,1600,1600, 1600,1600,1600,6400,6400,6400,6400,6400,6400), qtds=c(3778.2,6000,6000,6000,6000,6000,3756.6,7462.8,14666.2,24000,24000,24000, 3762.4,7445.4,14284.4,27869.8,55877.4,93407.4,2934,5427.4,10717.6,17214.2, 26222.2,37333.6) ) # 将msgs转换为因子 exec$msgs <- as.factor(exec$msgs) # 同时把threads也转成因子,避免x轴显示连续插值的刻度 exec$threads <- as.factor(exec$threads) ggplot(data=exec, aes(x=threads, y=qtds, fill=msgs)) + geom_bar(stat="identity", position="dodge") + # 优化图表标签,提升可读性 labs(x="线程数", y="QTDS数值", fill="消息数量", title="不同线程数与消息数量下的QTDS表现") + theme_minimal()
方案2:在aes中显式指定group=msgs
如果不想修改原始数据类型,可以在aes里强制指定分组依据为msgs,同时把fill映射也转成因子:
ggplot(data=exec, aes(x=as.factor(threads), y=qtds, fill=as.factor(msgs), group=msgs)) + geom_bar(stat="identity", position="dodge") + labs(x="线程数", y="QTDS数值", fill="消息数量", title="不同线程数与消息数量下的QTDS表现")
额外说明:
- 把
threads也转成因子是因为你的线程数是离散的取值(2、4、8...),转成因子后x轴只会显示存在的取值,不会出现连续刻度的插值(比如6、10这类不存在的线程数),更符合数据实际情况。 position="dodge"的作用就是让同一x分组下的不同fill分组柱子并排显示,这一步是必须的,你之前的代码里已经加了,但因为fill变量是连续型所以没生效。
内容的提问来源于stack exchange,提问作者retatu
相关产品推荐
相关产品推荐

