首页 > 解决方案 > MatPlotLib中没有分隔线的两条非线性曲线之间的填充区域

问题描述

我想用某种颜色填充两条非线性曲线之间的区域,比如“灰色”。阴影区域内不应有任何分隔线。此外,阴影区域应在下限和上限的范围内。

我已经尝试过使用该fill_between函数,但正如您在图中看到的那样,它有一条额外的线,并延伸到上限之上。

填充曲线之间的区域

谁能帮我解决这个问题?我试过像:

plt.fill_betweenx(Y_upper, X_upper, X_lower, color='grey', alpha = 0.2)
plt.fill_between(X_lower, Y_upper, Y_lower, color='grey', alpha = 0.2)

其中X_lowerY_lower表示下曲线(橙色曲线),X_upperY_upper显示上曲线(绿色曲线)。

标签: pythonmatplotlib

解决方案


为了fill_between(x, y1, y2)工作,两者y1和都y2需要在相同的 x 范围内计算。您可以创建一个新的 x 值数组,其中包含两条曲线的 x 值,并按排序顺序排列。然后使用np.interp重新计算两条曲线的 y 值。

更简单的方法是将第二条曲线的反向连接到第一条曲线,这将创建一个封闭的多边形。plt.fill可以为该多边形着色。

您看到的奇怪凸起是上曲线的 y 值与较短的下曲线的 x 值相结合。

下面是一个例子来说明这个想法:

from matplotlib import pyplot as plt
import numpy as np

x_upper = np.linspace(-330, 40, 200)
y_upper = (40 - x_upper) * (x_upper + 330)
x_lower = np.linspace(-220, 20, 200)
y_lower = (20 - x_lower) * (x_lower + 220)
plt.plot(x_upper, y_upper, color='darkgreen')
plt.plot(x_lower, y_lower, color='orange')
plt.fill(np.append(x_upper, x_lower[::-1]), np.append(y_upper, y_lower[::-1]), color='black', alpha=0.1)
plt.plot(x_lower, y_upper, color='navy', ls='--', lw=0.5) # this is the strange curve seen 
plt.show()

在两条独立曲线之间填充


推荐阅读