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

R语言ggplot按相似列名对多列数据分面绘图的实现方法

使用facet_wrap实现分面折线图的解决方案

要实现你的需求,核心是先把宽格式数据转换为长格式,再提取列名的前缀作为分面依据,最后用ggplot2的facet_wrap完成分面绘图。以下是完整步骤:

1. 准备数据(还原你的数据框)

df <- data.frame(
  x1 = 1:7,
  x2 = 2:8,
  y1 = seq(1.2, 8.4, 1.2),
  z1 = seq(1.1, 7.7, 1.1),
  z2 = seq(1.4, 9.8, 1.4),
  z3 = seq(4.4, 30.8, 4.4)
)

2. 加载必要的包

需要用到数据转换、绘图和字符串处理的工具包:

library(tidyr)
library(ggplot2)
library(stringr)

3. 转换数据格式并提取分面组

把宽数据转成长数据,同时提取列名前缀作为分面的分组依据:

df_long <- df %>%
  mutate(row_id = row_number()) %>%  # 添加行号作为x轴的观测位置
  pivot_longer(
    cols = -row_id, 
    names_to = "col_name", 
    values_to = "value"
  ) %>%
  mutate(facet_group = str_extract(col_name, "^[xyz]"))  # 提取列名开头的x/y/z作为分面组

4. 绘制分面折线图

用ggplot2绘制折线图,并通过facet_wrap按前缀分面:

ggplot(df_long, aes(x = row_id, y = value, color = col_name)) +
  geom_line(linewidth = 1) +  # 设置折线粗细
  facet_wrap(~facet_group, scales = "free_y") +  # 按分面组分面,y轴自由缩放
  labs(
    x = "观测行号", 
    y = "数值", 
    color = "列名"
  ) +
  theme_bw()  # 使用简洁的主题

关键说明

  • 转换长格式是因为ggplot2更适合处理长数据,能轻松同时绘制多条折线。
  • str_extract(col_name, "^[xyz]")精准匹配列名开头的x/y/z,确保分组逻辑准确。
  • scales = "free_y"让每个分面的y轴根据自身数据范围调整,避免z组数值过大导致x/y组折线被压缩看不清。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:01:55