Составление списков с разными размерами - PullRequest
1 голос
/ 07 ноября 2019

Я пытаюсь составить сюжет из четырех разных функций. три из них имеют одинаковый размер, но я не могу нанести четвертый на тот же участок, потому что он имеет меньший размер. Я уверен, что есть способ сделать это. Значения времени составляют от 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 ]

1 голос
/ 07 ноября 2019

Чтобы 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], если хотите начать со второго в списке.

1 голос
/ 07 ноября 2019

Так что эта ошибка появляется, потому что matplotlib не знает, как отобразить ваши точки данных на ваше 2D-пространство. Ожидается отображение 1: 1 - для каждого значения x есть значение yy. Для каждого входа есть выход.

    x       y
    1   →   0 
    2   →   2
    3   →   4

Этот тип отображения 1: 1 - это то, что ожидает matplotlib, когда он строит (x, y) точек в 2D-пространстве. Так как же это связано с нашей ошибкой?

Наша ошибка возникает из-за того, что получает matplotlib:

    x           y
    1   →       0 
    2   →       2
    3   →   ¯\_(ツ)_/¯

, на что отображаются наши дополнительные значения x? Ваш компьютер не имеет ни малейшего представления, поэтому возникает ошибка.

В общем, если вы знаете , что ваш набор данных полностью описывает систему, проблема заключается в интерполяции. Посмотрите библиотеку SciPy interpolation для некоторых быстрых опций. Или, может быть, нам просто нужно предоставить эти дополнительные значения для сопоставления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...