Графический сбой 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 

person Snow bunting    schedule 26.12.2018    source источник
comment
Какую версию библиотек вы используете? в Linux с PySide2 5.12 и matplotlib 3.0.2 корректно работает с useblit = True.   -  person eyllanesc    schedule 27.12.2018
comment
Извините, забыл об этом, отредактировал вопрос. Итак, useblit=True будет правильным способом сделать это? Также я попытаюсь получить более новую версию pyside2...   -  person Snow bunting    schedule 27.12.2018
comment
да, мне кажется, что проблема будет вызвана его старой версией PySide2 (последние версии LTS с 5.9 и 5.12, поэтому его версия очень старая)   -  person eyllanesc    schedule 27.12.2018
comment
Проблема в том, что conda предоставляет только 5.6, и при удалении и установке с помощью pip я получаю ошибки, как в этом выпуск на conda-forge. Нужно ли мне удалять файл с именем qt.conf и устанавливать как matplotlib, так и pyside2 с помощью pip?   -  person Snow bunting    schedule 27.12.2018
comment
используйте virtualenv и установите пакеты с помощью pip. Кондой не пользуюсь.   -  person eyllanesc    schedule 27.12.2018
comment
Я использую виртуалку. Удалил старый и переустановил то что нужно, спасибо! Работает без проблем с 5.12. Извините за то, что я такой слепой, предполагается, что conda всегда актуальна ^^ Пожалуйста, напишите это как ответ, если хотите.   -  person Snow bunting    schedule 27.12.2018


Ответы (1)


Проблема, похоже, в старой версии PySide2, последняя версия работает правильно. С другой стороны, conda не позволяет использовать последние версии PySide2, поэтому вы должны использовать virtualenv и устанавливать пакеты с помощью pip.

person eyllanesc    schedule 26.12.2018