代码之家  ›  专栏  ›  技术社区  ›  Mathieu Gauquelin

matplotlib和透明度图

  •  5
  • Mathieu Gauquelin  · 技术社区  · 8 年前

    我正在与 matplotlib PyQt5 Python 3.6 。我在创建的窗口中添加了一个图形,我希望将此图形的背景设置为透明,因为我在窗口的背景中添加了一个图像。但是,图形并不是真正透明的,它复制了窗口的背景图像。 例如,有人两年前处理过同样的问题: matplotlib and pyqt4 transparent background

    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_())
    

    我花了很长时间寻找答案,但还没有找到解决方案。谢谢你的帮助!

    • 操作系统:Windows 7 Pro
    • Python版本:Python 3.6
    • 狂蟒之灾3
    1 回复  |  直到 8 年前
        1
  •  11
  •   ImportanceOfBeingErnest    8 年前

    出现问题的原因是背景图像被设置为小部件的调色板。这导致画布继承调色板,因此画布也将图像作为背景,以某种方式覆盖小部件的背景。

    解决方案是将画布的背景设置为透明。一种简单的方法是使用样式表。

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

    完整示例:

    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_())
    

    enter image description here