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

Matplotlib中同时共享图像的X轴与Y轴问题

解决imshow图像与行列求和图的轴对齐问题

问题描述

使用imshow显示图像后,计算每行、列的求和并标注最大值,希望实现:

  • 图像的X轴与列求和图的X轴完全对齐
  • 图像的Y轴与行求和图的Y轴完全对齐
    但设置sharex/sharey后仅能实现其一,当前效果为图像与下方列求和图的X轴、右侧行求和图的Y轴均未对齐;期望效果为三者对应轴完全匹配,刻度位置一一对应。

问题原因

imshow默认将像素中心对齐到整数刻度,轴范围是[-0.5, N-0.5](N为像素边长),而普通plot的轴默认从0延伸至N,两者的轴范围、刻度对齐逻辑不一致,导致sharex/sharey无法同时满足双向对齐需求。

解决代码

通过手动设置轴范围、调整imshow的extent参数,实现三者轴的完全对齐:

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import argrelextrema
import matplotlib.animation as animation

fig = plt.figure()
gs = fig.add_gridspec(2, 2, height_ratios=[1, 0.1], width_ratios=[1, 0.1], hspace=0, wspace=0)
ax1 = fig.add_subplot(gs[0,0])
ax2 = fig.add_subplot(gs[1,0])
ax3 = fig.add_subplot(gs[0,1])

# 定义图像尺寸与轴范围,适配imshow的像素中心对齐逻辑
img_size = 5
x_extent = [-0.5, img_size - 0.5]
y_extent = [img_size - 0.5, -0.5]  # 匹配imshow默认Y轴向下的方向

# 统一三个子图的轴范围
ax1.set_xlim(x_extent)
ax1.set_ylim(y_extent)
ax2.set_xlim(x_extent)
ax3.set_ylim(y_extent)

# 隐藏冗余刻度,优化布局
ax2.set_yticks([])
ax3.set_xticks([])

frameNumber = 10
imgs = []

for i in range(frameNumber):
    np.random.seed(i)
    randomImage = np.random.random((img_size, img_size))
    sumX = np.sum(randomImage, axis=0)
    sumY = np.sum(randomImage, axis=1)
    dataRange = np.arange(img_size)  # 对应像素中心的整数坐标
    randomMaximalX = argrelextrema(sumX, np.greater)
    randomMaximalY = argrelextrema(sumY, np.greater)

    # 用extent参数明确图像轴范围,确保与求和图对齐
    img1 = ax1.imshow(randomImage, animated=True, extent=x_extent + y_extent)
    # 列求和图:x轴对应像素中心,y轴为求和值
    img2 = ax2.plot(dataRange, sumX, animated=True)[0]
    # 行求和图:y轴对应像素中心,x轴为求和值
    img3 = ax3.plot(sumY, dataRange, animated=True)[0]
    # 极值线匹配像素中心位置,动态适配求和最大值
    img4 = ax2.vlines(x=randomMaximalX, ymin=0, ymax=sumX.max(), animated=True, linestyles="dashed")
    img5 = ax3.hlines(y=randomMaximalY, xmin=0, xmax=sumY.max(), animated=True, linestyles="dashed")
    imgs.append([img1, img2, img3, img4, img5])

ani = animation.ArtistAnimation(fig, imgs, interval=1000, blit=False)
plt.show()

关键修改点

  1. 设置imshow的extent参数:明确图像的轴范围为[-0.5, N-0.5],让每个像素的中心对应整数刻度,对齐求和图的坐标逻辑。
  2. 统一轴范围:手动设置三个子图的xlim和ylim,替代sharex/sharey的自动对齐,确保三者轴范围完全一致。
  3. 动态调整极值线范围:将vlines的ymax和hlines的xmax设为对应求和的最大值,避免固定值导致的显示偏差。
  4. 优化布局细节:隐藏冗余刻度,保持整体视觉整洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:18:41