如何实现matplotlib散点图上层数据点整体均匀透明无叠加加深
Matplotlib 实现散点图层整体均匀透明度的方案
该需求可以在Matplotlib中实现,以下是两种可行方案:
方案1:使用global_alpha参数(推荐,最简实现)
Matplotlib 3.4及以上版本为scatter返回的PathCollection对象提供了global_alpha属性,该属性对整个散点集合统一生效,不会触发单个散点标记的透明度叠加:
import numpy as np import matplotlib.pyplot as plt fig = plt.figure(1, figsize=(6,4), dpi=160) ax = fig.gca() # 绘制下层散点 s1 = ax.scatter(np.random.randn(1000), np.random.randn(1000), color="b", edgecolors="none") # 绘制上层散点 s2 = ax.scatter(np.random.randn(1000), np.random.randn(1000), color="g", edgecolors="none") # 为整个上层散点集合设置统一透明度,替代原有的set_alpha方法 s2.set(global_alpha=0.5) plt.show()
该方案对光栅(PNG、JPG)和矢量(SVG、PDF)格式的输出均兼容,无需额外处理。
方案2:低版本兼容方案(分层渲染合并)
如果你使用的Matplotlib版本低于3.4,可以通过临时画布分层渲染的方式实现效果:
import numpy as np import matplotlib.pyplot as plt from matplotlib.image import BboxImage from matplotlib.transforms import Bbox, TransformedBbox fig = plt.figure(1, figsize=(6,4), dpi=160) ax = fig.gca() # 绘制底层散点 ax.scatter(np.random.randn(1000), np.random.randn(1000), color="b", edgecolors="none") # 创建临时画布绘制上层散点,确保坐标和原画布完全对齐 temp_fig, temp_ax = plt.subplots(figsize=fig.get_figsize(), dpi=fig.dpi) temp_ax.set_xlim(ax.get_xlim()) temp_ax.set_ylim(ax.get_ylim()) temp_ax.scatter(np.random.randn(1000), np.random.randn(1000), color="g", edgecolors="none") # 隐藏临时画布的多余元素,设置背景透明 temp_ax.axis("off") temp_fig.patch.set_alpha(0) temp_ax.patch.set_alpha(0) # 渲染临时画布并提取像素内容 temp_fig.canvas.draw() layer_arr = np.array(temp_fig.canvas.buffer_rgba()) plt.close(temp_fig) # 将上层散点整体以指定透明度贴回原坐标轴 bbox = TransformedBbox(Bbox.from_extents(*ax.get_xlim(), *ax.get_ylim()), ax.transData) im = BboxImage(bbox, interpolation="nearest", origin="upper", alpha=0.5) im.set_data(layer_arr) ax.add_artist(im) plt.show()
该方案默认适配光栅格式输出,如果需要矢量格式,可以将临时画布导出为SVG片段后修改全局透明度再嵌入原文件。
内容的提问来源于stack exchange,提问作者Marius Wallraff
相关产品推荐
相关产品推荐

