matplotlib中如何设置保存图片时绘图面背景为非透明
问题描述
绘图示例
使用matplotlib绘图时,保存输出的图片中x轴、y轴标签后方的绘图面存在透明效果,未找到对应的正确设置方法。
当前使用的代码如下:
plt.rcParams.update({'font.size': 40}) plt.plot(f_hours_BEST,BEST_data, marker = hurricane_svg, markersize=50, color = 'r', label='BEST') plt.plot(f_hours_OFCL,OFCL_data, marker = hurricane_svg, markersize=50, label = 'OFCL') plt.boxplot(Vlist, widths=5, positions = f_hours_EPS) plt.title("EPS Ensemble Intensity vs BEST and OFCL forecast AL31 2020-11-14 12z") plt.xlabel("Forecast Hour") plt.ylabel("Intensity (kts)") plt.legend() plt.savefig('EPS.png')
解决方案
透明问题由两类配置缺失导致:一是没有显式指定坐标轴绘图区的背景色,部分渲染后端下会默认带alpha通道;二是保存图片时未显式关闭透明参数,输出时会保留透明区域。
直接做两处修改即可解决:
- 显式设置当前坐标轴的绘图面为不透明实色
- 保存图片时显式关闭透明通道,指定画布背景色
修改后的完整可运行代码:
plt.rcParams.update({'font.size': 40}) plt.plot(f_hours_BEST,BEST_data, marker = hurricane_svg, markersize=50, color = 'r', label='BEST') plt.plot(f_hours_OFCL,OFCL_data, marker = hurricane_svg, markersize=50, label = 'OFCL') plt.boxplot(Vlist, widths=5, positions = f_hours_EPS) plt.title("EPS Ensemble Intensity vs BEST and OFCL forecast AL31 2020-11-14 12z") plt.xlabel("Forecast Hour") plt.ylabel("Intensity (kts)") plt.legend() # 设置坐标轴绘图区域为不透明白色 plt.gca().set_facecolor('white') # 修改保存参数,显式关闭透明,指定画布背景为白色 plt.savefig('EPS.png', transparent=False, facecolor='white')
如果需要全局生效,无需每次绘图都重复添加设置,可以直接把相关配置写入rcParams初始化部分:
plt.rcParams.update({ 'font.size': 40, 'axes.facecolor': 'white', 'savefig.transparent': False, 'savefig.facecolor': 'white' })
若需要使用其他颜色作为背景,将上述代码中的
white替换为目标颜色值即可,支持matplotlib内置颜色名、十六进制色值、RGB元组三种格式,不会影响折线、箱线图、标注等其他元素的显示效果。
内容的提问来源于stack exchange,提问作者SlushP22
相关产品推荐
相关产品推荐

