Как изменить цвет прямоугольника интерактивного зума? - PullRequest
5 голосов
/ 19 апреля 2020

У меня простой интерактивный сюжет. Когда я нажимаю на кнопку увеличительного стекла, я могу нарисовать прямоугольник для интерактивного масштабирования. Вы можете видеть пунктирный прямоугольник на изображении ниже.

enter image description here

Однако, когда я использую белую сетку на темном фоне (с plt.style.use('dark_background')), прямоугольник зума едва виден. Это все еще там, но черное на в значительной степени черном заговоре.

enter image description here

Для полноты графики сгенерированы с помощью Matplotlib 3.1.3 следующим образом:

import matplotlib.pyplot as plt
import numpy as np

plt.style.use('dark_background')

fig = plt.figure()
ax = fig.add_subplot(111)

data = 2.5 * np.random.randn(400) + 3
ax.plot(data)
plt.show()

Поэтому мой вопрос, поэтому : как я могу изменить цвет прямоугольника зума?

1 Ответ

1 голос
/ 21 апреля 2020

Это зависит от того, какой бэкэнд вы используете. Универсального решения (по крайней мере, я не знаю). Как указано в комментариях, это может быть достигнуто только с помощью исправлений обезьян. Вот моя попытка использовать бэкэнд Qt5. Обратите внимание, что для этой работы вам также нужно установить PyQt5.

from PyQt5 import QtGui, QtCore
from matplotlib.backends.backend_qt5 import FigureCanvasQT

# extending the original FigureCanvasQT class

class NewFigureCanvasQT(FigureCanvasQT):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def drawRectangle(self, rect):
        # Draw the zoom rectangle to the QPainter.  _draw_rect_callback needs
        # to be called at the end of paintEvent.
        if rect is not None:
            def _draw_rect_callback(painter):
                pen = QtGui.QPen(QtCore.Qt.red, 1 / self._dpi_ratio, # <-- change the color here
                                 QtCore.Qt.DotLine)
                painter.setPen(pen)
                painter.drawRect(*(pt / self._dpi_ratio for pt in rect))
        else:
            def _draw_rect_callback(painter):
                return
        self._draw_rect_callback = _draw_rect_callback
        self.update()

# do the imports and replace the old FigureCanvasQT
import matplotlib
import matplotlib.pyplot as plt
matplotlib.backends.backend_qt5.FigureCanvasQT = NewFigureCanvasQT
# switch backend and setup the dark background
matplotlib.use('Qt5Agg')
matplotlib.style.use('dark_background')

# do the plotting
plt.plot(range(9))
plt.show()

, который выдает следующее изображение: Result

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...