在Matplotlib堆叠面积图中创建透明区域
解决堆叠面积图下方白色区域透明问题
你的问题出在用白色填充0到Min的区域,不管调整alpha参数,白色都会覆盖背景,达不到透明效果。正确的做法是直接绘制Max与Min之间的范围,而非通过两次堆叠来“遮掉”下方区域。
修正方案:使用fill_between绘制范围区域
fill_between可以直接填充两条曲线之间的区域,完美契合你的需求(展示5Y Max和5Y Min的范围,叠加Avg虚线):
import matplotlib.pyplot as plt # 绘制5年平均值虚线 plt.plot(df.index, df["5y Avg"], color=avg_color, linestyle="dotted", label='5y Avg') # 填充Max和Min之间的灰色区域 plt.fill_between(df.index, df["5Y Min"], df["5Y Max"], color="#B1B3B6", alpha=0.5, label='5y Range') # 调整图例、坐标轴等 plt.legend() plt.show()
为什么原代码无效?
你原本的逻辑是先堆叠0到Max的灰色区域,再堆叠0到Min的白色区域,试图让白色区域透明。但stackplot的填充是从底部(0)开始的,白色填充会完全覆盖下方的背景,即使调alpha也只是让白色半透明,无法真正“消失”。
如果坚持用stackplot的替代写法
如果你一定要基于stackplot实现,需要堆叠的是Max - Min的差值,而非单独的Max和Min:
plt.plot(df.index, df["5y Avg"], color=avg_color, linestyle="dotted", label='5y Avg') # 先堆叠Min的“占位”区域,设置为完全透明 plt.stackplot(df.index, df["5Y Min"], color="none", alpha=0) # 再堆叠Max - Min的差值区域,显示灰色 plt.stackplot(df.index, df["5Y Max"] - df["5Y Min"], color="#B1B3B6", labels=['5y Range']) plt.legend() plt.show()
这种方法通过第一个透明的stackplot占据Min的高度,再堆叠差值部分,最终效果和fill_between一致,但fill_between更直观简洁。
内容的提问来源于stack exchange,提问作者PierreCera
相关产品推荐
相关产品推荐

