You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ggplot图例中调整点与线的堆叠顺序(绘图顺序不变)

问题说明

现在有一段ggplot代码,先画散点再画折线:

ggplot(mtcars)+
 geom_point(aes(x=mpg,y=disp,color=factor(cyl)),fill='white',shape=21)+
 geom_line(aes(x=mpg,y=disp,color=factor(cyl)))

因为绘图顺序是先点后线,图例里的折线会盖在散点上面。现在要保持先点后线的绘图顺序不变,只调整图例,让散点显示在折线上方,达到和先画折线再画散点的代码生成的图例一样的效果:

ggplot(mtcars)+
 geom_line(aes(x=mpg,y=disp,color=factor(cyl)))+
 geom_point(aes(x=mpg,y=disp,color=factor(cyl)),fill='white',shape=21)
解决办法

你可以通过自定义图例的绘制逻辑,让图例里先画折线再画散点,这样散点自然就会在折线上方。具体代码如下:

ggplot(mtcars)+
 geom_point(aes(x=mpg,y=disp,color=factor(cyl)),fill='white',shape=21)+
 geom_line(aes(x=mpg,y=disp,color=factor(cyl)))+
 guides(color = guide_legend(
   key_glyph = function(data, params, size) {
     # 先绘制折线的图例标记
     line_mark <- draw_key_path(data, params, size)
     # 再绘制散点的图例标记
     point_mark <- draw_key_point(data, params, size)
     # 把两个标记组合,散点叠在折线上面
     grid::grobTree(line_mark, point_mark)
   }
 ))

内容的提问来源于stack exchange,提问作者happysillycat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:46:03