在R ggplot2中geom_smooth设colour="black"为何改变lm回归线?
为什么ggplot2里的回归线从多条变成了一条?
嘿,这个问题其实是ggplot2中美学映射继承规则的典型场景,我给你拆解明白:
核心原因:全局映射 vs 图层静态赋值
ggplot2的图层是有“继承关系”的——你在ggplot()函数的aes()里定义的映射,会默认传递给后面所有的图层(比如geom_point()、geom_smooth())。
第一个代码的逻辑
ggplot(Salaries, aes(x=yrs.since.phd, y=salary, color=rank))+ geom_point() + geom_smooth(method="lm", size=0.5)+ facet_grid(~sex)
这里aes(color=rank)是全局映射,geom_smooth()继承了这个规则:它会按照rank的不同分组,分别拟合线性回归线,每条线的颜色对应rank的配色,所以你看到了多条回归线。
第二个代码的变化
ggplot(Salaries, aes(x=yrs.since.phd, y=salary, color=rank))+ geom_point() + geom_smooth(method="lm", colour="black", size=0.5)+ facet_grid(~sex)
这里你给geom_smooth()直接加了colour="black"——注意这是静态赋值(固定值),不是用aes(colour=...)做的映射。当你在图层里直接设置美学属性的固定值时,会取消该属性的全局映射继承:geom_smooth()不再按照rank分组,而是把所有数据当成一个整体拟合一条回归线,颜色固定为黑色,所以就只显示一条线了。
额外小技巧:想保留分组但统一线条颜色?
如果你希望回归线还是按rank分组拟合,但所有线条都用黑色,可以手动在geom_smooth()里指定group=rank来保留分组逻辑,同时设置静态颜色:
ggplot(Salaries, aes(x=yrs.since.phd, y=salary, color=rank))+ geom_point() + geom_smooth(method="lm", group=rank, colour="black", size=0.5)+ facet_grid(~sex)
这样点仍然按rank显示不同颜色,回归线则按rank分别拟合但统一为黑色,完美兼顾两种需求~
内容的提问来源于stack exchange,提问作者Alejandro Carrera
相关产品推荐
相关产品推荐

