You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib:不修改数据与绘图,强制两子图使用相同刻度标签

让Matplotlib第二个子图复用第一个子图的刻度标签且不改变数据显示

问题描述

给定以下Python代码:

import matplotlib.pyplot as plt
import random 

fig, ax = plt.subplots(1, 2, figsize = [9, 5], dpi = 100) 
xs = [random.randint(-10, 10) for _ in range(10)]
ys = [random.randint(-10, 10) for _ in range(10)]

xx = [random.randint(-20, 20) for _ in range(10)]
yy = [random.randint(-20, 20) for _ in range(10)]

ax[0].plot(xs, ys)
ax[1].plot(xx, yy)

plt.show()

该代码生成两个子图,需求是让第二个子图的xticks和yticks与第一个子图完全一致,但不能改变第二个子图的数据显示状态(不缩放、平移或旋转图形)。此前尝试复制格式化器、设置相同刻度及标签等方法均无效,设置xlim/ylim会导致子图缩放,不符合需求,需仅修改刻度标签,保持图形显示不变。

解决方案

核心思路是:保留第二个子图的原始坐标轴范围(确保数据显示不变),直接将第一个子图的刻度位置与标签赋值给第二个子图,同时禁用自动缩放功能防止坐标轴范围被修改。

修改后的完整代码如下:

import matplotlib.pyplot as plt
import random 

fig, ax = plt.subplots(1, 2, figsize = [9, 5], dpi = 100) 
xs = [random.randint(-10, 10) for _ in range(10)]
ys = [random.randint(-10, 10) for _ in range(10)]

xx = [random.randint(-20, 20) for _ in range(10)]
yy = [random.randint(-20, 20) for _ in range(10)]

ax[0].plot(xs, ys)
ax[1].plot(xx, yy)

# 获取第一个子图的刻度位置与标签文本
xticks_pos = ax[0].get_xticks()
xtick_labels = [label.get_text() for label in ax[0].get_xticklabels()]
yticks_pos = ax[0].get_yticks()
ytick_labels = [label.get_text() for label in ax[0].get_yticklabels()]

# 给第二个子图设置相同的刻度
ax[1].set_xticks(xticks_pos)
ax[1].set_xticklabels(xtick_labels)
ax[1].set_yticks(yticks_pos)
ax[1].set_yticklabels(ytick_labels)

# 禁用自动缩放,强制保留第二个子图的原始坐标轴范围
ax[1].autoscale(enable=False, axis='both')

plt.show()

关键说明

  • get_xticks()/get_yticks()获取第一个子图的刻度位置,get_xticklabels()获取对应的标签文本,确保刻度完全一致。
  • autoscale(enable=False, axis='both')是核心:禁用坐标轴的自动缩放功能,避免设置刻度后Matplotlib自动调整坐标轴范围导致图形缩放。
  • 整个过程不会修改第二个子图的数据映射关系,因此图形的显示状态(数据的位置、大小)完全保持不变,仅替换了刻度标签。

内容的提问来源于stack exchange,提问作者hexaquark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:20:42