绘制具有不同大小的列表

时间:2019-11-07 00:26:38

标签: python matplotlib

我正在尝试绘制四种不同功能的图表。他们中的三个共享相同的大小,但我无法在同一块上绘制第四个,因为它的大小较小。我相信有办法做到这一点。时间值为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,)

2 个答案:

答案 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]