Графический сбой matplotib RectangleSelector в приложении Qt5
Я пытаюсь использовать Matplotlib в приложении Qt5 и хотел бы использовать RectangleSelector, но в зависимости от параметра useblit
Я получаю либо графические глюки, либо селектор исчезает.
Однако при выборе я получаю странный графический сбой, когда весь график кажется перемещенным в верхний левый угол, оставляя 1 см в нижней и правой части черным (или прозрачным, как показано на моем скриншоте). Что здесь происходит?
репродукция
Откроется окно Qt5 с графиком и некоторыми случайными данными. Как только вы выберете некоторые данные, они для демонстрации очистят ось и нанесут что-то новое.
Если мы установим useblit=False
, RectangleSelector исчезает после первого ax.clear()
, если у нас есть useblit=True
мы получаем около 1 см черноты в нижней и правой части при выборе (см. рисунок).
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
1 ответ
Проблема, кажется, в старой версии PySide2, с последней версией, работающей правильно. С другой стороны, conda не позволяет использовать последние версии PySide2, поэтому вы должны использовать virtualenv и устанавливать пакеты с помощью pip.