matplotlib 如何改变pandas的x轴滴答频率.plot

jei2mxaa  于 2023-10-24  发布在  其他
关注(0)|答案(5)|浏览(127)

我正在使用pandas .plot()绘制时间序列,并希望看到每个月都显示为x-tick。
数据集结构x1c 0d1x
下面是.plot()的结果

我试图使用其他文章中的例子和matplotlib documentation,并做一些类似的事情,

ax.xaxis.set_major_locator(
   dates.MonthLocator(revenue_pivot.index, bymonthday=1,interval=1))

但这消除了所有的蜱虫:(
我也试过传递xticks = df.index,但它没有改变任何东西。
在x轴上显示更多刻度的正确方法是什么?

56lgkhnf

56lgkhnf1#

不需要向MonthLocator传递任何参数。请确保根据@Rotkiv的回答在df.plot()调用中使用x_compat

import pandas as pd
import numpy as np
import matplotlib.pylab as plt
import matplotlib.dates as mdates

df = pd.DataFrame(np.random.rand(100,2), index=pd.date_range('1-1-2018', periods=100))
ax = df.plot(x_compat=True)
ax.xaxis.set_major_locator(mdates.MonthLocator())
plt.show()
  • 使用set_major_locator化x轴

  • 无格式x轴

lhcgjxsq

lhcgjxsq2#

您还可以使用pandas Timestamp对象的属性“手动”格式化pandas DateTimeIndex的x轴刻度和标签。
我发现这比使用来自matplotlib.dates的定位器要容易得多,matplotlib.dates适用于其他日期时间格式,而不是pandas(如果我没有弄错的话),因此如果日期没有相应地转换,有时会显示出奇怪的行为。
下面是一个通用示例,它基于pandas Timestamp对象的属性将每个月的第一天显示为标签:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# data
dim = 8760
idx = pd.date_range('1/1/2000 00:00:00', freq='h', periods=dim)
df = pd.DataFrame(np.random.randn(dim, 2), index=idx)

# select tick positions based on timestamp attribute logic. see:
# https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Timestamp.html
positions = [p for p in df.index
             if p.hour == 0
             and p.is_month_start
             and p.month in range(1, 13, 1)]
# for date formatting, see:
# https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior
labels = [l.strftime('%m-%d') for l in positions]

# plot with adjusted labels
ax = df.plot(kind='line', grid=True)
ax.set_xlabel('Time (h)')
ax.set_ylabel('Foo (Bar)')
ax.set_xticks(positions)
ax.set_xticklabels(labels)

plt.show()

产量:

希望这对你有帮助!

lvjbypge

lvjbypge3#

正确的方法是使用x_compat参数,可以抑制自动刻度分辨率调整
df.A.plot(x_compat=True)

jv2fixgn

jv2fixgn4#

如果你只想显示更多的tick,你也可以深入研究pd.plotting._converter的结构:

dai = ax.xaxis.minor.formatter.plot_obj.date_axis_info
dai['fmt'][dai['fmt'] == b''] = b'%b'

绘图后,formatter是一个TimeSeries_DateFormatter_set_default_format已经被调用,所以self.plot_obj.date_axis_info is not None。现在可以根据自己的喜好操纵结构化数组.date_axis_info,即包含更少的b''和更多的b'%b'

sg3maiej

sg3maiej5#

删除刻度标签:

ax = df.plot(x='date', y=['count'])
every_nth = 10
for n, label in enumerate(ax.xaxis.get_ticklabels()):
  if n % every_nth != 0:
    label.set_visible(False)

降低every_nth以包含更多标签,提高every_nth以保留更少标签。

相关问题