Matplotlib fill_between 两曲线数值一致时仍可见细线问题求解
问题原因
这个细线并非来自填充区域本身,主要由两个原因导致:
fill_between函数默认会为填充区域绘制与填充色同色的边缘描边,即使两条曲线数值完全相等、填充区域面积为0,边缘描边仍会被渲染,就会表现为一条细线。- 部分场景下是显示设备的抗锯齿插值策略导致,相邻色块的边界处因为像素混色会出现多余的细线。
解决方法
推荐按优先级选择以下方案:
- 关闭填充区域边缘描边
这是最通用、效果最好的方案,仅需要为fill_between显式指定edgecolor='none'参数即可:
import matplotlib.pyplot as plt y1 = [10, 18, 17, 19, 11, 13, 15, 15, 13, 15, 10, 19, 18, 10, 16, 12, 12, 13, 10, 10] y2 = [22, 29, 30, 19, 11, 13, 15, 29, 30, 31, 22, 37, 31, 26, 28, 23, 25, 23, 27, 28] plt.fill_between(range(20), y1, color='blue', edgecolor='none') plt.fill_between(range(20), y1, y2, color='red', edgecolor='none') plt.show()
- 关闭抗锯齿(可选)
如果关闭边缘描边后仍有极细的残留线条,可以额外添加antialiased=False参数关闭抗锯齿渲染,缺点是填充区域的边缘会变得稍显生硬:
plt.fill_between(range(20), y1, y2, color='red', edgecolor='none', antialiased=False)
- 筛选不等值区间绘制(特殊场景用)
如果业务要求必须保留填充区域的边缘描边,可以提前筛选掉y1和y2数值相等的区间,仅在两值不等的位置绘制对应填充:
import numpy as np import matplotlib.pyplot as plt y1 = np.array([10, 18, 17, 19, 11, 13, 15, 15, 13, 15, 10, 19, 18, 10, 16, 12, 12, 13, 10, 10]) y2 = np.array([22, 29, 30, 19, 11, 13, 15, 29, 30, 31, 22, 37, 31, 26, 28, 23, 25, 23, 27, 28]) x = np.arange(20) mask = y1 != y2 plt.fill_between(x, y1, color='blue') plt.fill_between(x[mask], y1[mask], y2[mask], color='red') plt.show()
内容的提问来源于stack exchange,提问作者AaronSchueddekopf
相关产品推荐
相关产品推荐

