我发现在我看来是集成中的一个错误,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,这意味着我不能轻易地为比例提供新的最大/最小值。
此外,当我尝试设置范围时,ax.set_xticks()
或者ax.set_xlim()
我得到错误TypeError: Axis must have
频率set to convert to Period
。
因此,我似乎无法轻松添加刻度范围,因为我无法设置x
为索引;并且 ii)我不能使用一系列周期(或者似乎是 DateTime)作为轴函数的输入来设置范围,因为它需要一个频率。
我这样做是因为stacked=True
它是一个有效的输入,py.DataFrame.plot.bar()
而没有集成的方式来使用plt.plot()
or构建堆叠图表plt.plot.bar()
。
请注意,我已经完成了“漫长的道路”并且问题 i) 已解决,这让我认为这是一个错误。我仍然无法提供我的 periodindexidx_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)