matplotlib xticks 输出错误的数组
matplotlib xticks outputs wrong array
我正在尝试绘制一个时间序列,它看起来像这样
ts
2020-01-01 00:00:00 1300.0
2020-01-01 01:00:00 1300.0
2020-01-01 02:00:00 1300.0
2020-01-01 03:00:00 1300.0
2020-01-01 04:00:00 1300.0
...
2020-12-31 19:00:00 1300.0
2020-12-31 20:00:00 1300.0
2020-12-31 21:00:00 1300.0
2020-12-31 22:00:00 1300.0
2020-12-31 23:00:00 1300.0
Freq: H, Name: 1, Length: 8784, dtype: float64
我通过以下方式绘制它:ts.plot(label=label, linestyle='--', color='k', alpha=0.75, zorder=2)
如果时间序列 ts
从 2020-01-01
开始到 2020-12-31
,我在调用 plt.xticks()[0]
时得到跟随:
array([438288, 439032, 439728, 440472, 441192, 441936, 442656, 443400,
444144, 444864, 445608, 446328, 447071], dtype=int64)
这很好,因为该数组的第一个元素实际上显示了第一个 xtick 的正确位置。但是,当我将时间序列对象从 2019-01-01
扩展到 2020-12-31
时,在 2 年多的时间里,当我调用 plt.xticks()[0]
时,我得到以下信息:
array([429528, 431688, 433872, 436080, 438288, 440472, 442656, 444864,
447071], dtype=int64)
我不明白为什么现在我得到的 xtick 值越来越少。因此,在 12 个月的时间里,我获得了 13 个 xticks 位置。但在 24 个月的时间里,我一直期望获得 25 个地点。相反,我只有 9 个。我如何获得所有这 25 个位置?
这是整个脚本:
fig, ax = plt.subplots(figsize=(8,4))
ts.plot(label=label, linestyle='--', color='k', alpha=0.75, zorder=2)
locs, labels = plt.xticks()
Matplotlib 会自动选择适当数量的刻度和刻度标签,以便 x 轴不会变得不可读。您可以使用 matplotlib.dates
模块中的刻度定位器和格式化程序来覆盖默认行为。
但请注意,您正在使用 pandas plot method which is a wrapper around plt.plot
. Pandas uses custom tick formatters for time series plots that produce nicely-formatted tick labels. By doing so, it uses x-axis units for dates that are different from the matplotlib date units 绘制时间序列,这解释了为什么当您尝试使用 MonthLocator
.[=20= 时会得到看起来像随机数的滴答声。 ]
要使 pandas 绘图与 matplotlib.dates
刻度定位器兼容,您需要添加 undocumented x_compat=True
参数。不幸的是,这也删除了 pandas 自定义刻度标签格式化程序。因此,这里是一个示例,说明如何将 matplotlib 日期刻度定位器与 pandas 绘图一起使用并获得类似的刻度格式(不包括次要刻度):
import pandas as pd # v 1.1.3
import matplotlib.pyplot as plt # v 3.3.2
import matplotlib.dates as mdates
# Create sample time series stored in a dataframe
ts = pd.DataFrame(data=dict(constant=1),
index=pd.date_range('2019-01-01', '2020-12-31', freq='H'))
# Create pandas plot
ax = ts.plot(figsize=(10,4), x_compat=True)
ax.set_xlim(min(ts.index), max(ts.index))
# Select and format x ticks
ax.xaxis.set_major_locator(mdates.MonthLocator())
ticks = pd.to_datetime(ax.get_xticks(), unit='d') # timestamps of x ticks
labels = [timestamp.strftime('%b\n%Y') if timestamp.year != ticks[idx-1].year
else timestamp.strftime('%b') for idx, timestamp in enumerate(ticks)]
plt.xticks(ticks, labels, rotation=0, ha='center');
我正在尝试绘制一个时间序列,它看起来像这样
ts
2020-01-01 00:00:00 1300.0
2020-01-01 01:00:00 1300.0
2020-01-01 02:00:00 1300.0
2020-01-01 03:00:00 1300.0
2020-01-01 04:00:00 1300.0
...
2020-12-31 19:00:00 1300.0
2020-12-31 20:00:00 1300.0
2020-12-31 21:00:00 1300.0
2020-12-31 22:00:00 1300.0
2020-12-31 23:00:00 1300.0
Freq: H, Name: 1, Length: 8784, dtype: float64
我通过以下方式绘制它:ts.plot(label=label, linestyle='--', color='k', alpha=0.75, zorder=2)
如果时间序列 ts
从 2020-01-01
开始到 2020-12-31
,我在调用 plt.xticks()[0]
时得到跟随:
array([438288, 439032, 439728, 440472, 441192, 441936, 442656, 443400,
444144, 444864, 445608, 446328, 447071], dtype=int64)
这很好,因为该数组的第一个元素实际上显示了第一个 xtick 的正确位置。但是,当我将时间序列对象从 2019-01-01
扩展到 2020-12-31
时,在 2 年多的时间里,当我调用 plt.xticks()[0]
时,我得到以下信息:
array([429528, 431688, 433872, 436080, 438288, 440472, 442656, 444864,
447071], dtype=int64)
我不明白为什么现在我得到的 xtick 值越来越少。因此,在 12 个月的时间里,我获得了 13 个 xticks 位置。但在 24 个月的时间里,我一直期望获得 25 个地点。相反,我只有 9 个。我如何获得所有这 25 个位置?
这是整个脚本:
fig, ax = plt.subplots(figsize=(8,4))
ts.plot(label=label, linestyle='--', color='k', alpha=0.75, zorder=2)
locs, labels = plt.xticks()
Matplotlib 会自动选择适当数量的刻度和刻度标签,以便 x 轴不会变得不可读。您可以使用 matplotlib.dates
模块中的刻度定位器和格式化程序来覆盖默认行为。
但请注意,您正在使用 pandas plot method which is a wrapper around plt.plot
. Pandas uses custom tick formatters for time series plots that produce nicely-formatted tick labels. By doing so, it uses x-axis units for dates that are different from the matplotlib date units 绘制时间序列,这解释了为什么当您尝试使用 MonthLocator
.[=20= 时会得到看起来像随机数的滴答声。 ]
要使 pandas 绘图与 matplotlib.dates
刻度定位器兼容,您需要添加 undocumented x_compat=True
参数。不幸的是,这也删除了 pandas 自定义刻度标签格式化程序。因此,这里是一个示例,说明如何将 matplotlib 日期刻度定位器与 pandas 绘图一起使用并获得类似的刻度格式(不包括次要刻度):
import pandas as pd # v 1.1.3
import matplotlib.pyplot as plt # v 3.3.2
import matplotlib.dates as mdates
# Create sample time series stored in a dataframe
ts = pd.DataFrame(data=dict(constant=1),
index=pd.date_range('2019-01-01', '2020-12-31', freq='H'))
# Create pandas plot
ax = ts.plot(figsize=(10,4), x_compat=True)
ax.set_xlim(min(ts.index), max(ts.index))
# Select and format x ticks
ax.xaxis.set_major_locator(mdates.MonthLocator())
ticks = pd.to_datetime(ax.get_xticks(), unit='d') # timestamps of x ticks
labels = [timestamp.strftime('%b\n%Y') if timestamp.year != ticks[idx-1].year
else timestamp.strftime('%b') for idx, timestamp in enumerate(ticks)]
plt.xticks(ticks, labels, rotation=0, ha='center');