使用grid.arrange时ggplot2多图例对齐异常问题
我太懂这种烦恼了——想把散点和拟合线的颜色图例分开,结果要么图例挤在一起错位,要么干脆合并成一个分不清对应关系。别急,咱们有两种靠谱的方法解决这个问题,一种用专门的包简化操作,另一种不用额外包手动调整,都能搞定对齐和图例拆分的需求。
首先先补全你的示例数据(方便咱们直接跑代码测试):
library(ggplot2) set.seed(123) # 固定随机数,保证结果一致 StudyResults <- data.frame( TreatmentArm = rep(c("A", "B"), each = 10), SubjectID = rep(1:10, 2), Glucose = c(rnorm(10, 100, 10), rnorm(10, 110, 10)), Time = rep(1:10, 2) )
方法1:用ggnewscale快速拆分颜色图例(推荐)
这个包的核心作用就是允许在同一个ggplot里添加多个同类型的美学比例尺(比如多个color比例尺),完美解决咱们要分开散点和线条图例的需求,对齐也非常好控制:
library(ggnewscale) ggplot(StudyResults, aes(x = Time, y = Glucose)) + # 第一步:画散点,设置散点专属的颜色图例 geom_point(aes(color = TreatmentArm), size = 3) + scale_color_manual(name = "散点(分组)", values = c("A" = "blue", "B" = "red")) + # 关键:添加新的颜色比例尺,后续的元素会用这个新的比例尺 new_scale_color() + # 第二步:画拟合回归线,设置线条专属的颜色图例 geom_smooth(aes(color = TreatmentArm), method = "lm", se = FALSE, linewidth = 1.2) + scale_color_manual(name = "拟合回归线(分组)", values = c("A" = "darkblue", "B" = "darkred")) + # 调整图例位置和对齐方式,让两个图例垂直整齐排列 theme( legend.position = "right", # 图例放右侧 legend.box = "vertical", # 图例垂直排列 legend.box.just = "top", # 顶部对齐 legend.spacing.y = unit(0.5, "cm") # 可以调整两个图例之间的间距 )
方法2:不用额外包,手动拆分图例
如果你不想安装新包,也可以通过手动指定线条颜色+自定义图例的方式实现:
ggplot(StudyResults, aes(x = Time, y = Glucose)) + # 先画散点,保留散点的颜色图例 geom_point(aes(color = TreatmentArm), size = 3) + scale_color_manual(name = "散点(分组)", values = c("A" = "blue", "B" = "red")) + # 分别画两组的拟合线,手动指定颜色(不用aes映射) geom_smooth(data = subset(StudyResults, TreatmentArm == "A"), method = "lm", se = FALSE, color = "darkblue", linewidth = 1.2) + geom_smooth(data = subset(StudyResults, TreatmentArm == "B"), method = "lm", se = FALSE, color = "darkred", linewidth = 1.2) + # 手动创建拟合线的图例,通过override.aes指定线条样式和颜色 guides( color = guide_legend(order = 1), # 散点图例排第一 line = guide_legend( name = "拟合回归线(分组)", override.aes = list(color = c("darkblue", "darkred")), labels = c("A", "B"), order = 2 # 线条图例排第二 ) ) + # 同样调整图例对齐 theme( legend.position = "right", legend.box = "vertical", legend.box.just = "top" )
两种方法都能实现你要的“拆分颜色图例、明确区分散点和拟合线”的效果,而且通过theme里的参数可以轻松控制图例的对齐方式和间距,再也不会出现错位的问题啦~
内容的提问来源于stack exchange,提问作者shirewoman2
相关产品推荐
相关产品推荐

