python - 改变刻度 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 递增,并且现在未与数据正确对齐。
解决方案
使用更新版本的 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
放置每个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()
推荐阅读
- php - WordPress 使用 IN() 为多种帖子类型准备 SQL 查询字符串,并从 SQL 中删除反斜杠 (\)
- reactjs - 提交表单后 setState 不起作用
- python - QListWidget 拖放事件
- google-apps-script - Google 脚本 - 限制查询结果 - 表单下拉解决方法
- python - 将多个图存储在列表中以便以后访问它们
- android - 如何在 Picasso 上启用 TLS v 1.2 以在 Kotlin 中使用 https 加载图像
- flutter - Flutter 中相似值之间的动画
- python - 为什么 Python 中的空类实例化会链接创建的对象?
- flutter - 滚动到屏幕外小部件?列表视图颤动
- php - 如何在没有 .php 扩展名的情况下使用 nginx 和 php 进行路由