在数据可视化中,透明度设置可以使图表更具层次感,特别是在多层叠加图表时。matplotlib库提供了多种方法来设置图表各个部分的透明度,包括图形、文本、图例、坐标轴等部分。
设置透明色的主要原因包括:
如果不做特别说明,我们遵循以下原则:
所有出现的【ax】均为坐标轴对象,【figure】为画布对象;ax和figure是成对出现的,调整样式主要是使用【ax】。
figure, ax = plt.subplots()
所有【plt】开始的函数调用都是我们对未保存的绘图对象的图像的样式设置,这种方法不利于在有多个绘图对象时,单独处理其中一个。
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体
plt.rcParams['font.family'] = 'SimHei'
# 生成数据
x = np.linspace(0, 20, 100)
y = np.sin(x)
# 创建图形和子图,并设置画布颜色为 #00C9A7
fig, ax = plt.subplots(figsize=(10, 6), dpi=150, facecolor='#00C9A7')
ax.plot(x, y)
ax.set_title("图形透明设置-baseline-无透明参考图")
ax.legend(['正弦曲线'])
plt.show()
效果:

【3.1】所示的图,青色部分以及被绘图区遮住的区域属于画布区域。
需要注意的是,下面设置的透明效果由于施加对象是最底层的对象——画布,完全透明后用plt.show(),画布会呈现白色。如果要看到真正的效果,需要将其保存下来【plt.show()】将图片显示后是可以看到保存的按钮。
plt.subplots(figsize=(10, 6), dpi=150, facecolor='none')
#FFFFFF"即白色背景。fig, ax = plt.subplots(figsize=(10, 6), dpi=150, facecolor='none')
该处设置同上,仅设置的时间不同,对绘图效果无影响。
figure.patch.set_alpha(0)
其中fig是plt.figure对象,常常由下面的语句给出:
figure, ax = plt.subplots()

import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 生成数据
x = np.linspace(0, 20, 100)
y = np.sin(x)
plt.subplots(figsize=(10, 6), dpi=150, facecolor='none')
plt.plot(x, y, label='正弦曲线')
plt.title("图形透明设置-baseline-画布透明")
plt.legend()
# fig, ax = plt.subplots(figsize=(10, 6), dpi=150, facecolor='none')
# ax.plot(x, y)
# ax.set_title("图形透明设置-baseline-画布透明")
# ax.legend(['正弦曲线'])
plt.show()
如不特别说明,本节所有【ax】均为一个坐标轴对象
ax.patch.set_alpha(0)
或
ax.patch.set_facecolor('none')
或
ax.set_facecolor('none')
plt.rcParams['axes.facecolor'] = 'none'
该方法设置的是全局参数,即每个绘图都会绘图区背景透明;除非你单独用方法1、2、3单独设置某个绘图的参数。

import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# plt.rcParams['axes.facecolor'] = 'none'
# 生成数据
x = np.linspace(0, 20, 100)
y = np.sin(x)
# 创建图形和子图,并设置画布颜色为 #00C9A7
fig, ax = plt.subplots(figsize=(10, 6), dpi=150, facecolor='#00C9A7')
ax.plot(x, y)
# 下面三条为测试效果语句,取消注释即可运行
# ax.patch.set_alpha(0)
# ax.set_facecolor('none')
# ax.patch.set_facecolor('none')
ax.set_title("图形透明设置-绘图区背景透明")
ax.legend(['正弦曲线'])
plt.show()
ax.plot(x, y, alpha=0.1)
alpha:不透明度的设置,值越大越不透明这里不一定是plot可以是散点图,三维图柱状图等等。
plt.legend(['正弦曲线'], framealpha=0)

import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 生成数据
x = np.linspace(0, 20, 100)
y = np.sin(x)
# 创建图形和子图,并设置画布颜色为 #00C9A7
fig, ax = plt.subplots(figsize=(10, 6), dpi=150, facecolor='#00C9A7')
ax.plot(x, y, alpha=0.1)
ax.set_title("图形透明设置-绘制的数据图像本身透明")
ax.legend(['正弦曲线'])
plt.show()
ax.legend(['正弦曲线'], framealpha=0)
framealpha:用于设置图例区域的不透明度;默认情况下,图例是白框打底的。plt.legend(['正弦曲线'], framealpha=0)
下图左右部分分别为framealpha=1和framealpha=0时的效果:

可以看到右边部分透明了,和背景融为一体。
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 生成数据
x = np.linspace(0, 20, 100)
y = np.sin(x)
# 创建图形和子图,并设置画布颜色为 #00C9A7
fig, ax = plt.subplots(figsize=(10, 6), dpi=150, facecolor='#00C9A7')
ax.plot(x, y)
ax.patch.set_alpha(0)
ax.set_title("图形透明设置-图例透明")
ax.legend(['正弦曲线'], framealpha=0)
plt.show()
ax.set_title(title, alpha=0.5)
plt.title(title, alpha=0.5)

ax.set_xlabel('X Axis Label', alpha=0.5)
ax.set_ylabel('Y Axis Label', alpha=0.5)
plt.xlabel("X Axis Label", alpha=0.5)
plt.ylabel("X Axis Label", alpha=0.5)

legend = ax.legend(['正弦曲线'], framealpha=0)
for text in legend.get_texts():
text.set_alpha(0.1) # 设置图例文本不透明度为 0.1

for label in ax.get_xticklabels() + ax.get_yticklabels():
label.set_alpha(0.5)
plt.setp(ax.get_xticklabels() + ax.get_yticklabels(), alpha=0.5)

plt.gca().spines['top'].set_alpha(0)
plt.gca().spines['right'].set_alpha(0)
plt.gca().spines['left'].set_alpha(0)
plt.gca().spines['bottom'].set_alpha(0)
或者
for spine in ['top', 'right', 'left', 'bottom']:
plt.gca().spines[spine].set_alpha(0)
ax.spines['top'].set_alpha(0)
ax.spines['right'].set_alpha(0)
ax.spines['left'].set_alpha(0)
ax.spines['bottom'].set_alpha(0)
或者
for spine in ax.spines.values():
spine.set_alpha(0)
或者
for spine in ['top', 'bottom', 'left', 'right']:
ax.spines[spine].set_alpha(0)

import matplotlib.pyplot as plt
import numpy as np
# 统一设置
title = '图形透明设置-坐标轴脊线透明'
# 设置中文字体
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 生成数据
x = np.linspace(0, 20, 100)
y = np.sin(x)
# 创建图形和子图,并设置画布颜色为 #00C9A7
fig, ax = plt.subplots(figsize=(10, 6), dpi=150, facecolor='#00C9A7')
ax.plot(x, y)
ax.patch.set_alpha(0)
ax.set_title(title, alpha=1)
ax.legend(['正弦曲线'], framealpha=0)
for spine in ax.spines.values():
spine.set_alpha(0)
# fig.savefig(f'保存的图片\\{title}.png', dpi=300)
# plt.show()
ax.tick_params(left=False, right=False, top=False, bottom=False)
其实这也不算透明了,是直接取消掉了

plt.savefig("transparent_plot.png", transparent=True)

transparent=True,整个图像的背景将是透明的。