Matplotlib直方图如何添加与填充色一致的深色边缘?解析格式差异
问题分析与解决:Matplotlib直方图PDF输出的深色边缘问题
现象总结
- 使用
histtype='barstacked'绘制堆叠直方图,未设置edgecolor时,保存为PDF会出现与填充色一致的深色边缘,但PNG格式无此问题; - 改用
histtype='stepfilled'时,PDF和PNG均无该深色边缘。
原因解析
这并非Matplotlib主动添加的边缘,而是PDF矢量渲染的特性:
barstacked模式下,每个堆叠的柱子是独立的矩形路径,当设置了alpha<1(透明)时,相邻矩形的重叠边缘会被PDF渲染器多次绘制,透明色叠加后颜色加深,看起来像是深色边缘;- PNG是位图格式,渲染时会直接合并像素,不会出现这种路径叠加的效果;
stepfilled模式是绘制一个完整的闭合路径再填充,没有独立的矩形分隔,自然不会有边缘叠加的问题。
解决方法
通过以下参数设置可以消除PDF中的深色边缘:
1. 显式关闭边缘绘制
设置edgecolor='none',直接取消边缘的颜色渲染:
x1 = np.random.normal(0, 0.8, 1000) x2 = np.random.normal(-2, 1, 1000) x3 = np.random.normal(3, 2, 1000) data = [x1, x2, x3] fig = plt.figure() ax = fig.add_subplot() plt.hist(data, alpha=0.3, histtype='barstacked', bins=40, edgecolor='none') fig.savefig('barstacked.pdf') fig.savefig('barstacked.png', dpi=750)
2. 设置边缘线宽为0
通过linewidth=0彻底关闭边缘线条的绘制:
plt.hist(data, alpha=0.3, histtype='barstacked', bins=40, linewidth=0)
3. 栅格化直方图(牺牲矢量性)
添加rasterized=True,将直方图部分转为位图保存,和PNG效果一致,但会失去PDF的矢量编辑特性:
plt.hist(data, alpha=0.3, histtype='barstacked', bins=40, rasterized=True)
内容的提问来源于stack exchange,提问作者Cloud
相关产品推荐
相关产品推荐

