Skip to content

[Bug Windows] Colorbar not appear during animation when changing colormap #9573

@Goczilla

Description

@Goczilla

Bug report

Bug summary

I created a subplot in a figure for displaying an image with imshow, and I add a colorbar. With no animation, I can change the colormap changing the value of the ComboBox and the colorbar is updated correctly.

But if I add an animation, the colorbar disappear each time I change the colormap. I have to click on another window (other software, etc) or resize the GUI to see the colorbar again.

This problem seems to be only on Windows (someone test my code on Linux and no bug)

Code for reproduction

Sorry for the size of the example :

import sys
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import *
    
    import matplotlib
    matplotlib.use('Qt5Agg')
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    import matplotlib.pyplot as plt
    from mpl_toolkits.axes_grid1 import make_axes_locatable
    from matplotlib import animation
    
    class FenetrePrincipale(QWidget):
        def __init__(self, parent=None):
            super(FenetrePrincipale, self).__init__(parent)
            self.setupUi(self)
    
        # Fonction de configuration de la classe
        def setupUi(self, Form):
            self.Form = Form
    
            Form.setMinimumSize(1220, 850)
    
            self.creation_GUI()
            self.creation_figure()
            self.creation_layout()
    
            self.tabWidget.setCurrentIndex(0)
            self.Bouton_quitter.clicked.connect(self.close)
            self.anim = animation.FuncAnimation(self.figure, self.animate, interval=10, blit=True)
            self.Widget_choixPalette_ComboBox.currentIndexChanged.connect(self.changementPalette)

        def changementPalette(self, onglet):
            self.image.set_cmap('binary')
            self.canvas.draw()
    
        def animate(self, i):
            # a = self.thread_1.img
            self.image.set_array(self.imageInit)
            return [self.image]
    
        def resizeEvent(self, QResizeEvent):
            self.tabWidget.setMinimumSize(QSize(self.width() - 20, self.height() - 60))
    
        def creation_GUI(self):
            self.tabWidget = QTabWidget()
            self.tab1 = QWidget()
            self.tabWidget.addTab(self.tab1, "  Tab1  ")
    
            self.Widget_choixPalette_Label = QLabel(self.tab1)
            self.Widget_choixPalette_Label.setText("Text1")
            self.Widget_choixPalette_ComboBox = QComboBox(self.tab1)
            self.Widget_choixPalette_ComboBox.addItem("Try1")
            self.Widget_choixPalette_ComboBox.addItem("Try2")
    
            self.Bouton_quitter = QPushButton(self.tab1)
            self.Bouton_quitter.setText("Quit")
    
        def creation_layout(self):
            LayoutForm = QGridLayout(self)
            LayoutForm.addWidget(self.tabWidget, 0, 0, 1, 1)
    
            LayoutTab1 = QGridLayout(self.tab1)
    
            LayoutTab1.addWidget(self.Widget_choixPalette_Label, 0, 1, 1, 1)
            LayoutTab1.addWidget(self.Widget_choixPalette_ComboBox, 1, 1, 1, 1)
            self.Widget_choixPalette_ComboBox.setMinimumWidth(200)
    
            LayoutTab1.addWidget(self.canvas, 2, 0, 1, 3)
            LayoutTab1.addWidget(self.Bouton_quitter, 2, 3, 1, 1, Qt.AlignRight | Qt.AlignBottom)
    
            LayoutTab1.setRowStretch(2, 1)
            LayoutTab1.setColumnStretch(0, 1)
            LayoutTab1.setColumnStretch(2, 1)
    
        def creation_figure(self):
            # Create figure (transparent background)
            self.figure = plt.figure()
            # self.figure.patch.set_facecolor('None')
            self.canvas = FigureCanvas(self.figure)
            self.canvas.setStyleSheet("background-color:transparent;")
    
            # Adding one subplot for image
            self.axe0 = self.figure.add_subplot(111)
            self.axe0.get_xaxis().set_visible(False)
            self.axe0.get_yaxis().set_visible(False)
    
            # Data for init image
            self.imageInit = [[255] * 320 for i in range(240)]
            self.imageInit[0][0] = 0
    
            # Init image and add colorbar
            self.image = self.axe0.imshow(self.imageInit, interpolation='none')
            divider = make_axes_locatable(self.axe0)
            cax = divider.new_vertical(size="5%", pad=0.05, pack_start=True)
            self.colorbar = self.figure.add_axes(cax)
            self.figure.colorbar(self.image, cax=cax, orientation='horizontal')
    
            plt.subplots_adjust(left=0, bottom=0.05, right=1, top=1, wspace=0, hspace=0)
    
            self.canvas.draw()
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        # QApplication.setStyle(QStyleFactory.create("plastique"))
        form = FenetrePrincipale()
        form.show()
        sys.exit(app.exec_())

Actual outcome

The colorbar is not visible when changing colormap during animation

Expected outcome

See my colorbar at any time.

Matplotlib version

  • Operating system: Windows 7 Pro
  • Matplotlib version: 2.1.0
  • Matplotlib backend: Qt5Agg
  • Python version: 3.6

Metadata

Metadata

Assignees

Labels

status: closed as inactiveIssues closed by the "Stale" Github Action. Please comment on any you think should still be open.status: inactiveMarked by the “Stale” Github Actiontopic: animation

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions