ggplot2绘制melt转换数据的水平堆叠柱状图x轴异常如何解决
问题根源
你出现该异常的核心原因是geom_col()的默认逻辑是对传入的y变量值求和,作为堆叠柱每一段的长度:
- 你将取值为1~10的
variable(位置序号)作为y映射传入,相当于第1个位置的块长度是1,第2个是2,一直到第10个块长度是10,总和就是1+2+...+10=55,这就是x轴出现超过50个刻度的原因 - B、C向量的value被映射为1、2,和Arr系列的0.x数值累加时偏差被放大,才会出现相同数量的a/b长度不一致、末尾元素更长的问题
修复方案
如果你需要每个位置的块长度一致,按value值填充颜色,推荐两种实现方式:
方式1:调整geom_col映射(符合堆叠柱状图的需求)
把y映射改为固定值1,保证每个块长度相同,提前按位置排序避免堆叠顺序错乱:
# 先按Array和位置排序,保证堆叠顺序正确 df2 <- df2 %>% arrange(Array, variable) df2 %>% ggplot(aes(x = Array, y = 1, fill = factor(value))) + geom_col(position = position_stack()) + coord_flip() + # 可选:调整y轴刻度对应1~10的位置 scale_y_continuous(breaks = 1:10, labels = 1:10, name = "位置序号")
方式2:使用geom_tile实现(更适合多分类位置展示,不易出错)
用瓷砖图直接按位置映射,每个块大小天然一致:
df2 %>% ggplot(aes(x = variable, y = Array, fill = factor(value))) + geom_tile(color = "white") + coord_flip() # 如果需要水平展示可保留,不需要可以删除
如果你需要保留value的连续数值色阶,把代码里的factor(value)改回value即可。
内容的提问来源于stack exchange,提问作者Rahil Vora
相关产品推荐
相关产品推荐

