You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使Matplotlib中fill_between绘图的网格线与stackplot一致?

解决Matplotlib fill_between与stackplot网格线渲染差异问题

问题描述

想用Matplotlib的fill_between实现非堆叠的填充效果,替代stackplot,但两者的网格线渲染效果不一致:stackplot的网格线显示清晰,而fill_between绘制的图中网格线显得模糊。尝试调整zorder、透明度等参数都没解决问题。

问题原因

核心是图层顺序(zorder)和填充透明度的组合影响:

  • stackplot默认zorder为2,网格线默认zorder为1,填充区域在网格线之上,但因设置了alpha=0.5的半透明效果,网格线能透过填充层清晰显示。
  • 原fill_between代码中,第一个填充区域用了alpha=1的完全不透明颜色,且手动设置grid的zorder=10,完全不透明的填充色会和网格线颜色产生视觉重叠,导致网格线看起来模糊;同时图层顺序的设置逻辑未匹配stackplot的渲染逻辑。

解决方案

只需调整两点,即可让fill_between的网格线和stackplot一致:

  1. 将填充区域的zorder设为0(低于网格线默认zorder=1),让填充在网格线下方,网格线完全不受填充色影响。
  2. 统一填充区域的透明度为0.5,和stackplot保持一致(若需实色填充可跳过此步,网格线仍会因在最上层而清晰)。

修改后的代码

完整代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams.update(plt.rcParamsDefault)
plt.style.use("ggplot")

_styles = {
'axes.edgecolor': '#bcbcbc',
'axes.facecolor': 'white',
'grid.color': '#b2b2b2',
'grid.linestyle': '--',
}

plt.rcParams.update(_styles)


def plot_a_plot(x_axis, actual, predicted, size=(10,4)):
    plt.figure(figsize=size)
    
    # 先绘制填充,zorder设为0(低于网格默认zorder=1)
    plt.fill_between(x_axis, actual.astype(np.float64), color='#F0A498', alpha=0.5, zorder=0)
    p1 = plt.plot(x_axis, actual, alpha=0.5, label=actual.name, lw=0.5)
    
    plt.fill_between(x_axis, predicted.astype(np.float64), color='C1', alpha=0.5, zorder=0)
    p2 = plt.plot(x_axis, predicted, alpha=0.5, label=predicted.name, lw=0.5)
    
    # 无需手动设置grid的zorder,用默认值即可
    plt.grid(True)
    
    plt.title('Plot with fill_between')
    plt.legend()
    plt.show()

def plot_a_stackplot(x_axis, actual, predicted, size=(10,4)):
    y = np.vstack([actual.astype(float), predicted.astype(float)])
    plt.figure(figsize=size)
    plt.stackplot(x_axis, y, labels=[actual.name, predicted.name], alpha=0.5, edgecolors="face")
   
    plt.title('Stackplot')
    plt.legend()
    plt.show()

arr = np.random.rand(10)

data = {
  "actual": arr,
  "predicted": arr*2
}

df = pd.DataFrame(data)

x_axis = df.index
actual = df['actual']
predicted = df['predicted']

plot_a_plot(x_axis, actual, predicted)
plot_a_stackplot(x_axis, actual, predicted)

关键修改点

  • 调整fill_between的zorder为0,确保填充区域在网格线下方。
  • 将第一个填充区域的alpha改为0.5,和stackplot保持一致。
  • 移除grid的zorder=10设置,使用默认层级即可。

内容的提问来源于stack exchange,提问作者Rokas Karabevičius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 03:25:20