Pandas автоматический формат даты и времени в matplotlib - PullRequest
0 голосов
/ 27 ноября 2018

Я часто строю данные нескольких временных рядов из разных источников на одном графике, некоторые из которых требуют использования matplotlib.При форматировании оси X я использую Matplotlib autofmt_xdate(), но я предпочитаю автоматическое форматирование панд.Я знаю, что могу вручную установить формат, используя set_major_formatter(), но графики, которые я создаю, варьируются от года до дня в общем диапазоне, поэтому мне нужно будет настроить форматирование на основе каждого графика.Есть ли способ установить matplotlib для автоматического форматирования оси X с датами, похожими на панд?

Я также использую интерактивное построение графиков, а при использовании панд df.plot() ось X обновляется при масштабировании до соответствующих диапазоновкак показано ниже, чего я также хотел бы добиться с помощью matplotlib:

pandas format month pandas format day pandas format inter-day

Версии:

Python: 3.7.1
Pandas: 0.23.3
Matplotlib: 2.2.2

Требуемый формат:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

ix = pd.date_range('1/1/2017', '11/1/2018', freq='D')
vals = np.random.randn(len(ix))
df = pd.DataFrame({'Values': vals}, index=ix)

fig, ax = plt.subplots(1, 1, figsize=[8,6])
df.plot(ax=ax, lw=1)
plt.show()

desired pandas format

Текущий формат:

fig, ax = plt.subplots(1, 1, figsize=[8,6])
ax.plot(df, lw=1)
fig.autofmt_xdate()
plt.show()

Current matplotlib format

1 Ответ

0 голосов
/ 27 ноября 2018

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

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.dates import MonthLocator, YearLocator, DateFormatter

ix = pd.date_range('1/1/2017', '11/1/2018', freq='D')
vals = np.random.randn(len(ix))
s = pd.DataFrame({'Values': vals}, index=ix)

fig, ax = plt.subplots(figsize=[8,6])
ax.plot(s, lw=1)

ax.xaxis.set_major_locator(YearLocator())
ax.xaxis.set_major_formatter(DateFormatter("\n%Y"))

ax.xaxis.set_minor_locator(MonthLocator((1,4,7,10)))
ax.xaxis.set_minor_formatter(DateFormatter("%b"))

plt.show()

Если вам нужны второстепенные тики для чего-то еще, то следующие отформатируют только основные тики - с тем же результатом.Здесь вы должны использовать FuncFormatter для определения формата в зависимости от месяца.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.dates import MonthLocator, DateFormatter
from matplotlib.ticker import FuncFormatter

ix = pd.date_range('1/1/2017', '11/1/2018', freq='D')
vals = np.random.randn(len(ix))
s = pd.DataFrame({'Values': vals}, index=ix)

fig, ax = plt.subplots(figsize=[8,6])
ax.plot(s, lw=1)

monthfmt = DateFormatter("%b")
yearfmt = DateFormatter("%Y")

def combinedfmt(x,pos):
    string = monthfmt(x)
    if string == "Jan":
        string += "\n" + yearfmt(x)
    return string

ax.xaxis.set_major_locator(MonthLocator((1,4,7,10)))
ax.xaxis.set_major_formatter(FuncFormatter(combinedfmt))

plt.show()

Результат в обоих случаях одинаков:

enter image description here

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