【问题标题】:How to remove Matplotlib colorbar upon subsequent replots?如何在后续重新绘制时删除 Matplotlib 颜色条?
【发布时间】:2018-06-18 15:46:14
【问题描述】:

我正在尝试在 Matplotlib 中做一些非常直接的事情,但是遇到了很多障碍;在谷歌搜索了几个小时后,我认为这需要一些非常具体的魔法。我只想让我的 GUI 在空白屏幕上启动,然后导入一个需要颜色条的文件 - 如果文件很好,就会添加一个颜色条。如果再次添加文件(或不同的文件),颜色条将被移除并绘制一个新的。如果文件不正确,我们将重置为初始条件(没有颜色条或绘图)。我真的希望下面的代码对我在这里得到的东西有意义,非常感谢您提前提供的帮助和时间:

import sys
import os
import random
import matplotlib
matplotlib.use('Qt5Agg')
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QGridLayout, QFileDialog, QPushButton

import numpy as np
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure


class MyMplCanvas(FigureCanvas):

    def __init__(self, parent=None, width=5, height=4, dpi=100):
        MyMplCanvas.fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = MyMplCanvas.fig.add_subplot(111)

        self.compute_initial_figure()

        FigureCanvas.__init__(self, MyMplCanvas.fig)
        self.setParent(parent)

        FigureCanvas.setSizePolicy(self,
                                   QtWidgets.QSizePolicy.Expanding,
                                   QtWidgets.QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

    def compute_initial_figure(self):
        pass


class MyDynamicMplCanvas(MyMplCanvas):

    def __init__(self, *args, **kwargs):
        MyMplCanvas.__init__(self, *args, **kwargs)

    def compute_initial_figure(self):
        C=np.random.rand(500).reshape((20,25))
        S=np.random.rand(500).reshape((20,25))
        dc = self.function(S,C)
        im = self.axes.imshow(dc, alpha = 0)

        MyMplCanvas.fig.patch.set_facecolor('k')
        self.axes.patch.set_facecolor('k')

        # don't want to show the cb initially (imagine GUI starts on a blank screen)
        #cb = MyMplCanvas.fig.colorbar(im, ax=self.axes,
                                    #orientation='vertical')#,use_gridspec=True)??

    def update_figure(self):
        # need something like the below to delete subsequent colorbars if they exist:
        #if MyMplCanvas.fig.axes[1] is not None:
#            MyMplCanvas.fig.delaxes(MyMplCanvas.fig.axes[1]) #remove colorbar
        self.axes.cla()

        if P1.df: #datafile is good
            MyMplCanvas.fig.patch.set_facecolor('w')
            self.axes.patch.set_facecolor('w')
            C=np.random.rand(500).reshape((20,25))
            S=np.random.rand(500).reshape((20,25))
            dc = self.function(S,C)

            im = self.axes.imshow(dc)
            cb = MyMplCanvas.fig.colorbar(im, ax=self.axes,
                                    orientation='vertical')#,use_gridspec=True)??
        else: #datafile was bad, or they pressed cancel
            C=np.random.rand(500).reshape((20,25))
            S=np.random.rand(500).reshape((20,25))
            dc = self.function(S,C)
            im = self.axes.imshow(dc, alpha = 0)

            MyMplCanvas.fig.patch.set_facecolor('k')
            self.axes.patch.set_facecolor('k')

        self.show()
        self.draw()

    def function(self,s,c):
        return s*2+c

class P1(QtWidgets.QWidget):

    df = False

    def __init__(self, parent=None):
        super(P1, self).__init__(parent)
        layout = QGridLayout(self)

        self.button_browse1 = QPushButton('Browse Good', self)
        self.button_browse1.clicked.connect(self.browseFile1)
        layout.addWidget(self.button_browse1, 1, 1, 1, 1)
        self.button_browse1.show()

        self.button_browse2 = QPushButton('Browse Bad', self)
        self.button_browse2.clicked.connect(self.browseFile2)
        layout.addWidget(self.button_browse2, 2, 1, 1, 1)
        self.button_browse2.show()

        self.dc = MyDynamicMplCanvas(self, width=5, height=4, dpi=100)
        layout.addWidget(self.dc, 3, 1, 1, 1)

    def browseFile1(self):
        P1.df = True
        self.dc.update_figure()

    def browseFile2(self):
        P1.df = False
        self.dc.update_figure()

class MainWindow(QtWidgets.QMainWindow):    
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

        self.stack = QtWidgets.QStackedWidget(self)
        P1f = P1(self)
        self.stack.addWidget(P1f)
        self.setCentralWidget(self.stack)

if __name__ == '__main__':
    qApp = QtWidgets.QApplication(sys.argv)
    aw = MainWindow()
    aw.show()
    sys.exit(qApp.exec_())

【问题讨论】:

    标签: python python-3.x matplotlib pyqt5 colorbar


    【解决方案1】:

    好的,所以对于其他绊脚石的人来说,诀窍是在您第一次通过其所在的顶级类(即MyMplCanvas.cbar = MyMplCanvas.fig.colorbar(im))绘制(初始图形)时首先定义您的颜色条。即使您还不想使用它,提前定义它也非常重要。

    然后在更新绘图函数的顶部,只需调用MyMplCanvas.cbar.remove()

    【讨论】:

      猜你喜欢
      • 2018-03-27
      • 1970-01-01
      • 2018-03-31
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      • 1970-01-01
      • 2022-01-05
      相关资源
      最近更新 更多