如何在Seaborn中保存含深色网格背景且留白透明的图像?
解决Matplotlib保存图像时保留深色网格、仅留白透明的问题
我懂你的烦恼——笔记本里显示的图表带着好看的深色网格,结果存成文件后网格背景直接消失,只剩孤零零的直方图。这是因为transparent=True会把整个画布的所有背景(包括图表区域的轴背景和周围留白)都设为透明,而我们只想要周围留白透明,图表区域的深色网格得好好保留。
给你两种顺手的解决方案,选你习惯的来:
方法一:手动设置画布背景透明(推荐)
这种方式更直接,我们只修改最外层画布(也就是图表周围的留白区域)的背景为透明,图表内的轴背景完全沿用seaborndarkgrid的样式:
import matplotlib.pyplot as plt import seaborn as sns import pandas as pd import numpy as np %load_ext autoreload %autoreload 2 %matplotlib inline %config InlineBackend.figure_format = 'svg' tips = sns.load_dataset("tips") # 设置深色网格风格 sns.set_style("darkgrid") g = sns.FacetGrid(tips, col="smoker", col_order=["Yes", "No"]) g = g.map(plt.hist, "total_bill") # 关键操作:把画布(留白区域)的背景设为透明 g.fig.set_facecolor('none') # 保存时指定画布的透明属性,同时保留轴的深色网格 plt.savefig("example.pdf", facecolor=g.fig.get_facecolor(), edgecolor='none')
原理很简单:g.fig.set_facecolor('none')只改动了最外层画布的背景,图表里的每个轴还是保持darkgrid设置的深色背景,保存时指定facecolor就能把透明留白的效果写入文件。
方法二:强制锁定轴的背景颜色
如果你习惯用transparent=True参数,也可以先把轴的背景颜色存下来,保存前重新赋值,避免被transparent=True覆盖:
import matplotlib.pyplot as plt import seaborn as sns import pandas as pd import numpy as np %load_ext autoreload %autoreload 2 %matplotlib inline %config InlineBackend.figure_format = 'svg' tips = sns.load_dataset("tips") sns.set_style("darkgrid") g = sns.FacetGrid(tips, col="smoker", col_order=["Yes", "No"]) g = g.map(plt.hist, "total_bill") # 获取darkgrid风格下轴的背景颜色 axes_bg_color = g.axes[0][0].get_facecolor() # 遍历所有轴,强制设置背景颜色(防止被transparent参数清空) for ax in g.axes.flat: ax.set_facecolor(axes_bg_color) # 保存时用transparent=True,此时只有画布留白会透明,轴背景完整保留 plt.savefig("example.pdf", transparent=True)
这样设置后,transparent=True只会把画布的留白变成透明,我们提前锁定了轴的背景颜色,所以深色网格就能完整保留在保存的文件里了。
内容的提问来源于stack exchange,提问作者Xenocidist
相关产品推荐
相关产品推荐

