Pandas时间序列绘图设置x轴的主要和次要刻度以及标签。
Pandas时间序列绘图设置x轴的主要和次要刻度以及标签。
我想要能够设置从Pandas时间序列对象绘制的时间序列图的主要和次要xticks及其标签。Pandas 0.9的“新内容”页面上说:\n“您可以使用to_pydatetime或为Timestamp类型注册转换器。”\n但是我无法弄清楚如何做到这一点,以便我可以使用matplotlib的ax.xaxis.set_major_locator
和ax.xaxis.set_major_formatter
(以及次要)命令。\n如果我在不转换pandas时间的情况下使用它们,x轴的刻度和标签就会出错。\n通过使用\'xticks\'参数,我可以将主要刻度传递给pandas的.plot
,然后设置主要刻度标签。我无法弄清楚如何使用这种方法设置次要刻度(我可以设置pandas的.plot
默认次要刻度上的标签)。\n以下是我的测试代码:\n
具有奇怪日期的x轴的图表
\n
import pandas as pd import matplotlib.dates as mdates import numpy as np dateIndex = pd.date_range(start='2011-05-01', end='2011-07-01', freq='D') testSeries = pd.Series(data=np.random.randn(len(dateIndex)), index=dateIndex) ax = plt.figure(figsize=(7,4), dpi=300).add_subplot(111) testSeries.plot(ax=ax, style='v-', label='first line') # 使用MatPlotLib日期时间定位器和格式化器无法与新的pandas日期时间索引一起使用 ax.xaxis.set_minor_locator(mdates.WeekdayLocator()) ax.xaxis.set_minor_formatter(mdates.DateFormatter('%d\n%a')) ax.xaxis.grid(True, which="minor") ax.xaxis.grid(False, which="major") ax.xaxis.set_major_formatter(mdates.DateFormatter('\n\n\n%b%Y')) plt.show()
\n\n
具有正确日期的图表(没有次要刻度)
\n
# 通过pandas设置主要xticks和标签 ax2 = plt.figure(figsize=(7,4), dpi=300).add_subplot(111) xticks = pd.date_range(start='2011-05-01', end='2011-07-01', freq='W-Tue') testSeries.plot(ax=ax2, style='-v', label='second line', xticks=xticks.to_pydatetime()) ax2.set_xticklabels([x.strftime('%a\n%d\n%h\n%Y') for x in xticks]); # 删除pandas.plot设置的次要xtick标签 ax2.set_xticklabels([], minor=True) # 关闭pandas.plot创建的次要刻度 plt.show()
\n\n更新:通过使用循环构建主要xtick标签,我已经接近了所需的布局:\n
# 仅在月份的第一个标签中显示月份 month = dStart.month - 1 xticklabels = [] for x in xticks: if month != x.month : xticklabels.append(x.strftime('%d\n%a\n%h')) month = x.month else: xticklabels.append(x.strftime('%d\n%a'))
\n但是,这有点像使用ax.annotate
来做x轴:可能但不理想。\n在绘制pandas时间序列数据时,如何设置主要和次要刻度?
Pandas的时间序列绘图中,x轴的主要刻度和次要刻度以及标签的设置存在问题。问题的原因在于matplotlib的plot()
函数中,默认的时间序列单位是1天,而在pandas的plot()
函数中,1个单位等于时间序列的频率,因此如果频率是1天,1个单位就是1天;如果频率是1小时,那么1个单位就是1小时,以此类推。这导致了matplotlib和pandas在处理时间序列数据时plot()
函数的调用有所不同。
如果时间序列的频率是1天,那么matplotlib.dates.WeekdayLocator
和matplotlib.dates.MonthLocator
等可以“定位”刻度位置,因为pandas的plot()
函数使用1天作为基本单位来生成xtick的位置(与matplotlib的默认设置相吻合)。由于pandas的plot()
函数返回的是一个Axes对象,可以使用matplotlib.dates
来修改该Axes对象的刻度标签。
解决方法之一是通过传递参数x_compat=True
来删除pandas的自动刻度调整。然后可以使用matplotlib的刻度分辨率来设置主要/次要刻度标签,即以与上述相同的方式设置。
另一种解决方法是使用matplotlib的plot()
函数(如建议的)。因为matplotlib中的单位是固定的,所以可以像上面那样设置刻度标签而不会出现问题。
解决Pandas时间序列绘图中设置x轴主要和次要刻度以及标签的问题的方法有两种:一种是通过删除pandas的自动刻度调整,使用matplotlib的刻度分辨率来设置刻度标签;另一种是使用matplotlib的plot()
函数来绘图,因为matplotlib中的单位是固定的,可以直接设置刻度标签。
Pandas时间序列绘图设置x轴主要和次要刻度和标签
在Pandas中,绘制时间序列图时,如果x轴上的数据点过多,Pandas会自动调整刻度和标签的密度,以便更好地显示。然而,有时候我们希望关闭这个自动调整的功能,保持刻度和标签的原始密度。下面就是关于关闭Pandas日期时间刻度调整的问题的原因和解决方法。
原因:
Pandas默认会自动调整x轴刻度和标签,以适应当前数据的范围和密度。这样做可以确保图表在不同大小的窗口和设备上都能正确显示。但是,这种自动调整有时会导致刻度和标签的密度过高,影响了图表的可读性。
解决方法:
要关闭Pandas的日期时间刻度调整功能,需要在绘图函数中添加参数`x_compat=True`。下面是一个示例:
ds.plot(x_compat=True)
在这个示例中,`ds`是一个Pandas的时间序列数据,`x_compat=True`参数告诉Pandas不要调整x轴刻度和标签的密度。
此外,您还可以在Pandas文档中找到更多示例和说明。具体的链接如下:
[Pandas文档:Suppressing tick resolution adjustment](https://pandas.pydata.org/pandas-docs/stable/user_guide/visualization.html#suppressing-tick-resolution-adjustment)
在绘制时间序列图时,Pandas会自动调整x轴刻度和标签的密度。然而,有时候我们希望保持刻度和标签的原始密度,以提高图表的可读性。为了关闭Pandas的日期时间刻度调整功能,我们可以在绘图函数中添加参数`x_compat=True`。这样,就可以保持刻度和标签的原始密度,同时提高图表的可读性。更多示例和说明可以在Pandas文档中找到。
Pandas timeseries plot设置x轴主要和次要刻度和标签的原因是,Pandas在定位刻度时使用了matplotlib.units,但是与此同时,matplotlib.dates可以方便地手动设置刻度,而Pandas似乎更注重自动格式化。因此,暂时使用matplotlib.dates更加合理。
为了解决这个问题,可以使用以下方法:
1. 导入必要的库:
import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates as dates
2. 创建时间序列数据:
idx = pd.date_range('2011-05-01', '2011-07-01') s = pd.Series(np.random.randn(len(idx)), index=idx)
3. 创建图形和坐标轴:
fig, ax = plt.subplots()
4. 使用`plot_date()`函数绘制日期数据:
ax.plot_date(idx.to_pydatetime(), s, 'v-')
5. 设置x轴次要刻度的定位器和格式化器,以及网格线:
ax.xaxis.set_minor_locator(dates.WeekdayLocator(byweekday=(1), interval=1)) ax.xaxis.set_minor_formatter(dates.DateFormatter('%d\n%a')) ax.xaxis.grid(True, which="minor")
6. 设置x轴主要刻度的定位器和格式化器:
ax.xaxis.set_major_locator(dates.MonthLocator()) ax.xaxis.set_major_formatter(dates.DateFormatter('\n\n\n%b\n%Y'))
7. 调整图形布局并显示图形:
plt.tight_layout() plt.show()
通过以上步骤,可以设置Pandas timeseries plot的x轴主要和次要刻度和标签。