如何将pandas DataFrame的每一行绘制成意面图样式的独立折线
问题原因
你去掉.mean()后报错是因为plt.plot()要求输入的x、y参数维度匹配:你传入的x是长度为6的频率列表,未取均值的fft_df是3行6列的二维结构,维度不匹配触发报错。
实现方案
方法1:逐行遍历绘制(逻辑清晰,可自定义单条线样式)
直接遍历DataFrame的每一行,为每个参与者单独绘制折线,可调低透明度避免多线重叠看不清:
import pandas as pd import matplotlib.pyplot as plt # 示例数据构造 data = [['1', 9.45e-09, 9.85e-09, 8.33e-09, 6.06e-09, 4.80e-09, 4.08e-09], ['2', 1.30e-08, 1.25e-08, 8.99e-09, 6.25e-09, 4.44e-09, 3.45e-09], ['3', 9.32e-09, 8.60e-09, 5.67e-09, 3.68e-09, 2.53e-09, 1.75e-09]] fft_df = pd.DataFrame(data, columns = ['id', '1','2','3','4','5','6']).set_index('id') # 把列名转为数值型,避免x轴显示顺序异常 x = fft_df.columns.astype(int) plt.figure(figsize=(10, 10)) # 逐行绘制每条折线 for user_id, row in fft_df.iterrows(): plt.plot(x, row, alpha=0.7, label=f'参与者{user_id}') # 可选:额外绘制均值线,用粗红线突出显示 plt.plot(x, fft_df.mean(), color='red', linewidth=3, label='群体均值') plt.ylabel('Absolute Power (log)',fontsize=12) plt.xlabel('Frequencies',fontsize=12) plt.legend() plt.show()
方法2:转置DataFrame直接绘制(代码更简洁)
将DataFrame转置后,每一列对应一个参与者的全频率数据,plt.plot会自动为每一列生成独立折线:
plt.figure(figsize=(10, 10)) plt.plot(x, fft_df.T, alpha=0.7) plt.ylabel('Absolute Power (log)',fontsize=12) plt.xlabel('Frequencies',fontsize=12) # 可选添加图例 # plt.legend(fft_df.index.map(lambda x: f'参与者{x}')) plt.show()
两种方法都可以实现你需要的意面图效果,参与者数量多的时候建议调低alpha参数的数值,避免折线重叠导致辨识度下降。
内容的提问来源于stack exchange,提问作者seh33
相关产品推荐
相关产品推荐

