【问题标题】:Plotting multiple data sets as one average and adding error bars- matplotlib将多个数据集绘制为一个平均值并添加误差线-matplotlib
【发布时间】:2021-12-22 19:06:44
【问题描述】:

我需要分析一些在实验室中获取的数据,但这超出了我有限的编程技能。我有多组类似的数据,我需要取所有这些数据的平均值并用误差线绘制。这个想法是绘制光信号的面积(由光电倍增管记录)与发射光信号的漫射器的角度。为了收集数据,扩散器从 -60 度旋转到 60 度,每 3 度停止一次,以便光电倍增管 (PMT) 记录区域光波形。我有三组单独的数据,看起来像 PMT =(角度,面积)。 (忽略二极管数据。用于标准化 PMT 的面积值,所以基本上绘制的是 PMT =(角度,标准化面积。))而不是一个图中的三个单独的图(如附图所示)我需要将它们全部绘制为三个数据集的平均值,并用误差线显示数据集之间的偏差。先感谢您!这是我的代码:

 from pathlib import Path
 import numpy as np
 import matplotlib.pyplot as plt 
 import matplotlib as mpl

 PMT1 = ([-60,-57,-54,-51,-48,-45,-42,-39,-36,-33,-30,-27,-24,-21,-18,-15,-12,-9,-6,-3,0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60],[6.751,7.115,7.40,7.646,7.839,8.101,8.319,8.452,8.843,8.954,9.202,9.270,9.521,9.612,9.632,9.740,9.928,9.991,10.06,10.11,10.13,10.07,9.998,10.08,9.952,9.847,9.668,9.413,9.465,9.322,9.017,8.815,8.716,8.385,8.257,8.093,7.880,7.623,7.477,7.379,6.968])

 diode1 = ([-60,-57,-54,-51,-48,-45,-42,-39,-36,-33,-30,-27,-24,-21,-18,-15,-12,-9,-6,-3,0,3,6,9,12,15,18,21 
,24,27,30,33,36,39,42,45,48,51,54,57,60],[0.01021,0.01016,0.01020,0.01011,0.01013,0.01019,0.01015,0.01020,0.01022,0.01027,0.01037,0.01024,0.010170,0.01028,0.01022,0.01032,0.01026,0.01028,0.01022,0.01026,0.01036,0.01033,0.01021,0.01036,0.01030,0.01012,0.01014,0.01024,0.01019,0.01020,0.01028,0.01035,0.01021,0.01023,0.01017,0.01017,0.01025,0.01026,0.01011,0.01017,0.01006])


 PMT2 = ([-60,-57,-54,-51,-48,-45,-42,-39,-36,-33,-30,-27,-24,-21,-18,-15,-12,-9,-6,-3,0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60],[7.012,7.157,7.420,7.587,7.867,8.070,8.271,8.473,8.836,9.114,9.228,9.392,9.462,9.592,9.688,9.798,9.945,9.892,10.03,9.869,10.19,10.06,9.928,9.988,9.850,9.753,9.601,9.589,9.459,9.302,9.078,8.960,8.744,8.596,8.415,8.096,8.002,7.757,7.498,7.276,6.973])

 diode2 = ([-60,-57,-54,-51,-48,-45,-42,-39,-36,-33,-30,-27,-24,-21,-18,-15,-12,-9,-6,-3,0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60],[0.009975,0.01014,0.01018,0.01016,0.01019,0.01010,0.01029,0.01029,0.01027,0.01028,0.01031,0.01016,0.01012,0.01038,0.01022,0.01037,0.01029,0.01020,0.01031,0.01041,0.01030,0.01031,0.01019,0.01031,0.01034,0.01027,0.01033,0.01037,0.01024,0.01026,0.01032,0.01035,0.01034,0.01022,0.01025,0.01007,0.01004,0.01024,0.01012,0.01023,0.01014])

 PMT4 = ([-60,-57,-54,-51,-48,-45,-42,-39,-36,-33,-30,-27,-24,-21,-18,-15,-12,-9,-6,-3,0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60],[7.043,7.222,7.462,7.746,7.974,8.181,8.285,8.542,8.731,8.824,8.994,9.103,9.258,9.473,9.579,9.792,9.797,9.999,10.03,10,9.914,9.943,9.914,9.884,9.7813,9.676,9.502,9.440,9.245,9.272,9.091,8.858,8.761,8.397,8.225,8.007,7.862,7.725,7.367,7.149,6.938])

 diode4 = ([-60,-57,-54,-51,-48,-45,-42,-39,-36,-33,-30,-27,-24,-21,-18,-15,-12,-9,-6,-3,0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60],[0.01001,0.01001,0.01005,0.01017,0.01002,0.01003,0.009996,0.01015,0.01005,0.01021,0.01014,0.01016,0.01019,0.01014,0.01022,0.01021,0.01018,0.01015,0.01022,0.01030,0.01003,0.01015,0.01010,0.01022,0.01020,0.01021,0.01018,0.01006,0.01012,0.01006,0.01007,0.01012,0.01008,0.01003,0.01010,0.01012,0.01006,0.01009,0.01001,0.01004,0.009927])



 angle1 = np.array(PMT1[0])
 area1 = np.array(PMT1[1])
 p1 = np.array(diode1[1])
 plt.plot(angle1,area1*np.mean(p1)/p1)

 angle2 = np.array(PMT2[0])
 area2 = np.array(PMT2[1])
 p2 = np.array(diode2[1])
 plt.plot(angle2,area2*np.mean(p2)/p2)

 angle4 = np.array(PMT4[0])
 area4 = np.array(PMT4[1])
 p4 = np.array(diode4[1])
 plt.plot(angle4,area4*np.mean(p4)/p4)


 plt.show()

【问题讨论】:

    标签: python matplotlib array-combine


    【解决方案1】:

    您可以在 NumPy 中进行必要的计算,然后绘制结果。

    为了有效地做到这一点,我首先将所有面积值组合成一个带有np.vstack 的二维数组。然后,您可以使用 axis=0 在该数组上调用适当的 NumPy 方法来计算各种测量系列之间的平均值等。

    三个系列的角度值都相同,因此我们可以始终使用angle1

    “误差线”是一个模棱两可的术语,因此您必须决定误差线应该代表什么。在下面的代码中,我选择显示 +/- 一个样本标准差。在任何情况下,您都可以使用plt.fill_between 将这些值的系列绘制为误差带。

    assert (angle1 == angle2).all()
    assert (angle1 == angle4).all()
    
    area1_norm = area1 * np.mean(p1) / p1
    area2_norm = area2 * np.mean(p2) / p2
    area4_norm = area4 * np.mean(p4) / p4
    
    areas = np.vstack([area1_norm, area2_norm, area4_norm])
    means = areas.mean(axis=0)
    stds = areas.std(axis=0, ddof=1)
    
    plt.plot(angle1, means)
    plt.fill_between(angle1, means - stds, means + stds, alpha=0.3)
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-22
      • 2016-06-07
      • 1970-01-01
      • 2019-12-04
      相关资源
      最近更新 更多