我正在尝试绘制四种不同功能的图表。他们中的三个共享相同的大小,但我无法在同一块上绘制第四个,因为它的大小较小。我相信有办法做到这一点。时间值为0到10小时。前三个函数每小时都有一个值(1,2,...,10)。但是最后一个函数值只是每两个小时(2,4,6,8,10)
这是我尝试应用于数据的内容:
plt.plot(time, ut_values, label='u(t)')
plt.plot(time, gt_values, label='g(t)')
plt.plot(time, ht_values, label='h(t)')
plt.plot(time, Un_values, label='Un')
plt.title('Response functions of a linear reservoir')
plt.xlabel('Time (h)')
plt.ylabel('Output rate')
plt.grid(which='both',linestyle='--')
plt.legend(loc='upper left')
plt.show()
我只能在没有第四个函数(Un)的情况下生成图,这是我添加最后一个函数时遇到的错误:
ValueError: x and y must have same first dimension, but have shapes (11,) and (6,)
答案 0 :(得分:1)
所以出现此错误是因为matplotlib不知道如何将数据点映射到2D空间。期望1:1映射-每个x值都有一个y值。对于每个进场,都有一个进场。
x y
1 → 0
2 → 2
3 → 4
matplotlib在2D空间中绘制(x,y)点时会期望这种1:1映射。那么这与我们的错误有什么关系?
出现错误是因为matplotlib正在获取:
x y
1 → 0
2 → 2
3 → ¯\_(ツ)_/¯
我们的额外x值映射到什么?您的计算机不知道,因此出错。
通常,如果您知道您的数据集完整地描述了系统,那么问题就在于插值之一。有关一些快速选项,请参见SciPy的interpolation库。或者,也许我们只需要提供这些额外的值即可进行映射。
答案 1 :(得分:1)
为了使matplotlib知道每个Un_values
与哪个时间戳相对应,两个都需要具有相同的长度。
例如,如果所有Un_values
都属于最后一个时间戳:
plt.plot(time[len(time)-len(Un_values):], Un_values, label='Un')
其中[len(time)-len(Un_values):]
表示时间片跳过第一个时间戳并一直运行到结束。
如果所有Un_values
都属于第一个时间戳:
plt.plot(time[0:len(Un_values)-len(time)], Un_values, label='Un')
其中len(Un_values)-len(time)
是一个负数,表示末尾要省略多少时间戳。
评论后更新:
所有Un_values
都属于第二个时间戳时,从列表中的第一个开始:
plt.plot(time[::2], Un_values, label='Un')
如果要从列表中的第二个开始,请使用time[1::2]
。