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

如何用R为1136个样本批量绘制基于多列读数的散点图?

高效批量绘制多研究对象散点图的方案

针对你的需求,核心思路是先将宽格式数据转换为长格式,再利用分面绘图(Facet)或交互式工具批量生成并展示所有对象的散点图,无需手动绘制1000+张独立图表。

步骤1:宽表转长表

首先需要把每行的Reading1至Reading50转换为单列数据,同时生成对应的时间间隔列(15分钟递增)。假设你的数据有ID列唯一标识每个研究对象,代码如下:

import pandas as pd

# 宽表转长表
df_long = df.melt(
    id_vars='ID',  # 保留ID列作为分组依据
    var_name='Reading_Label',  # 存储原列名(如Reading1)
    value_name='Measurement'  # 存储测量值
)

# 生成时间间隔:Reading1对应0分钟,Reading2对应15分钟,以此类推
df_long['Time_Minutes'] = df_long['Reading_Label'].str.extract('(\d+)').astype(int) * 15 - 15

步骤2:批量分面绘图(静态)

使用Seaborn的FacetGrid可以将所有对象的散点图自动排列在一个画布的子图中,支持按批次保存避免画布过大:

一次性生成所有子图(适合数量较少的情况)

import seaborn as sns
import matplotlib.pyplot as plt

# 设置分面网格:按ID分组,每行放20个图,调整子图尺寸
g = sns.FacetGrid(df_long, col='ID', col_wrap=20, height=2, aspect=1.2)
# 为每个子图绘制散点图
g.map(sns.scatterplot, 'Time_Minutes', 'Measurement')

# 调整布局避免标签重叠
g.tight_layout()
# 保存为高清图片
plt.savefig('all_subjects_scatter.png', dpi=300, bbox_inches='tight')

分批次生成(针对1136个对象的最优方案)

如果一次性生成1136个子图会导致画布过大,可按批次处理:

ids = df['ID'].unique()
batch_size = 100  # 每批次处理100个对象

for idx in range(0, len(ids), batch_size):
    # 提取当前批次的ID
    batch_ids = ids[idx:idx+batch_size]
    batch_data = df_long[df_long['ID'].isin(batch_ids)]
    
    # 绘制当前批次的分面图
    g = sns.FacetGrid(batch_data, col='ID', col_wrap=10, height=2, aspect=1.2)
    g.map(sns.scatterplot, 'Time_Minutes', 'Measurement')
    g.tight_layout()
    
    # 保存批次图片
    plt.savefig(f'subjects_scatter_batch_{idx//batch_size +1}.png', dpi=300, bbox_inches='tight')
    plt.close()  # 关闭画布释放内存

步骤3:交互式绘图(便于浏览)

如果需要更灵活的查看体验(如缩放、hover查看数据、搜索特定对象),可以使用Plotly生成交互式HTML页面:

import plotly.express as px

# 生成交互式分面散点图
fig = px.scatter(
    df_long,
    x='Time_Minutes',
    y='Measurement',
    facet_col='ID',
    facet_col_wrap=20,
    height=1200,
    width=1800
)

# 保存为HTML文件,可在浏览器中打开交互查看
fig.write_html('all_subjects_scatter_interactive.html')

可选:整体趋势叠加图

若需要观察所有对象的整体趋势,可将所有散点叠加在同一图中(通过透明度避免拥挤):

plt.figure(figsize=(12, 8))
sns.scatterplot(
    data=df_long,
    x='Time_Minutes',
    y='Measurement',
    hue='ID',
    alpha=0.2,  # 设置透明度
    legend=False  # 关闭图例避免混乱
)
plt.xlabel('Time (Minutes)')
plt.ylabel('Measurement Value')
plt.title('All Subjects\' Measurements Over Time')
plt.savefig('all_subjects_overlaid_scatter.png', dpi=300)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:30:50