Как я могу построить серию панд разной длины с помощью matplotlib? - PullRequest
1 голос
/ 21 апреля 2019

У меня есть две серии панд, одна с 7-дневным скользящим средним за весь год, а другая с среднемесячными. Я пытаюсь нанести их на одну и ту же фигуру matplotlib со средними в виде гистограммы и 7-дневным скользящим средним в виде линейного графика. В идеале линия должна быть графиком сверху гистограммы.

Проблема, с которой я столкнулся, заключается в том, что с моим текущим кодом гистограмма отображается без линейного графика, но когда я пытаюсь сначала построить линейный график, я получаю ValueError: ordinal must be >= 1.

Вот как выглядит серия:

Это первые 15 значений 7-дневного скользящего среднего ряда, у него есть дата и значение за весь год:

date
2016-01-01         NaN
2016-01-03         NaN
2016-01-04         NaN
2016-01-05         NaN
2016-01-06         NaN
2016-01-07         NaN
2016-01-08    0.088473
2016-01-09    0.099122
2016-01-10    0.086265
2016-01-11    0.084836
2016-01-12    0.076741
2016-01-13    0.070670
2016-01-14    0.079731
2016-01-15    0.079187
2016-01-16    0.076395

Это весь среднемесячный ряд:

dt_month
2016-01-01    0.498323
2016-02-01    0.497795
2016-03-01    0.726562
2016-04-01    1.000000
2016-05-01    0.986411
2016-06-01    0.899849
2016-07-01    0.219171
2016-08-01    0.511247
2016-09-01    0.371673
2016-10-01    0.000000
2016-11-01    0.972478
2016-12-01    0.326921

Вот код, который я использую для их построения:

ax = series_one.plot(kind="bar", figsize=(20,2))
series_two.plot(ax=ax)
plt.show()

Вот график, который генерирует:

The graph my code generates Любая помощь очень ценится! Кроме того, советы по форматированию этого вопроса и созданию кода для создания двух серий для минимального рабочего примера были бы замечательными.

Спасибо !!

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

Проблема в том, что графики панд являются линейными (столбцы находятся в следующих целочисленных позициях).Поскольку в вашем случае две серии имеют разное количество элементов, построение линейного графика в категориальных координатах на самом деле не вариант.Осталось только построить гистограмму в числовых координатах.Это невозможно с пандами, но это поведение по умолчанию с matplotlib.

Ниже я сдвигаю месячные даты на 15 дней до середины месяца, чтобы иметь хорошо центрированные бары.

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(42)
import pandas as pd

t1 = pd.date_range("2018-01-01", "2018-12-31", freq="D")
s1 = pd.Series(np.cumsum(np.random.randn(len(t1)))+14, index=t1)
s1[:6] = np.nan

t2 = pd.date_range("2018-01-01", "2018-12-31", freq="MS")
s2 = pd.Series(np.random.rand(len(t2))*15+5, index=t2)

# shift monthly data to middle of month
s2.index += pd.Timedelta('15 days')


fig, ax = plt.subplots()

ax.bar(s2.index, s2.values, width=14, alpha=0.3)
ax.plot(s1.index, s1.values)

plt.show()

enter image description here

0 голосов
/ 22 апреля 2019

Проблема может заключаться в том, что индексы двух серий имеют очень разные масштабы. Вы можете использовать ax.twiny для их построения:

ax = series_one.plot(kind="bar", figsize=(20,2))
ax_tw = ax.twiny()
series_two.plot(ax=ax_tw)
plt.show()

Выход:

enter image description here

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