Pyqt5中设置matplotlib绘图区背景透明
一、前言
最近组里接了学校的某项目,作者是团队里面负责做前端展示的,但是说实话,感觉QT做前端展示真不是很方便,开发过程中遇到不少棘手的问题。
其中一个卡了我一段时间的是界面画图表时设置图表的透明度,我尝试了不少网络上的方法,有不少都是错的,实现不了功能,导致界面很丑,我给个样图:
我画了个雷达图,我窗口背景是绿色的,但是matplotlib的Figure画布是白色底色的,这跟背景格格不入,于是我想更改其背景颜色或透明度。
二、失败的尝试
-
尝试一
我按照别人教程所说,利用下面的代码,设置FigureCanvasQTAgg对象的属性实现透明
self.canvas.setStyleSheet("background-color: rgba(0, 0, 0, 0);") # 设置透明背景
-
尝试二
第二次尝试,依然失败,因为坐标区域ax的方法fill其设置的ahpha值是针对绘图时候封闭区域透明度设置的
ax.fill(angles, values, alpha=0.2)
比如上面雷达图,设置上面的参数后,是如下效果:
-
尝试三
这一次,网友们说要在开始创建时通过设置facecolor以及alpha值来调整透明度
self.figure = plt.figure(facecolor='skyblue', alpha=0)
可是实测这就是瞎扯,看效果
尝试了这么多方法都成功不了,肺都要气炸了😡😡😡😡😡😡😡😡😡😡😡😡😡😡
三、苦后甘甜
经过多次尝试逐渐把他们摸索明白了,具体的设置项如下
-
设置绘制的图像本身透明
ax.plot(angles, values, 'o-', linewidth=2, alpha=0)
-
设置画布透明
self.figure.patch.set_alpha(0)
-
设置绘图区域透明
ax.patch.set_alpha(0)
-
设置边框透明
-
极坐标:这里的
polar
表示极坐标ax.spines['polar'].set_alpha(0)
-
直角坐标:下面的代码循环分别设置直角坐标上下左右的边框透明度
for spine in ax.spines.values(): spine.set_alpha(0)
-
-
设置绘图内容封闭区域或波形区域透明度
ax.fill(angles, values, alpha=0.5)
- 封闭区域区域
- 折线区域
-
设置网格线透明度
ax.xaxis.grid(True, color='gray', linestyle='--', alpha=0) # 设置网格线透明度 ax.yaxis.grid(True, color='gray', linestyle='--', alpha=1)
四、心灵的救赎
- 什么都无法舍弃的人,什么都无法实现。 ——《进击的巨人》
- 人人都知道没有圆满,但是期待圆满,就是关于遗憾最浪漫的答案。 ——《奇葩说7》
- 只有你的快乐和幸福不附属于任何人或物的时候,你才真正自由。否则,无论你被关在监狱里还是走在大街上,你依然是自己的囚犯。 《心灵午夜密谈》
- 在芸芸众生里,做一个普通的人,享受生命一刹那间的喜悦。那么我们即使不死,也在天堂了。 ——《三毛》