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

如何实现Jupyter Lab中Matplotlib多图ROI同步缩放及关联图更新?

基于NumPy/Matplotlib的元素分布图ROI交互解决方案

核心功能实现

1. 跨图同步ROI缩放

使用Matplotlib的RectangleSelector工具实现ROI绘制,通过回调函数捕获选中的坐标范围,遍历所有元素分布图的坐标轴,统一设置xlim和ylim实现同步缩放。

代码示例片段:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import RectangleSelector

# 加载Fe、Al元素分布数据(假设为2D数组格式)
fe_data = np.load('fe_map.npy')
al_data = np.load('al_map.npy')

# 创建绘图布局:2个元素分布图 + 1个关联散点图
fig, (ax_fe, ax_al, ax_scatter) = plt.subplots(1, 3, figsize=(15, 5))
im_fe = ax_fe.imshow(fe_data, cmap='viridis')
im_al = ax_al.imshow(al_data, cmap='plasma')
scatter_plot = ax_scatter.scatter(fe_data.flatten(), al_data.flatten(), s=1, alpha=0.5)

# 存储需要同步缩放的坐标轴对象
sync_axes = [ax_fe, ax_al]

def on_roi_selected(eclick, erelease):
    # 获取ROI的坐标范围
    x_start, y_start = eclick.xdata, eclick.ydata
    x_end, y_end = erelease.xdata, erelease.ydata
    x_min, x_max = min(x_start, x_end), max(x_start, x_end)
    y_min, y_max = min(y_start, y_end), max(y_start, y_end)
    
    # 同步所有元素分布图的坐标轴范围
    for ax in sync_axes:
        ax.set_xlim(x_min, x_max)
        ax.set_ylim(y_min, y_max)
    
    # 转换坐标为数组索引(适配imshow的y轴方向)
    y_min_idx, y_max_idx = int(np.round(y_max)), int(np.round(y_min))
    x_min_idx, x_max_idx = int(np.round(x_min)), int(np.round(x_max))
    # 提取ROI内的元素数据
    roi_fe = fe_data[y_min_idx:y_max_idx, x_min_idx:x_max_idx].flatten()
    roi_al = al_data[y_min_idx:y_max_idx, x_min_idx:x_max_idx].flatten()
    
    # 更新关联散点图
    ax_scatter.clear()
    ax_scatter.scatter(roi_fe, roi_al, s=1, alpha=0.5)
    ax_scatter.set_xlabel('Fe 强度')
    ax_scatter.set_ylabel('Al 强度')
    ax_scatter.set_title('ROI内Fe-Al关联')
    
    fig.canvas.draw_idle()

# 给Fe分布图绑定ROI选择器,所有图共享该交互逻辑
roi_selector = RectangleSelector(
    ax_fe, on_roi_selected, drawtype='box',
    useblit=True, button=[1],  # 左键触发绘制
    minspanx=5, minspany=5,  # 限制最小ROI尺寸
    spancoords='pixels', interactive=True
)

plt.tight_layout()
plt.show()

2. 散点图自动更新逻辑

在ROI回调函数中,通过坐标转换获取数据数组的索引范围,提取ROI区域内的Fe、Al像素值,清除原有散点图后重新绘制筛选后的数据集,确保散点图仅展示选中区域的元素关联关系。

适合的GUI环境

  • Matplotlib内置后端:推荐使用Qt5Agg或TkAgg,这两个后端对交互控件支持稳定,本地Python环境直接运行即可启用完整交互功能。可通过以下代码指定后端:
    import matplotlib
    matplotlib.use('Qt5Agg')
    
  • Jupyter环境:在Jupyter Notebook/Lab中执行%matplotlib widget魔法命令,可在浏览器中实现交互式绘图,支持ROI绘制、实时缩放等操作。
  • PyQt/PySide整合:如果需要自定义复杂界面,可将Matplotlib画布嵌入PyQt/PySide窗口,实现更灵活的交互逻辑扩展。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 15:40:14