如何更改熊猫时间序列图的 x 刻度密度?

Posted

技术标签:

【中文标题】如何更改熊猫时间序列图的 x 刻度密度?【英文标题】:How do I change the density of x-ticks of a pandas time series plot? 【发布时间】:2015-01-30 16:01:56 【问题描述】:

我正在尝试生成一个较小的图形来可视化熊猫时间序列。但是,自动生成的 x-ticks 不适应新的大小并导致重叠的刻度。我想知道如何调整 x-ticks 的频率?例如。对于这个例子:

figsize(4, 2)

num = 3000
X = linspace(0, 100, num=num)
dense_ts = pd.DataFrame(sin(X) + 0.1 * np.random.randn(num),
                        pd.date_range('2014-01-1', periods=num, freq='min'))

dense_ts.plot()

我得到的数字是:

我可以使用 Matplotlib 日期绘图来解决这个问题,但这不是一个非常优雅的解决方案 - 代码要求我根据每个案例指定所有输出格式。

figsize(4, 2)

from matplotlib import dates

fig, ax = plt.subplots()
ax.plot_date(dense_ts.index.to_pydatetime(), dense_ts, 'b-')
ax.xaxis.set_minor_locator(dates.HourLocator(byhour=range(24),
                                           interval=12))
ax.xaxis.set_minor_formatter(dates.DateFormatter('%H:%m'))
ax.xaxis.set_major_locator(dates.WeekdayLocator())
ax.xaxis.set_major_formatter(dates.DateFormatter('\n\n%a\n%Y'))

plt.show()

我想知道是否有办法使用 pandas plotting 模块或设置一些 axes 对象属性来解决此问题?我尝试使用 ax.freq 对象,但无法真正实现任何目标。

【问题讨论】:

【参考方案1】:

你可以传递你想要在你的 dense_ts.plot() 中显示的 x 轴值列表

dense_ts.plot(xticks=['10:01','22:01'...])

为清楚起见的另一个例子

df = pd.DataFrame(np.random.randn(10,3))

不指定 xticks 绘图

df.plot(legend=False)

使用 xticks 参数绘图

df.plot(xticks=[2,4,6,8],legend=False)

【讨论】:

嗯,这很有趣。使用这个 xticks 关键字参数,我有时可以控制一些输入,但是以一种奇怪的方式 - 例如对于['00:00'],它会打印出 06:00、12:00、18:00。对于你提到的 10、22 的情况,它会永远循环。 我又加了一个例子 是的,对于整数索引,它更容易一些 - 您也可以调用 locator_params(nbins=8) 来降低密度。问题是此方法不适用于时间戳索引,此函数引发AttributeError: TimeSeries_DateLocator instance has no attribute 'set_params'

以上是关于如何更改熊猫时间序列图的 x 刻度密度?的主要内容,如果未能解决你的问题,请参考以下文章

熊猫时间序列图设置 x 轴主要和次要刻度和标签

如何更改三元图的轴刻度顺序?

熊猫条形图中的刻度标签重叠

熊猫条形图中的刻度标签重叠

如何更改 plot.zoo 图中的(数量)x 轴刻度? (轴()失败)

如何在python中更改日期时间数据的x轴刻度标签的频率