matplotlib和透明图形

matplotlib和透明图形,matplotlib,background,pyqt,transparent,Matplotlib,Background,Pyqt,Transparent,我正在使用matplotlib库和PyQt5使用python3.6。我在我创建的窗口中添加了一个人物,我希望将这个人物的背景设置为透明,因为我在窗口的背景中添加了一个图像。但是,图形不是真正透明的,它复制了窗口的背景图像。 例如,两年前有人处理过同样的问题: 下面是一个工作示例(背景为黑色,但图形不是黑色): 我花了很长时间寻找答案,但还没有找到解决办法。谢谢你能带来的任何帮助 操作系统:Windows7Pro Matplotlib版本:2.0.2(通过Anaconda安装,conda安装M

我正在使用
matplotlib
库和
PyQt5
使用
python3.6
。我在我创建的窗口中添加了一个人物,我希望将这个人物的背景设置为透明,因为我在窗口的背景中添加了一个图像。但是,图形不是真正透明的,它复制了窗口的背景图像。 例如,两年前有人处理过同样的问题:

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

我花了很长时间寻找答案,但还没有找到解决办法。谢谢你能带来的任何帮助

  • 操作系统:Windows7Pro
  • Matplotlib版本:2.0.2(通过Anaconda安装,conda安装Matplotlib--通道conda forge)
  • Python版本:Python 3.6
  • 水蟒3

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

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

self.canvas.setStyleSheet("background-color:transparent;")
请注意,这与将面片的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_())
然后看起来像


我认为对这个问题进行深入研究会有所帮助,这样想在这个问题上进行试验的人就可以轻松开始。完成。很抱歉,今天早上我没有时间这么做。这个示例既不可运行,也不可最小化。由于这个问题已经被问了两年,而且一直没有得到回答,因此,从本质上说,唯一能让你的问题不至于落得如此下场的办法就是提供问题的答案。也就是说,忘记你的代码。编写可运行的新代码(可以从问题中复制和粘贴)并显示问题。现在是;)我不知道如何找到一个经典的图像都在他的电脑上。谢谢它的工作!我总是发现Qt和matplotlib,所以我没有想过尝试一下。
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_())