Matplotlib多样本时序误差图报错及Pandas绘图问题求助
时序均值曲线带误差棒绘制问题解决办法
我是Matplotlib新手,想用来替代Prism提高效率,但操作全报错。手里有个DataFrame「final」,包含163个时间点、18组三联重复样本,需要绘制每个样本的时序均值曲线,同时加上标准差误差棒。
- 用
plt.errorbar时触发ValueError: too many values to unpack (expected 1),转Numpy数组也没用; - 改用Pandas的
mean.plot(yerr=std)能出图,但没法改坐标轴;给mean加上x轴时间列并设为索引后,误差棒直接消失,还得保留每个样本的名称。
错误原因分析
- plt.errorbar报错原因:
plt.errorbar默认只接受一维的x、y数据,你传入的insert是DataFrame,mean是包含18列的多列DataFrame,直接传入会导致维度不匹配,所以报错。 - Pandas plot误差棒消失原因:
你给mean插入Elapsed列并设为索引后,mean的索引变成了时间值,但std还是原来的默认整数索引,两者结构不匹配,Pandas无法对应上误差数据,所以误差棒消失。
解决方案
方法一:用Matplotlib的plt.errorbar循环绘制每一列
把x轴数据转成一维数组,遍历mean的每一列分别绘制曲线和误差棒,同时保留样本名称作为标签:
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 假设final是你的原始DataFrame,insert是含163个时间点的DataFrame mean = final.groupby(np.arange(len(final.columns))//3, axis=1).mean() std = final.groupby(np.arange(len(final.columns))//3, axis=1).std() # 把x轴时间转成一维数组 x = insert.values.flatten() # 遍历每一列,绘制曲线和误差棒 for col_name in mean.columns: plt.errorbar(x, mean[col_name], yerr=std[col_name], label=col_name, capsize=3) # 设置坐标轴和图例 plt.xlabel("Elapsed Time") plt.ylabel("Mean Value") plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left') # 图例放外侧避免遮挡 plt.tight_layout() plt.show()
方法二:用Pandas plot同步处理索引或指定x轴
方式1:直接指定x轴(不修改原结构)
import pandas as pd import numpy as np import matplotlib.pyplot as plt mean = final.groupby(np.arange(len(final.columns))//3, axis=1).mean() std = final.groupby(np.arange(len(final.columns))//3, axis=1).std() # 直接指定x轴为时间值,传入误差棒数据 ax = mean.plot(yerr=std, x=insert.values.flatten(), capsize=3) # 修改坐标轴标签 ax.set_xlabel("Elapsed Time") ax.set_ylabel("Mean Value") plt.tight_layout() plt.show()
方式2:同步设置mean和std的索引
如果一定要把时间设为索引,需要让std和mean的索引保持一致:
# 给mean添加时间索引 mean.insert(0, "Elapsed", insert.values.flatten(), True) mean.set_index("Elapsed", inplace=True) # 给std设置和mean相同的索引 std.index = mean.index # 绘图,误差棒正常显示 ax = mean.plot(yerr=std, capsize=3) ax.set_xlabel("Elapsed Time") ax.set_ylabel("Mean Value") plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者Dogz
相关产品推荐
相关产品推荐

