如何实现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
相关产品推荐
相关产品推荐

