【问题标题】:Colorbar disappear during animation of image when changing colormap更改颜色图时,颜色条在图像动画期间消失
【发布时间】:2018-04-07 21:36:54
【问题描述】:

我在图中创建了一个子图,用于使用 imshow 显示图像,并添加了一个颜色条。在没有动画的情况下,我可以更改颜色图以更改 ComboBox 的值,并且颜色栏会正确更新。

但如果我添加动画,则每次更改颜色图时颜色栏都会消失。我必须单击另一个窗口(其他软件等)或调整 GUI 大小才能再次看到颜色条。

这是一个理解问题的例子:

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_())

当我在组合框中选择任何选项更改颜色图时:

我等着看的:

  • 操作系统:Windows 7 Pro

  • Matplotlib 版本:2.1.0

  • Matplotlib 后端:Qt5Agg

  • Python 版本:3.6

【问题讨论】:

  • 我无法重现这个(在 linux 上使用 python 3.6.2、qt 5.9.2、pyqt 5.9、matplotlib-2.1.0)。
  • 所以你不知道它是从哪里来的?
  • 好吧,它看起来可能是一个只影响 Windows 用户的 matplotlib 错误。但是我不能在windows上自己测试,所以我很难分析原因。我想您可以尝试使用旧版本的 matplotlib 进行测试 - 如果没有问题,它似乎可以确认某种错误。您搜索过bug tracker 是否有类似问题?
  • 我已经更新了我的 matplotlib 版本,但没有什么新东西。所以对我来说这是一个错误。我在错误跟踪器上创建了一个帖子,看看是否有人可以帮助我。有人有 Windows,他可以测试我的代码是否仅在 Windows 上?

标签: matplotlib pyqt colorbar colormap


【解决方案1】:

a]blit=False

在动画中使用blit=False。否则,只有图像本身会被更新,并且整个画布的重绘会推迟到一些需要重绘的事件,例如调整大小事件。

b] 暂停动画

如果您无法使用blit=False,您可以暂停动画,更改颜色图,绘制画布,然后继续动画。

def changementPalette(self, onglet):
    self.anim.event_source.stop()
    if onglet==0:
        self.image.set_cmap('viridis')
    else:
        self.image.set_cmap('binary')
    self.canvas.draw_idle()
    self.anim.event_source.start()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 2014-08-15
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 2016-12-13
    相关资源
    最近更新 更多