Построение двух списков matplotlib разной длины с одинаковым значением x - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть два numpy.ndarrays, bcmonthly и dailyavg.

bcmonthly has a length of 12 and shape of (12,)

dailyavg has a length of 364 and shape of (364,)

bcmonthy - это среднемесячное значение, а dailyavg - это среднесуточное значение.Я хочу построить две переменные относительно оси X за 12 месяцев.

Печать bcmonthly не имеет проблем, потому что его форма равна 12. Однако, когда я одновременно строю dailyavg, я получаю эту ошибку:

ValueError: x and y must have same first dimension, but have shapes (12,) and (364,)

Ниже мой код:

fig = plt.figure()  
ax1=fig.add_subplot(111)
ax1.plot(months,bcmonthly,'r') #months is a list months=['jan','feb',..etc]
ax2 = ax1.twinx()
ax2.plot(months, dailyavg)   
plt.show()

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Если вы хотите построить среднесуточные значения на одном и том же графике с месячными средними значениями, может быть проще построить два массива и сопоставить их оба с массивом дней, а затем самостоятельно обрабатывать метки.Примерно так:

import matplotlib.pyplot as plt
import numpy as np

bcmonthly = np.random.rand(12)    # Creates some random example data,
dailyavg = np.random.rand(365)    # use your own data in place of this
days = np.linspace(0, 364, 365)
months = ['January', 'February', 'March', 'April', 'May',
          'June', 'July', 'August', 'September',
          'October', 'November', 'December']

lmonths = [0, 2, 4, 6, 7, 9, 11]
smonths = [3, 5, 8, 10]
month_idx = list()
idx = -15      # Puts the month avg and label in the center of the month
for jj in range(len(months)):
    if jj in lmonths:
        idx += 31
        month_idx.append(idx)
    elif jj in smonths:
        idx += 30
        month_idx.append(idx)
    elif jj == 1:
        idx += 28
        month_idx.append(idx)

fig = plt.figure(figsize=(10,4), dpi=300)  
plt.plot(month_idx,bcmonthly,'r')
plt.plot(days, dailyavg, ':', linewidth=1)
plt.xlim([-1,366])
plt.title("Monthly and Daily Averages")
plt.xticks(month_idx, months, rotation=45)
plt.show()

Что дает вам Daily and Monthly averages

В качестве альтернативы вы можете использовать объектно-ориентированный подход ax.plot(), но для этого требуетсяУкажите метки и позиции тиков отдельно,

import matplotlib.pyplot as plt
import numpy as np

bcmonthly = np.random.rand(12)
dailyavg = np.random.rand(365)
days = np.linspace(0, 364, 365)
months = ['January', 'February', 'March', 'April', 'May',
          'June', 'July', 'August', 'September',
          'October', 'November', 'December']

lmonths = [0, 2, 4, 6, 7, 9, 11]
smonths = [3, 5, 8, 10]
month_idx = list()
idx = -15      # Puts the month avg and label in the center of the month
for jj in range(len(months)):
    if jj in lmonths:
        idx += 31
        month_idx.append(idx)
    elif jj in smonths:
        idx += 30
        month_idx.append(idx)
    elif jj == 1:
        idx += 28
        month_idx.append(idx)

fig = plt.figure(figsize=(10,4), dpi=300)  
ax1 = fig.add_subplot(111)
ax1.plot(month_idx,bcmonthly,'r')
ax2 = ax1.twinx()
ax2.plot(days, dailyavg, ':', linewidth=1)
plt.xlim([-1,366])
plt.title("Monthly and Daily Averages")
ax1.set_xticklabels(months, rotation=45)
ax1.set_xticks(month_idx)
plt.show()
0 голосов
/ 06 февраля 2019

При построении графика months против dailyavg вам необходимо расширить months, чтобы иметь длину 364 - Matplotlib не может решить, какое из 12 значений x в months назначить каждому из 364 дневных среднихк, но вы можете предоставить эту информацию самостоятельно, составив список значений x соответствующей длины.

Итак, в этом случае кажется, что это будет означать создание списка, содержащего "January" 31 раз,затем "February" 28 раз и так далее ... пока не наберете длину 364 (в зависимости от того, какой день пропущен?)

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