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

