Pandas时间序列绘图设置x轴的主要和次要刻度以及标签。

12 浏览
0 Comments

Pandas时间序列绘图设置x轴的主要和次要刻度以及标签。

我想要能够设置从Pandas时间序列对象绘制的时间序列图的主要和次要xticks及其标签。Pandas 0.9的“新内容”页面上说:\n“您可以使用to_pydatetime或为Timestamp类型注册转换器。”\n但是我无法弄清楚如何做到这一点,以便我可以使用matplotlib的ax.xaxis.set_major_locatorax.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\"具有奇怪日期的x轴的图表\"\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时间序列数据时,如何设置主要和次要刻度?

0
0 Comments

Pandas的时间序列绘图中,x轴的主要刻度和次要刻度以及标签的设置存在问题。问题的原因在于matplotlib的plot()函数中,默认的时间序列单位是1天,而在pandas的plot()函数中,1个单位等于时间序列的频率,因此如果频率是1天,1个单位就是1天;如果频率是1小时,那么1个单位就是1小时,以此类推。这导致了matplotlib和pandas在处理时间序列数据时plot()函数的调用有所不同。

如果时间序列的频率是1天,那么matplotlib.dates.WeekdayLocatormatplotlib.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中的单位是固定的,可以直接设置刻度标签。

0
0 Comments

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文档中找到。

0
0 Comments

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轴主要和次要刻度和标签。

0