python - 如何更新 GUI pyqt 内热图的颜色条?

标签 python matplotlib pyqt pyqt5 seaborn

我在使用 heatmpan 和颜色条更新 GUI 时遇到问题,问题是我可以很好地更新热图,但在每次更新中都会添加一个新的颜色条。 我的问题特别是颜色条,我尝试删除颜色条,但是,如果我删除它,它就会从程序中消失,而我需要它。问题可以在附图中看到。

class MainWindow(QtWidgets.QMainWindow):
    send_fig = QtCore.pyqtSignal(str)

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

        self.main_widget = QtWidgets.QWidget(self)
        self.fig = Figure()
        self.ax = self.fig.add_subplot(111)
        self.im=self.ax.images 

        self.canvas = FigureCanvas(self.fig)

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

        self.dropdown1 = QtWidgets.QComboBox()
        self.dropdown1.addItems(["Número de puntos", "Número de transacciones", "Valor promedio de las tx"])
        self.dropdown1.setCurrentIndex(2)

        self.dropdown1.currentIndexChanged.connect(self.update)

        #self.label = QtWidgets.QLabel("A plot:")

        self.layout = QtWidgets.QGridLayout(self.main_widget)
        self.layout.addWidget(QtWidgets.QLabel("Selecciona una categoría"))
        self.layout.addWidget(self.dropdown1)
        self.layout.addWidget(self.canvas)

        self.setCentralWidget(self.main_widget)
        self.show()
        self.update()

    def update(self):


        self.ax.clear()

        datosHeatMap = pd.read_csv(r"\file.csv")

        df = pd.DataFrame(datosHeatMap, columns =["id_comercio","HoraNumero","Hora","DiaNum","Día","Puntos","Transacciones","Clientes","Valor","Cargas","Redenciones"])
        puntos = []
        puntos.append(df.pivot("HoraNumero","DiaNum","Puntos").fillna(0).astype(float))
        puntos.append(df.pivot("HoraNumero","DiaNum","Transacciones").fillna(0).astype(float))
        puntos.append(df.pivot("HoraNumero","DiaNum","Valor").fillna(0).astype(float))

        dias=[]

        numDia = {0:"Lunes",1:"Martes",2:"Miercoles",3:"Jueves",4:"Viernes",5:"Sabado",6:"Domingo",}

        dias.append(list(puntos[0].columns))
        dias.append(list(puntos[1].columns))
        dias.append(list(puntos[2].columns))

        cat1_index = self.dropdown1.currentIndex()
        cat1_text = self.dropdown1.currentText()


        self.ax.set_title(cat1_text)

        sns.heatmap(puntos[cat1_index],cmap="YlGnBu",vmin=puntos[cat1_index].values.min(),vmax=puntos[cat1_index].values.max(),center=np.median(puntos[cat1_index].values), ax= self.ax)
        self.ax.collections[-1].colorbar.update_normal(self.ax)
        #this is a list of all images that have been plotted
        #self.ax.collections[-1].colorbar.set_clim(puntos[cat1_index].values.min(),puntos[cat1_index].values.max())
        self.ax.set_xticklabels(list(map(numDia.get, dias[cat1_index])))
        self.fig.canvas.draw_idle()


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    win = MainWindow()
    sys.exit(app.exec_())

每次更新都会添加彩条

最佳答案

每次调用 sns.heatmap 都会创建一个新的颜色条。

您应该在初始化函数中创建一个用于颜色条的特定轴。我在这里使用 GridSpec 创建一个比主轴细 10 倍的轴。还有很多其他方法可以创建这个轴,只需在此处搜索即可。

def __init__(self):
    (...)
    self.fig = Figure()
    gs00 = matplotlib.gridspec.GridSpec(1, 2, width_ratios=[10,1])
    self.ax = self.fig.add_subplot(gs00[0])
    self.cax = self.fig.add_subplot(gs00[1])
    (...)

然后将此对象的引用传递给 sns.heatmap:

def update(self):
    (...)
    sns.heatmap(..., ax=self.ax, cbar_ax=self.cax)
    (...)

关于python - 如何更新 GUI pyqt 内热图的颜色条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53034238/

相关文章:

python - 如何同时从单词列表中检查并删除 '/' 和 '-'

python - 如何为子图设置 xlim 和 ylim

Python 颜色条 : how to stop its repeating in for loop

python - Python为私有(private)方法添加类名的地方

python - 使用 Python 编写控制台输出(空格分隔的文本)以分隔 Excel 工作表的列

python - Scipy:具有稀疏矩阵的线性规划

python - matplotlib:在散点图上方绘制直方图

python - 将整个 *ui 文件加载到另一个 *.ui 文件的框架/小部件中

python - PyQt 中的 QUiLoader.createWidget 等价物

python - Qlabel 中的像素图图像大小