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