pyplot legends font matplotlib background pyqt transparent

legends - matplotlib y figura de transparencia



plot title font size matplotlib (1)

Estoy trabajando con la biblioteca PyQt5 y PyQt5 con Python 3.6 . Agregué una figura en una ventana que creo, y deseo establecer el fondo transparente de esta figura porque agrego una imagen al fondo de la ventana. Pero, la figura no es realmente transparente, duplica la imagen de fondo de la ventana. Por ejemplo, alguien hace frente al mismo problema hace dos años: fondo transparente matplotlib y pyqt4

Aquí hay un ejemplo de trabajo (con un fondo que es negro pero la figura no es negra):

import sys, os from PyQt5.QtCore import Qt from PyQt5.QtGui import * from PyQt5.QtWidgets import * import matplotlib matplotlib.use(''Qt5Agg'') # Make sure that we are using QT5 from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar from matplotlib.figure import Figure import matplotlib.pyplot as plt class SecondWindow(QWidget): def __init__(self, parent=None): super(SecondWindow, self).__init__(parent) self.setupUi(self) def setupUi(self, Form): # WINDOW SETTINGS Form.setWindowTitle(''Hello'') self.p = QPalette() self.pixmap = QPixmap(os.getcwd() + "/logo.png").scaled(self.size(), Qt.IgnoreAspectRatio, Qt.SmoothTransformation) self.p.setBrush(QPalette.Background, QBrush(self.pixmap)) self.setPalette(self.p) # CREATE FIGURE AND SETTINGS self.figure = plt.figure() self.figure.patch.set_facecolor(''None'') self.figure.patch.set_alpha(0) self.canvas = FigureCanvas(self.figure) self.axes = self.figure.add_subplot(111) # WINDOW LAYOUT (with H1 and H2) self.setLayout(QVBoxLayout()) self.layout().addWidget(self.canvas,1) self.layout().setContentsMargins(50, 50, 50, 50) if __name__ == ''__main__'': app = QApplication(sys.argv) form = SecondWindow() form.show() sys.exit(app.exec_())

Busco respuestas durante largas horas pero aún no encontré una solución. Gracias por cualquier ayuda que pueda traer!

  • Sistema operativo: Windows 7 Pro
  • Matplotlib Version: 2.0.2 (instalado a través de Anaconda, conda install matplotlib --channel conda-forge)
  • Versión de Python: Python 3.6
  • Anaconda 3

El problema ocurre porque la imagen de fondo está configurada como una paleta para el widget. Esto hace que el lienzo herede la paleta y, por lo tanto, el lienzo también tendrá la imagen como fondo, superponiendo de algún modo el fondo del widget.

Una solución sería establecer el fondo del lienzo transparente. Una manera fácil de hacerlo son las hojas de estilo.

self.canvas.setStyleSheet("background-color:transparent;")

Tenga en cuenta que esto no es lo mismo que establecer los parches ''facecolor en ninguno. La figura tiene un fondo, que se controla dentro de matplotlib, pero el lienzo, al ser un objeto PyQt, también tiene un fondo.

Ejemplo completo:

import sys, os from PyQt4.QtCore import Qt from PyQt4.QtGui import * import matplotlib matplotlib.use(''Qt4Agg'') from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar from matplotlib.figure import Figure import matplotlib.pyplot as plt plt.rcParams[''xtick.color''] ="w" plt.rcParams[''ytick.color''] ="w" plt.rcParams[''font.size''] = 14 class SecondWindow(QWidget): def __init__(self, parent=None): super(SecondWindow, self).__init__(parent) # CREATE FIGURE AND SETTINGS self.figure = plt.figure() self.figure.patch.set_facecolor("None") self.canvas = FigureCanvas(self.figure) self.axes = self.figure.add_subplot(111) self.axes.patch.set_alpha(0.5) ###### Make the background of the canvas transparent self.canvas.setStyleSheet("background-color:transparent;") self.p = QPalette() self.p.setBrush(QPalette.Background, QBrush(QPixmap("house.png"))) self.setPalette(self.p) self.setLayout(QVBoxLayout()) self.layout().addWidget(self.canvas,1) self.layout().setContentsMargins(50, 50, 50, 50) if __name__ == ''__main__'': app = QApplication(sys.argv) form = SecondWindow() form.show() sys.exit(app.exec_())

que luego podría verse como