如何在 GUI pyqt 中更新热图的颜色条?
Posted
技术标签:
【中文标题】如何在 GUI pyqt 中更新热图的颜色条?【英文标题】:How to update the colorbar of a heatmap inside the GUI pyqt? 【发布时间】:2018-10-28 17:27:03 【问题描述】:我在更新带有 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_())
每次更新都会添加彩条
【问题讨论】:
【参考方案1】:每次调用sns.heatmap
都会创建一个新的颜色条。
您应该在 init 函数中创建一个特定的 Axes 用于颜色栏。我在这里使用 GridSpec 创建一个比主轴细 10 倍的轴。还有很多其他方法可以创建此轴,只需在 SO 上搜索即可。
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)
(...)
【讨论】:
以上是关于如何在 GUI pyqt 中更新热图的颜色条?的主要内容,如果未能解决你的问题,请参考以下文章