繁体   English   中英

为什么我不能在嵌入在 pyqt5 gui 中的 matplotlib 颜色图中成功绘制感兴趣的区域?

[英]Why can't I successfully draw the region of interest in a matplotlib color map embedded in a pyqt5 gui?

我正在尝试在嵌入 pyqt5 gui 的彩色地图上绘制一个感兴趣的区域。 这是我想要的一个例子。

import sys
from PyQt5.QtWidgets import (QWidget, QPushButton,
                             QHBoxLayout, QVBoxLayout, QApplication)
from PyQt5 import QtCore
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas

import ROI_class as roi # ROI_class.py

class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()
        self.drawButton.clicked.connect(self.draw_map_Callback)
        self.roiButton.clicked.connect(self.choose_roi)

    def initUI(self):
        self.drawButton = QPushButton("draw map")
        self.roiButton = QPushButton("roi")

        self.hbox = QHBoxLayout()
        self.hbox.addStretch(1)
        self.hbox.addWidget(self.drawButton)
        self.hbox.addWidget(self.roiButton)

        self.vbox = QVBoxLayout()
        self.vbox.addStretch(1)
        self.vbox.addLayout(self.hbox)

        self.setLayout(self.vbox)
        self.setGeometry(500, 500, 500, 500)
        self.setWindowTitle('ROI')
        self.show()
        
    def draw_map_Callback(self):        
        img = np.ones((100, 100)) * range(0, 100)
        fig, ax1 = plt.subplots()
        
        self.con_canvas = FigureCanvas(plt.figure(tight_layout=True))
        self.con_canvas.setFocusPolicy(QtCore.Qt.ClickFocus)
        self.con_canvas.setFocus()
        self.con_toolbar = NavigationToolbar(self.con_canvas, self)
        self.vbox.addWidget(self.con_toolbar)
        self.vbox.addWidget(self.con_canvas)
        self._con_ax = self.con_canvas.figure.subplots()
        self.con_img = self._con_ax.imshow(img, cmap ='jet')
        self._con_ax.set_xlabel('xlabel')
        self._con_ax.set_ylabel('ylabel')
        self.con_cbar = self.con_canvas.figure.colorbar(self.con_img)
        self._con_ax.set_aspect('equal')
        
        
    def choose_roi(self):
        y = roi.new_ROI(self.con_img)

        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

单击“绘制地图”时,它会绘制颜色图。 然后我希望它允许我用鼠标绘制一个感兴趣的区域,并使用下面这个链接上的代码获得一个蒙版。

https://github.com/martindurant/misc/blob/master/ROI.py

导入的“ROI_class”只是上面链接中代码的复制和粘贴。

我可以在 GUI 上成功绘制绘图,但是当我单击“roi”时,它不允许我绘制感兴趣的区域。

当我创建一个新文件并将代码粘贴到上面的链接中时

fig, ax1 = plt.subplots()
s = ax1.imshow(img, cmap ='jet')
ax1.set_xlabel('subcolor')
ax1.set_ylabel('ylabel')
y = new_ROI(s)

在代码的末尾,它工作得很好,我能够绘制感兴趣的区域并获得它的掩码。

但是当我尝试在 GUI 中执行此操作时,它不会让我绘制感兴趣的区域。 我很困惑为什么这不起作用。

问题是选择器(变量“y”)是一个局部变量,它会立即被销毁,导致无法执行所需的行为。 解决办法是让它成为类的一个属性:

self.y = roi.new_ROI(self.con_img)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM