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)