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 图形故障的主要内容,如果未能解决你的问题,请参考以下文章
带有 Qt5Agg 后端的 matplotlib 返回空的刻度标签