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

matplotib RectangleSelector graphical glitch in Qt5 app

我尝试在 Qt5 应用程序中使用 Matplotlib 并想使用 RectangleSelector,但是根据参数 useblit 我得到图形故障或 selector 消失。

然而,当 selecting 时,我得到一个奇怪的图形故障,整个图似乎移动到左上角,在底部和右侧留下 1cm 黑色(或透明,如我的截图显示)。这里发生了什么?

复制

这将打开一个带有绘图和一些随机数据的 Qt5 window。只要你 select 一些数据,它就会 - 为了演示 - 清除轴并绘制新的东西。

如果我们设置 useblit=False,RectangleSelector 在第一个 ax.clear() 之后消失,如果我们有 useblit=True,我们会在底部和右侧得到大约 1cm 的黑色,而 selecting(见图)。

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 上,select离子来自 conda list

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

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