更改 ticks matplotlib 的频率
Change frequency of ticks matplotlib
我正在尝试降低 xticks 的频率以使其更具可读性,但是当 x ticks 不是整数时我无法这样做。请看下面的例子(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 递增,现在没有与数据正确对齐。
此问题已通过更新版本的 matplotlib 解决。您在 matplotlib 3.4.2 中的代码工作正常。
如果您无法更新您的环境,您应该将 x 轴格式视为日期时间(使用 matplotlib 2.1.1 测试)。
为此,首先您必须将 x 轴从 str
转换为 datetime
:
x_time = [datetime.strptime(x_i, '%H:%M') for x_i in x]
然后绘制数据,将 x
替换为 x_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
places ticks each interval
value (1 minute in this case) and DateFormatter
格式报价为 '%H:%M'
格式。
最后,您可以在每个刻度之间设置 space:
ax2.set_xticks(ax2.get_xticks()[::2])
您也可以避免最后一行并使用 interval
参数在刻度之间控制 space:
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()
我正在尝试降低 xticks 的频率以使其更具可读性,但是当 x ticks 不是整数时我无法这样做。请看下面的例子(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 递增,现在没有与数据正确对齐。
此问题已通过更新版本的 matplotlib 解决。您在 matplotlib 3.4.2 中的代码工作正常。
如果您无法更新您的环境,您应该将 x 轴格式视为日期时间(使用 matplotlib 2.1.1 测试)。
为此,首先您必须将 x 轴从 str
转换为 datetime
:
x_time = [datetime.strptime(x_i, '%H:%M') for x_i in x]
然后绘制数据,将 x
替换为 x_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
places ticks each interval
value (1 minute in this case) and DateFormatter
格式报价为 '%H:%M'
格式。
最后,您可以在每个刻度之间设置 space:
ax2.set_xticks(ax2.get_xticks()[::2])
您也可以避免最后一行并使用 interval
参数在刻度之间控制 space:
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()