首页 > 解决方案 > 改变刻度 matplotlib 的频率

问题描述

我正在尝试降低 xticks 的频率,使其更具可读性,但是当 x 刻度不是整数时,我无法这样做。请参见下面的示例(matplotlib 2.1.1):

f = plt.figure(figsize=(5, 5))
ax1 = f.add_subplot(211)
ax2 = f.add_subplot(212)

x = [1,2,3,4,5,6,7]
y = [13,15,17,14,17,20,21]

ax1.plot(x, y, label="test1")
ax2.plot(x, y, label="test2")

ax2.set_xticks(ax2.get_xticks()[::2])

plt.subplots_adjust(hspace=1)
plt.show()

在此处输入图像描述

这个例子工作得很好,第二个图表现在每 2 个刻度显示 x 个刻度。

当我像这样将 x 值更改为非整数时

f = plt.figure(figsize=(5, 5))
ax1 = f.add_subplot(211)
ax2 = f.add_subplot(212)

x = ["10:31","10:32","10:33","10:34","10:35","10:36","10:37"]
y = [13,15,17,14,17,20,21]

ax1.plot(x, y, label="test1")
ax2.plot(x, y, label="test2")

ax2.set_xticks(ax2.get_xticks()[::2])

plt.subplots_adjust(hspace=1)
plt.show()

然后图表不再准确。刻度的间距现在是每 2 次,但它仍以 1 递增,并且现在未与数据正确对齐。

在此处输入图像描述

标签: pythondatetimematplotlibsubplotxticks

解决方案


使用更新版本的 matplotlib 解决了这个问题。您在 matplotlib 3.4.2 中的代码运行良好。


如果您无法更新您的环境,则应将 x 轴格式视为日期时间(使用 matplotlib 2.1.1 测试)。
为此,首先您必须将 x 轴从 转换strdatetime

x_time = [datetime.strptime(x_i, '%H:%M') for x_i in x]

然后你绘制你的数据替换xx_time

ax2.plot(x_time, y, label="test2")

现在 matplotlib 知道您的 x 轴是日期时间格式。您仍然需要正确格式化刻度:

ax2.xaxis.set_major_locator(md.MinuteLocator(interval = 1))
ax2.xaxis.set_major_formatter(md.DateFormatter('%H:%M'))

MinuteLocator放置每个interval值的刻度(在这种情况下为 1 分钟)并在格式DateFormatter中格式化刻度'%H:%M'
最后,您可以设置每个刻度之间的空间:

ax2.set_xticks(ax2.get_xticks()[::2])

在此处输入图像描述

您还可以使用参数避免刻度之间的最后一行和控制空间interval

ax2.xaxis.set_major_locator(md.MinuteLocator(interval = 2))

在此处输入图像描述

完整代码

import matplotlib.pyplot as plt
from datetime import datetime
import matplotlib.dates as md

f = plt.figure(figsize=(5, 5))
ax1 = f.add_subplot(211)
ax2 = f.add_subplot(212)

x = ["10:31","10:32","10:33","10:34","10:35","10:36","10:37"]
y = [13,15,17,14,17,20,21]

x_time = [datetime.strptime(x_i, '%H:%M') for x_i in x]

ax1.plot(x, y, label="test1")
ax2.plot(x_time, y, label="test2")

ax2.xaxis.set_major_locator(md.MinuteLocator(interval = 1))
ax2.xaxis.set_major_formatter(md.DateFormatter('%H:%M'))

ax2.set_xticks(ax2.get_xticks()[::2])

plt.subplots_adjust(hspace=1)
plt.show()

推荐阅读