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
相关产品推荐
相关产品推荐

