为什么我不能在 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_())
当我点击“绘制地图”时,它会绘制一个颜色图。然后我希望它允许我用鼠标绘制一个感兴趣的区域,并使用下面这个 link 上的代码获得一个掩码。
https://github.com/martindurant/misc/blob/master/ROI.py
导入的“ROI_class”只是上面link中代码的复制粘贴。
我可以在 GUI 上成功绘制绘图,但是当我单击“roi”时,它不允许我绘制感兴趣的区域。
当我创建一个新文件并将代码粘贴到上面的 link 中时,类似
fig, ax1 = plt.subplots()
s = ax1.imshow(img, cmap ='jet')
ax1.set_xlabel('subcolor')
ax1.set_ylabel('ylabel')
y = new_ROI(s)
在代码的最后,它工作得很好,我能够绘制感兴趣的区域并得到它的掩码。
但是当我尝试在 GUI 中执行此操作时,它不会让我绘制感兴趣的区域。我很困惑为什么这不起作用。
问题在于选择器(变量“y”)是一个局部变量,它会立即被破坏,导致无法执行所需的行为。解决方案是使它成为 class:
的属性
self.y = roi.new_ROI(self.con_img)
我正在尝试在 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_())
当我点击“绘制地图”时,它会绘制一个颜色图。然后我希望它允许我用鼠标绘制一个感兴趣的区域,并使用下面这个 link 上的代码获得一个掩码。
https://github.com/martindurant/misc/blob/master/ROI.py
导入的“ROI_class”只是上面link中代码的复制粘贴。
我可以在 GUI 上成功绘制绘图,但是当我单击“roi”时,它不允许我绘制感兴趣的区域。
当我创建一个新文件并将代码粘贴到上面的 link 中时,类似
fig, ax1 = plt.subplots()
s = ax1.imshow(img, cmap ='jet')
ax1.set_xlabel('subcolor')
ax1.set_ylabel('ylabel')
y = new_ROI(s)
在代码的最后,它工作得很好,我能够绘制感兴趣的区域并得到它的掩码。
但是当我尝试在 GUI 中执行此操作时,它不会让我绘制感兴趣的区域。我很困惑为什么这不起作用。
问题在于选择器(变量“y”)是一个局部变量,它会立即被破坏,导致无法执行所需的行为。解决方案是使它成为 class:
的属性self.y = roi.new_ROI(self.con_img)