ggplot2设置legend.position移动图例至绘图区内时图例消失
问题根源
ggplot2中使用长度为2的数值向量设置legend.position时,采用的是绘图区归一化坐标,取值范围严格在0~1之间,和坐标轴上显示的实际数据数值没有关系:
- 第一个值对应x轴方向位置:0为绘图区最左侧,1为绘图区最右侧
- 第二个值对应y轴方向位置:0为绘图区最底部,1为绘图区最顶部
你代码里写的legend.position = c(1,150),y轴坐标150远超出0~1的取值范围,图例直接被渲染到绘图视口外的不可见区域,看起来就像消失了,和你用的主题、图层映射配置都没关系,之前排查的几个方向都没碰到核心问题。
修复方法
把legend.position的坐标值调整到0~1区间内,根据你想要的摆放位置微调数值即可。如果要放在绘图区内部右上角,推荐搭配legend.justification设置对齐方式,再加个半透明背景避免图例和图上的点线重叠遮挡,修改后的核心代码如下:
data %>% ggplot(aes(x= study_year, y= wtd_area, color= id, shape= id)) + theme_js() + geom_point(size= 3) + geom_line(aes(group=id), size= 1) + ylim(0,160) + scale_color_manual(values= palette) + labs(x= NULL, y= NULL, color= "Animal ID", shape= "Animal ID") + theme( # 坐标调整为0-1区间,示例为靠近右上角的位置,可自行微调数值 legend.position = c(0.88, 0.88), # 让图例的右上角对齐上述坐标点,避免图例超出绘图区边界 legend.justification = c(1, 1), # 加半透明白底,提升重叠区域辨识度 legend.background = element_rect(fill = scales::alpha("white", 0.85), color = NA) )
如果确实需要按照坐标轴实际数值(比如x=2、y=150这种真实数据坐标)放置图例,需要先提取图例的grob对象,再通过annotation_custom()按数据坐标插入,普通绘图场景用上述归一化坐标调整的方法足够,操作也更简单。
内容的提问来源于stack exchange,提问作者jstalker
相关产品推荐
相关产品推荐

