dataframe.plot.bar(), похоже, неправильно обрабатывает индексы периода как 'x'

Я обнаружил то, что мне кажется ошибкой при интеграции между matplotlib а также pandas.DataFrame хотя может быть, я ошибаюсь.

У меня есть период времени, когда я хочу построить гистограммы с столбцами, представляющими квартальные периоды. Я хочу исправить дату начала и окончания оси, даже если мои данные не проходят полностью слева или справа от оси.

Мой фрейм данных, который я рисую, имеет периоды в качестве индекса. Я обнаружил, что, хотя в руководстве (https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.plot.bar.html) указано, что индекс принимается какx Мы видим, что ax.get_xticks() возвращается 0,1,2,.. целые числа как xticks, что означает, что я не могу легко предоставить новый max / min для шкалы.

Далее, когда я пытаюсь установить диапазон через ax.set_xticks() или ax.set_xlim() Я получаю ошибку TypeError: Axis must haveчастотаset to convert to Period.

Получается, что i) я не могу легко добавлять диапазоны тиков, так как не могу установить xбыть индексом; и ii) Я не могу использовать серию периодов (или кажется, что DateTime) в качестве входных данных для функций оси, чтобы установить диапазон, поскольку он требует частоты.

Я делаю это потому что stacked=True является допустимым вводом в py.DataFrame.plot.bar() тогда как нет интегрированного способа построения диаграмм с накоплением plt.plot() или plt.plot.bar().

Обратите внимание, я бы сделал это "долгий путь", и вопрос я) разрешен, который заставляет меня думать, его ошибка. Я все еще не могу указать свой периодidx_dts чтобы установить диапазон оси x.

Вот пример кода:

 # external modules
import pandas as pd

# create a dataframe with a long periodindex
asof = pd.datetime(2019, 12, 31)
report_freq = 'Q-NOV'
num_periods = 8

idx_dts = pd.date_range(end=asof,
                        freq=report_freq,
                        periods=num_periods,
                        name='periods')

idx_dts = idx_dts.to_period(report_freq)
idx_dts   # a period.PeriodIndex

# set a shorter dataframe not covering the full span of periods
df = pd.DataFrame({'a': (1,2,3,4), 'b': (6,7,8,9), 'c': (10,20,30,40)})
df.index = idx_dts[3:7]

# take a look at the dataframe
df

# plot as a stacked barchart
ax=df.plot.bar(stacked=True)

# notice ticks are array([0,1,2,3]) NOT the index of df as indicated
ax.get_xticks()

# labels have been taken from the index though
ax.get_xticklabels()[:]

# I want to set a wider periods axis corresponding toe idx_dts
# error: 'TypeError: Axis must have `freq` set to convert to Periods'
ax.set_xticks(idx_dts)

0 ответов

Другие вопросы по тегам