pandas .p​​lot()x轴刻度频率 - 如何显示更多刻度?

Rot*_*kiv 10 matplotlib pandas

我正在使用pandas .p​​lot()绘制时间序列,并希望看到每个月显示为x-tick.

这是数据集结构 数据集

这是.plot()的结果

在此输入图像描述

我试图使用其他帖子和matplotlib 文档中的示例,并执行类似的操作

ax.xaxis.set_major_locator(
   dates.MonthLocator(revenue_pivot.index, bymonthday=1,interval=1))
Run Code Online (Sandbox Code Playgroud)

但那删除了所有的滴答声:(

我也试图通过xticks = df.index,但它没有改变任何东西.

在x轴上显示更多刻度的方法是什么?

Kyl*_*yle 9

无需传递任何参数MonthLocator.确保x_compatdf.plot()@Rotkiv的答案中使用.

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()
Run Code Online (Sandbox Code Playgroud)

  • 为什么哦为什么绘图这么乏味 (15认同)

Cor*_*yer 8

您还可以DateTimeIndex使用熊猫Timestamp对象的属性“手动”格式化熊猫的 x 轴刻度和标签。

我发现这比使用定位器更容易,定位器matplotlib.dates在其他日期时间格式上工作而不是 Pandas(如果我没记错的话),因此如果日期没有相应地转换,有时会显示奇怪的行为。

这是一个通用示例,它根据 pandasTimestamp对象的属性将每个月的第一天显示为标签:

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()
Run Code Online (Sandbox Code Playgroud)

产量:

在此处输入图片说明

希望这可以帮助!