3

我发现在我看来是集成中的一个错误,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)
4

0 回答 0