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

如何为ggplot2中两组geom_point()添加自定义图例?

在ggplot2中为两组散点添加自定义图例

你现在的问题在于,直接给两个geom_point()指定color参数(放在aes()外面)时,ggplot会把它们当作两个独立的、无分组关联的图层,因此不会自动生成图例。要解决这个问题,有两种常用的方法,我推荐更优雅的长格式数据处理方式:

方法一:将数据转为长格式(推荐)

核心思路是把真实值lp100k和拟合值dopasowane合并到同一列,同时新增一列标记数据类型(real/fitted),然后通过aes(color = 类型列)来映射颜色,让ggplot自动识别分组并生成图例。

完整代码如下:

# 先确保加载了tidyverse(包含ggplot2和tidyr)
library(tidyverse)

samochodziki %>%
  mutate(dopasowane = model_classic$fitted.values) %>%
  arrange(lp100k) %>%
  mutate(index = 1:nrow(.)) %>%
  # 把宽格式数据转为长格式,创建值列和类型列
  pivot_longer(
    cols = c(lp100k, dopasowane),
    names_to = "data_type",
    values_to = "value"
  ) %>%
  ggplot(aes(x = index, y = value, color = data_type)) +
  geom_point() +
  # 自定义颜色和图例标签
  scale_color_manual(
    values = c("lp100k" = "red", "dopasowane" = "blue"),
    labels = c("lp100k" = "real", "dopasowane" = "fitted")
  ) +
  # 可选:修改图例的标题
  labs(color = "Data Category")

为什么这样做?

这种方式符合ggplot的“数据优先”设计逻辑,所有分组信息都包含在数据框中,代码更简洁易维护——如果后续需要添加更多组,只需要调整pivot_longer的cols参数,不需要新增geom_point()图层。

方法二:在每个图层的aes中映射color

如果你不想修改数据格式,也可以直接在每个geom_point()的aes()里指定color为对应的标签字符串,再通过scale_color_manual绑定颜色:

samochodziki %>%
  mutate(dopasowane = model_classic$fitted.values) %>%
  arrange(lp100k) %>%
  mutate(index = 1:nrow(.)) %>%
  ggplot(aes(x = index)) +
  geom_point(aes(y = lp100k, color = "real")) +
  geom_point(aes(y = dopasowane, color = "fitted")) +
  scale_color_manual(values = c("real" = "red", "fitted" = "blue"))

这种方式也能生成你需要的图例,但当分组较多时,代码会变得冗余,所以更适合只有两组的简单场景。

两种方法最终都会生成红色点标注为“real”、蓝色点标注为“fitted”的图例,你可以根据自己的习惯选择。

内容的提问来源于stack exchange,提问作者Bartłomiej Fatyga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:02:13