【问题标题】:Fill area between two non-linear curves without separation line in MatPlotLibMatPlotLib中没有分隔线的两条非线性曲线之间的填充区域
【发布时间】:2021-06-04 11:36:07
【问题描述】:

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

我尝试过使用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 表示上方曲线(绿色曲线)。

【问题讨论】:

标签: python matplotlib


【解决方案1】:

要使fill_between(x, y1, y2) 起作用,y1y2 需要在相同的 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2022-01-13
    • 2019-04-19
    • 2020-07-02
    • 1970-01-01
    相关资源
    最近更新 更多