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

R语言如何在同一坐标系绘制不同颜色双散点图并添加区分标签

R语言同画布绘制双组时间序列散点实现方案

原代码问题说明

  • 重复调用plot()配合par(new=TRUE)的叠图逻辑会重复生成坐标轴与刻度,极易出现标签覆盖、双Y轴刻度重叠的显示异常
  • 未提前设置统一的Y轴取值范围,数值跨度更大的序列会出现点被裁切到画布外的问题
  • 未指定分组点的颜色映射规则,也没有添加分组标识,无法区分两组数据
  • 默认X轴刻度会显示完整月日信息,不符合按年份维度展示的需求

方案1:基础R原生绘图(无需安装额外拓展包)

核心逻辑是只调用一次plot()生成基础画布与第一组散点,后续用points()函数在同一坐标系叠加第二组散点,手动调整坐标轴刻度与图例即可,完整可运行代码如下:

library(lubridate)
# 构造测试数据集
df <- data.frame(date = c(20120324,20120329,20121216,20130216,20130725,20130729,20130930,20131015,20131124,20131225),
                 math=c(54,32,45,78,89,12,33,46,79,100),
                 physics=c(100,100,23,24,55,66,34,37,89,39))
df$date <- ymd(df$date)

# 提前计算Y轴整体范围,覆盖两组分数的最小、最大值
y_total_range <- range(c(df$math, df$physics))
# 绘制第一组数学成绩散点:红色实心点,隐藏默认X轴后续手动配置
plot(df$date, df$math, 
     col = "red", pch = 16,
     xlab = "年份", ylab = "分数",
     ylim = y_total_range,
     xaxt = "n")
# 同一坐标系叠加物理成绩散点:蓝色实心点
points(df$date, df$physics, col = "blue", pch = 16)
# 手动配置X轴年份刻度
x_breaks <- ymd(c("2012-01-01", "2013-01-01", "2014-01-01"))
axis(side = 1, at = x_breaks, labels = year(x_breaks))
# 左上角添加分组图例
legend("topleft", 
       legend = c("数学成绩", "物理成绩"),
       col = c("red", "blue"),
       pch = 16)

方案2:ggplot2拓展包绘图(自定义灵活度更高)

如果日常使用tidyverse生态做数据处理,可以用ggplot2实现,先将宽格式数据转为长格式后按分组映射颜色即可,代码如下:

library(lubridate)
library(ggplot2)
library(tidyr)

# 构造测试数据集
df <- data.frame(date = c(20120324,20120329,20121216,20130216,20130725,20130729,20130930,20131015,20131124,20131225),
                 math=c(54,32,45,78,89,12,33,46,79,100),
                 physics=c(100,100,23,24,55,66,34,37,89,39))
df$date <- ymd(df$date)

# 宽表转长表,适配ggplot分组绘图逻辑
df_long <- pivot_longer(df, cols = c(math, physics), 
                        names_to = "subject", values_to = "score")

ggplot(df_long, aes(x = date, y = score, color = subject)) +
  geom_point(size = 2) +
  # 手动指定两组点的对应颜色与图例标签
  scale_color_manual(values = c("math" = "red", "physics" = "blue"),
                     labels = c("数学成绩", "物理成绩")) +
  # 配置X轴按年度间隔展示,标签仅显示年份
  scale_x_date(date_breaks = "1 year", date_labels = "%Y") +
  # 设置坐标轴与图例标题
  labs(x = "年份", y = "分数", color = "科目") +
  theme_bw()

两种方案都完全满足需求:数学成绩点为红色、物理成绩点为蓝色,X轴按年份维度展示刻度,自带分组图例可清晰区分两组数据,不会出现原代码叠图导致的各类显示异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:27:34