在Matplotlib中,我如何填充由两个不同数组定义的两条曲线之间的区域?

6
我有两个由两组数组定义的曲线:(x1, y1)(x2, y2),我想用多边形填充它们之间的区域。所有数组长度相同,但是x1x2包含不同的值。 plt.fill_between(x, y1, y2)要求两条曲线共享相同的x数组。
我该如何做类似于fill_between(x1, y1, x2, y2)的操作?
例如,如果: x1 = np.array([1.0, 2.0, 3.0, 4.0, 5.0])y1 = np.array([3.0, 2.0, 3.0, 2.0, 3.0])定义第一条曲线,
并且 x2 = np.array([1.5, 2.5 ,3.5 ,4.5 , 5.5])y2 = np.array([5.0, 6.0, 7.0, 8.0, 9.0])定义第二条曲线。
我怎样才能使用四个多边形(左右边界不需要垂直)在曲线(x1, y1)(x2, y2)之间填充颜色?
澄清一下,这四个多边形(A,B,C,D)的坐标为:
A: [(1.0, 3.0), (1.5, 5.0), (2.5, 6.0), (2.0, 2.0)]
B: [(2.0, 2.0), (2.5, 6.0), (3.5, 7.0), (3.0, 3.0)]
C: [(3.0, 3.0), (3.5, 7.0), (4.5, 8.0), (4.0, 2.0)]
D: [(4.0, 2.0), (4.5, 8.0), (5.5, 9.0), (5.0, 3.0)]

请阅读如何创建一个最小化、完整和可验证的示例。目前你的问题太过广泛。提供一些代码和数据以获得具体的帮助。你可以在x数组上使用某种插值方法,但是正如我所说,如果没有查看数据,很难说出任何东西。 - Sheldore
谢谢,我已经尽力澄清我想做的事情了。 - HD 189733b
有多少个多边形?哪些点定义了多边形的边界?你想要垂直填充吗?因为两条曲线的起始和结束x点不同。你必须澄清这些问题。在问题中包含一个所需示例图。 - Sheldore
请查看此帖子,应该可以回答你的问题。 - ZWang
2个回答

7

我很难明确解释你的问题,但我认为你只是想使用fill,类似于以下内容:

import numpy as np
import matplotlib.pyplot as plt

x1 = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
y1 = np.array([3.0, 2.0, 3.0, 2.0, 3.0])

x2 = np.array([1.5, 2.5, 3.5, 4.5, 5.5])
y2 = np.array([5.0, 6.0, 7.0, 8.0, 9.0])

plt.plot(x1, y1, 'o')
plt.plot(x2, y2, 'x')

plt.fill(
    np.append(x1, x2[::-1]),
    np.append(y1, y2[::-1]),
)

would give you

this plot


嗨@Sam,我有一个类似的问题,但在我的情况下,x1,y1是一条带有颜色(比如红色)的曲线,而x2和y2是另一条带有不同颜色(比如蓝色)的曲线。我想用从红色(第一条曲线)到蓝色(第二条曲线)的渐变填充该区域。我该怎么做?我尝试了几种方法,但都没有成功。 - Oscar Gabriel Reyes Pupo
@OscarGabrielReyesPupo,那听起来与这个问题大多无关。我建议你在周围搜索更接近的东西,例如https://dev59.com/jV0b5IYBdhLWcg3wUP4X或者如果你仍然被卡住,请发布一个带有更多细节的单独问题。 - Sam Mason
谢谢。我已经在https://stackoverflow.com/questions/63810793/filling-the-area-between-archimedes-spyrals-with-interpolated-colours-matplotl/63811472#63811472上发布了这个问题。 - Oscar Gabriel Reyes Pupo

2
最初的回答:
你可以使用多边形补丁绘制填充两条曲线之间的四边形空间 - 唯一棘手的是生成定义多边形的五个点,但通过 (滥用) zip 可以实现...此外,您需要知道如何在图上放置多边形,但是当您知道 matplotlib.collections.PatchCollection 和 ax.add_collection 时,这很容易。
import numpy as np 
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
from matplotlib.collections import PatchCollection

x1 = np.linspace(0,6,21) ; y1 = np.sin(x1)
x2 = x1+0.28 ; y2 = np.cos(x2)

fig, ax = plt.subplots()                                                         
ax.plot(x1, y1, x2, y2)
patches = [Polygon(poly) for poly in (
              [p0,p1,p2,p3,p0] for p0,p1,p2,p3 in 
                    zip(zip(x1,y1),zip(x1[1:],y1[1:]),zip(x2[1:],y2[1:]),zip(x2,y2)))
ax.add_collection(PatchCollection(patches, alpha=0.6))

最初的回答:

一个样本图

如您所见,它并不是完美的,但也许已经足够好了...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接