如何在ggplot2中移除图例中的‘space’项,同时保留radiation与temperature之间的间隙
如何在ggplot2中移除图例中的‘space’项,同时保留radiation与temperature之间的间隙
嗨,我明白你的困扰啦——之前用添加space列的方式制造间隙,结果不小心让图例多了个多余的项,就算把它设为白色也没法从图例里删掉,对吧?其实不用这么绕,我们换个思路,直接通过调整柱子位置来实现间隙,同时彻底避免多余的图例项。
问题根源
你之前添加space = NA列再做pivot的方式,确实能造出视觉间隙,但space会被当成一个分类变量,必然出现在图例里,就算隐藏了柱子,图例项还是会存在。所以我们得换一种不需要额外加列的方法。
解决方案:分开绘制两组柱子
核心思路是把变量分成两组:precipitation和radiation为一组,temperature单独成一组,分别绘制这两组柱子,通过给第二组柱子设置x轴偏移量来制造间隙。这样既不会产生多余图例项,还能精准控制间隙大小。
修改后的完整代码
library(tidyverse) # 原始数据处理(移除多余的space列) df <- tibble( type=c('grass','forest','desert','crop'), temperature=c(0.6206,0.6132,0.6235,0.6134), precipitation=c(252,290,198,337), radiation=c(156,177,123,205) ) %>% mutate(temperature = temperature*100) # 放大temperature数值适配主坐标轴 ggplot() + # 第一组:绘制precipitation和radiation,用dodge让它们并排 geom_col( data = df %>% pivot_longer(cols = c(precipitation, radiation), names_to = 'n', values_to = 'v'), aes(x = type, y = v, fill = n), position = position_dodge(width = 0.7), # 调整并排柱子的间距 width = 0.3 # 单根柱子的宽度 ) + # 第二组:绘制temperature,通过x轴偏移制造间隙 geom_col( data = df %>% pivot_longer(cols = temperature, names_to = 'n', values_to = 'v'), aes(x = as.numeric(type) + 0.4, y = v, fill = n), # 偏移量可按需调整 width = 0.3 ) + # 设置填充颜色(对应三个目标变量,无多余项) scale_fill_manual(values = c("blue", "red", "purple")) + # 保留原有的坐标轴设置 scale_y_continuous( name = "Precipitation & Radiation", sec.axis = sec_axis(~.*0.01, name = "Temp") ) + xlab("\nType") + theme_bw(14) + theme( axis.title.y = element_text(color = "grey", size=13, face="bold"), axis.title.y.right = element_text(color = "purple", size=13, face="bold"), axis.text.x = element_text(angle = 45, vjust = 0.5, hjust=1) )
关键调整说明
- 移除
space列:从根源上避免了多余图例项的产生 - 分两组绘制柱子:把需要并排的变量和需要单独分开的变量分别处理,逻辑更清晰
- x轴偏移量控间隙:通过
as.numeric(type) + 0.4让temperature柱子向右偏移,你可以根据视觉需求调整这个数值,让间隙大小更合适 - 统一柱子宽度:确保两组柱子的视觉宽度一致,整体布局更协调
这样调整后,图例里就只会显示precipitation、radiation和temperature三个项,同时它们之间的间隙也完美保留下来了~
备注:内容来源于stack exchange,提问作者TarJae
相关产品推荐
相关产品推荐

