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

如何用tidyr+ggplot2在多面板图中同时对比三个连续变量

解决方案

1. 先把宽表转成适合绘图的长表

用tidyr的pivot_longer()就能快速完成宽表到长表的转换,这是实现分面绘图的核心前提:

library(tidyr)
library(ggplot2)

# 示例数据(设置随机种子让结果可复现)
set.seed(123)
df <- data.frame(id=1:5,
                 feature1=runif(5),
                 feature2=runif(5,min = 3,max=5),
                 feature3=runif(5, min = 5,max=8))

# 转换为长格式
df_long <- pivot_longer(df, 
                        cols = starts_with("feature"), # 选中所有以feature开头的列
                        names_to = "feature_name", # 存原特征名称的新列
                        values_to = "feature_value") # 存特征数值的新列

2. 用ggplot2做分面图

转换后的数据可以直接结合facet_wrap()或facet_grid()生成多面板图,完美匹配你的需求:

ggplot(df_long, aes(x = id, y = feature_value)) +
  geom_line() + # 画折线展示连续向量的变化趋势
  geom_point() + # 加上数据点更直观
  facet_wrap(~ feature_name, scales = "free_y") + # 每个特征单独一个面板,y轴自由缩放适配数值范围
  labs(x = "ID", y = "特征值", title = "不同算法输出特征的分布") +
  theme_bw() # 用简洁的主题让图更清爽

如果想要像参考图那样垂直堆叠的面板,把facet_wrap()换成facet_grid(feature_name ~ ., scales = "free_y")即可。

额外说明

  • 要是你的特征列命名不是统一的featureX格式,也可以直接指定列名,比如cols = c(feature1, feature2, feature3)。
  • scales = "free_y"必须加上,因为你的三个特征数值范围差异很大,自由缩放能让每个面板的趋势都清晰展示。
  • 10k个ID的量级完全没问题,ggplot2能高效处理这种规模的数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:34:59