在python matplotlib中绘制公差栏

时间:2018-08-16 13:01:58

标签: python matplotlib

我现有的代码可以简化为:

import matplotlib.pyplot as plt

ref = [(0.0, 151.6875), (0.011, 151.75), (0.022, 151.75), (0.031, 151.625), (0.042, 151.625), (0.052, 151.6875), (0.061, 151.625), (0.073, 151.6875), (0.08, 151.625)]
res = [(0.0, 151.879), (0.01, 151.881), (0.02, 151.882), (0.03, 151.884), (0.04, 151.886), (0.05, 151.887), (0.06, 151.889), (0.07, 151.891), (0.08, 151.892)]

plt.plot(*zip(*res), 'g')
plt.plot(*zip(*ref), 'b')

plt.show()

不幸的是,我对pyton的理解不够深刻,无法理解加星号的表达式或zip函数,但是它似乎将X值分为一个元组,而Y值分为一个元组。

我想在ref周围添加10%的公差线。我知道这应该可行:

plt.fill_between(x, y * 0.9, y * 1.1)

但是我不知道如何将ref和res转换为x和y。我尝试过:

ref_x, ref_y = zip(*ref)
plt.fill_between(ref_x, ref_y * 0.9, ref_y * 1.1)
  

TypeError:无法将序列乘以'float'类型的非整数。

我已经尝试过:

for point in ref :
    plt.fill_between(point[0], point[1] * 0.9, point[1] * 1.1)
  

TypeError:未调整大小的对象的len()

如何将ref转换为可以使用的内容?

2 个答案:

答案 0 :(得分:2)

您可以使用ref_y;这是一个清单。要用纯python中的常量乘以一个列表,您需要将该列表中的每个元素与此常量new_data = [x*0.9 for x in old_data]乘以。

更简单的解决方案是立即使用numpy数组。

import matplotlib.pyplot as plt

ref = [(0.0, 151.6875), (0.011, 151.75), (0.022, 151.75), (0.031, 151.625), (0.042, 151.625), (0.052, 151.6875), (0.061, 151.625), (0.073, 151.6875), (0.08, 151.625)]
res = [(0.0, 151.879), (0.01, 151.881), (0.02, 151.882), (0.03, 151.884), (0.04, 151.886), (0.05, 151.887), (0.06, 151.889), (0.07, 151.891), (0.08, 151.892)]

ref = np.array(ref)
res = np.array(res)

plt.plot(ref[:,0], ref[:,1], 'g')
plt.plot(res[:,0], ref[:,1], 'b')

plt.fill_between(ref[:,0], ref[:,1] * 0.9, ref[:,1] * 1.1)

plt.show()

答案 1 :(得分:1)

我认为有两种可能的解决方案:

首先,创建两个列表作为上限和下限,并使用fill_between。之所以不能直接乘以0.9和1.1是因为zip返回tuple。即使使用list(ref_y)将其转换为列表,也不能像使用数组那样一次将列表中的每个元素乘以整数/浮点数。

lim_down = [0.9*i for i in ref_y]
lim_up = [1.1*i for i in ref_y]
plt.fill_between(ref_x, lim_down, lim_up)

第二,将y值转换为数组,使您可以将它们简单地乘以0.9和1.1,这将应用于每个元素。

plt.fill_between(ref_x, np.array(ref_y) * 0.9, np.array(ref_y) * 1.1)

输出(错误区域/填充区域现在覆盖了分辨率,因为在这种情况下10%似乎太多了。)

enter image description here