python - 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_lower
和Y_lower
表示下曲线(橙色曲线),X_upper
并Y_upper
显示上曲线(绿色曲线)。
解决方案
为了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()
推荐阅读
- python-3.x - nn.NLLLoss() 目标大小问题
- django - 覆盖模型保存方法不允许赋值
- android - NativeScript 和 Angular 代码共享 + 延迟加载的模块路径
- java - MustacheException:第 15 行没有名称为“Id”的方法或字段。Whitelabel 错误页面
- java - jar 执行文件中缺少一些文本
- reactjs - Ant design - 如何在每次选择后自动关闭选择(“标签”或“多个”模式)下拉菜单?
- java - Java:用于预处理和后处理的设计模式,如 Servlet 过滤器提供
- java - Java,将三元运算符转换为 IF ELSE
- c# - ASP.NET Core - 如何检测我的 IHostedService 是否在运行时崩溃?我可以重新启动它吗?
- jquery - 将 jQuery 连接到 REST 服务