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

如何为DataFrame列类别创建子图及绘制测量值唯一值折线图

为DataFrame类别列创建子图的解决方案

一、修正你的折线图代码

你的代码核心问题是未按measurement的值筛选对应数据,每次都绘制了全量的time和value。以下是修正后的可运行代码:

import pandas as pd
import matplotlib.pyplot as plt

# 读取CSV,header=3表示从第4行读取表头
df = pd.read_csv('test.csv', header=3)
# 将time列转为datetime类型,保证时间轴排序正确
df['time'] = pd.to_datetime(df['time'])

# 获取measurement的唯一值,用unique()保留原数据中的顺序
measures = df['measurement'].unique()

for j in measures:
    # 筛选当前measurement对应的数据子集
    subset = df[df['measurement'] == j]
    # 创建新画布
    plt.figure(figsize=(8, 4))
    # 绘制折线图并添加标签
    plt.plot(subset['time'], subset['value'], label=j)
    plt.title(f'Measurement: {j}')
    plt.xlabel('Time')
    plt.ylabel('Value')
    plt.legend()
    # 旋转x轴标签避免重叠
    plt.xticks(rotation=45)
    plt.tight_layout()
    plt.show()

二、通用的类别子图创建方法

如果希望将所有子图放在同一个画布中展示(而非逐个弹出),可以用以下几种方式实现:

方法1:Matplotlib手动创建子图网格

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('test.csv', header=3)
df['time'] = pd.to_datetime(df['time'])
measures = df['measurement'].unique()

# 设置子图布局:2列,行数根据类别数量向上取整
n_cols = 2
n_rows = (len(measures) + n_cols - 1) // n_cols

# 创建画布和子图对象
fig, axes = plt.subplots(n_rows, n_cols, figsize=(12, 4*n_rows))
# 将子图数组转为一维,避免单行列数的索引问题
axes = axes.flatten()

for idx, measure in enumerate(measures):
    subset = df[df['measurement'] == measure]
    ax = axes[idx]
    ax.plot(subset['time'], subset['value'])
    ax.set_title(f'Measurement: {measure}')
    ax.set_xlabel('Time')
    ax.set_ylabel('Value')
    ax.tick_params(axis='x', rotation=45)

# 隐藏多余的空白子图(如果类别数量不是列数的整数倍)
for ax in axes[len(measures):]:
    ax.axis('off')

plt.tight_layout()
plt.show()

方法2:Pandas Groupby一键绘图

利用Pandas的groupby功能可以更简洁地生成子图:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('test.csv', header=3)
df['time'] = pd.to_datetime(df['time'])

# 按measurement分组,每个组单独绘制折线图
df.groupby('measurement').plot(x='time', y='value', subplots=True, figsize=(8, 4*len(measures)), legend=True)
plt.tight_layout()
plt.show()

方法3:Seaborn分面绘图

如果使用Seaborn库,可以快速生成规整的分面子图:

import pandas as pd
import seaborn as sns

df = pd.read_csv('test.csv', header=3)
df['time'] = pd.to_datetime(df['time'])

# 创建按measurement分面的折线图,col_wrap控制每行显示的子图数量
sns.relplot(data=df, x='time', y='value', col='measurement', kind='line', col_wrap=2, height=4)
plt.tight_layout()
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:38:23