Qt5 应用程序中的 matplotlib RectangleSelector 图形故障

Posted

技术标签:

【中文标题】Qt5 应用程序中的 matplotlib RectangleSelector 图形故障【英文标题】:matplotib RectangleSelector graphical glitch in Qt5 app 【发布时间】:2018-12-26 20:47:25 【问题描述】:

我尝试在 Qt5 应用程序中使用 Matplotlib,并希望使用 RectangleSelector,但根据参数 useblit,我得到图形故障或选择器消失。

但是在选择时,我得到一个奇怪的图形故障,整个绘图似乎移动到左上角,在底部留下 1 厘米,右侧黑色(或透明,如我的屏幕截图所示)。这里发生了什么?

复制

这将打开一个带有绘图和一些随机数据的 Qt5 窗口。只要您选择了一些数据,它就会(用于演示)清除轴并绘制新的东西。

如果我们设置useblit=False,矩形选择器在第一个ax.clear()之后消失,如果我们设置useblit=True,我们在选择时底部和右侧会得到大约1cm的黑度(见图)。

import sys
import matplotlib
import random
matplotlib.use('Qt5Agg')

from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
#from matplotlib.widgets import SpanSelector
from matplotlib.widgets import RectangleSelector

class Window(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.figure = Figure()
        self.ax = self.figure.add_subplot(111)
        self.canvas = FigureCanvas(self.figure)

        # First data
        self.ax.plot([random.random() for _ in range(50)])

        # Embedding plot into Qt
        layout = QVBoxLayout()
        layout.addWidget(self.canvas)
        self.setLayout(layout)

        self.x = RectangleSelector(self.ax, self.onselect_xy,
                                   drawtype='box',
                                   useblit=False,     # or True?
                                   rectprops='alpha':0.5, 'facecolor':'red',
                                   interactive=True)

        self.canvas.draw()


    def onselect_xy(self, *args, **kwargs):
        self.ax.clear()
        self.ax.plot([random.random() for _ in range(50)])
        self.canvas.draw()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = Window()
    main.show()
    sys.exit(app.exec_())

版本

在 macOS 10.13.6 HighSierra 上,从conda list 中选择:

python                    3.7.1                haf84260_7
pyside2                   5.6.0a1          py37h45ccf91_3    conda-forge
matplotlib                3.0.2            py37h54f8f79_0 

【问题讨论】:

您使用的是什么版本的库?在具有 PySide2 5.12 和 matplotlib 3.0.2 的 Linux 中使用 useblit = True 正常工作。 抱歉,忘记了,编辑了问题。所以useblit=True 是正确的方法吗?另外我会尝试获得更新的pyside2版本... 是的,在我看来问题是由旧版本的 PySide2 引起的(最新的 LTS 版本有 5.9 和 5.12,所以它的版本很旧) 问题是,conda 只提供 5.6,当使用 pip 卸载和安装时,我得到错误,就像在这个 issue on conda-forge 中一样。我是否需要删除一个名为“qt.conf”的文件并使用 pip 安装 matplotlib 和 pyside2? 使用 virtualenv 并使用 pip 安装软件包。我不使用 conda。 【参考方案1】:

问题似乎是 PySide2 的旧版本,最新版本可以正常工作。另一方面,conda 不允许使用最新版本的 PySide2,因此您必须使用 virtualenv 并使用 pip 安装软件包。

【讨论】:

以上是关于Qt5 应用程序中的 matplotlib RectangleSelector 图形故障的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib植入PyQt5 + QT5的UI呈现

未找到 Matplotlib Qt5Agg 后端

带有 Qt5Agg 后端的 matplotlib 返回空的刻度标签

在 Matplotlib 3.1.2 中使用 qt5agg 后端,get_backend() 会改变行为

matplotlib 图形参数不出现

带有 PyQt 的 Matplotlib - axes.clear() 非常慢