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
相关产品推荐
相关产品推荐

