我现有的代码可以简化为:
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
转换为可以使用的内容?
答案 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%似乎太多了。)