ggplot2叠加无间距柱状图:图例添加与柱子间距调整求助
嘿,这两个问题都能完美解决!我来一步步给你拆解方案:
一、缩小长格式绘图的柱子间距
你用长格式数据绘图时,柱子间距过大的核心原因并非position_dodge(width = 0),而是默认的柱子宽度和x轴留白设置。只需调整两个参数就能解决:
- 调整柱子宽度:通过
geom_bar()的width参数把柱子设得更宽,自然就能缩小柱子间的空隙(比如设为width = 0.9,接近离散轴柱子的默认宽度) - 去掉x轴两端留白:用
scale_x_discrete(expand = c(0, 0))移除x轴首尾的多余空白,让整体布局更紧凑
修改后的代码如下:
library(ggplot2) testdata <- data.frame(x = c(1:5,1:5), y = c(1:5,10:6), group = c(rep("a",5), rep("b",5))) ggplot(testdata, aes(x = x, y = y, group = group, fill = group)) + geom_bar(stat = "identity", linetype = "solid", colour = "black", position = position_dodge(width = 0), width = 0.9) + # 加宽柱子缩小间距 scale_fill_manual(values = c(NA, "darkgrey")) + scale_x_discrete(expand = c(0, 0)) # 移除x轴两端留白
这样既能保持柱子完全叠加,又能让整体布局更紧凑,完美解决间距问题。
二、给第一种宽格式绘图添加图例
第一种方法没有图例,是因为你把fill和colour设成了固定值,没有放到aes()映射里。只要把这些属性纳入映射,再手动指定颜色,就能生成清晰的图例:
修改后的代码:
library(ggplot2) testdata <- data.frame(x=c(1:5),a=c(1:5),b=c(10:6)) ggplot(testdata, aes(x = x)) + geom_bar(aes(y=b, fill = "b"), stat = "identity")+ # 将fill纳入映射,标记为"b" geom_bar(aes(y=a, colour = "a", fill = "a"), linetype="solid", stat = "identity") + scale_fill_manual(name = "组别", # 设置图例标题 values = c("a" = NA, "b" = "darkgrey")) + # 指定填充色 scale_colour_manual(name = "组别", # 保持标题一致,让两个图例合并 values = c("a" = "black", "b" = NA))
这里的关键技巧是:
- 给每个
geom_bar的aes()添加映射标签(比如"a"和"b") - 用
scale_fill_manual和scale_colour_manual统一图例标题,让ggplot自动把两个属性的图例合并成一个,完全匹配你的需求
你可以根据喜好自由调整图例标题、颜色等细节~
内容的提问来源于stack exchange,提问作者Jakob
相关产品推荐
相关产品推荐

