如何使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一致:
- 将填充区域的
zorder设为0(低于网格线默认zorder=1),让填充在网格线下方,网格线完全不受填充色影响。 - 统一填充区域的透明度为
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
相关产品推荐
相关产品推荐

