matplotlib和透明度图

Mat*_*lin 1 background pyqt matplotlib transparent

我正在与matplotlib图书馆PyQt5合作Python 3.6.我在我创建的窗口中添加了一个图形,并且我希望将此图形的背景设置为透明,因为我将图像添加到窗口的背景中.但是,这个数字并不是真正透明,它复制了窗口的背景图像.例如,有人在两年前处理同样的问题: matplotlib和pyqt4透明背景

这是一个工作示例(背景为黑色,但图形不是黑色):

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_())
Run Code Online (Sandbox Code Playgroud)

我在很长时间内寻找答案,但还没有找到解决方案.感谢您提供的任何帮助!

  • 操作系统:Windows 7 Pro
  • Matplotlib版本:2.0.2(通过Anaconda安装,conda安装matplotlib --channel conda-forge)
  • Python版本:Python 3.6
  • 蟒蛇3

Imp*_*est 6

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

解决方案是将画布的背景设置为透明.一个简单的方法是样式表.

self.canvas.setStyleSheet("background-color:transparent;")
Run Code Online (Sandbox Code Playgroud)

请注意,这与将贴片的facecolor设置为none不同.该图有一个背景,在matplotlib中控制,但作为PyQt对象的画布也有背景.

完整的例子:

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_())
Run Code Online (Sandbox Code Playgroud)

这可能看起来像

在此输入图像描述