【问题标题】:In matplotlib how do I fill between two curves defined by two different sets of arrays?在 matplotlib 中,如何在由两组不同数组定义的两条曲线之间填充?
【发布时间】:2019-01-18 23:23:05
【问题描述】:

我有两条由两组数组定义的曲线:(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)]

【问题讨论】:

  • 请阅读How to create a Minimal, Complete, and Verifiable example。目前你的问题太宽泛了。提供一些代码和数据以获得具体帮助。您可以在 x 数组上使用某种插值,但正如我所说,如果不查看数据,就很难说出任何事情
  • 谢谢,我试图澄清我想要做什么。
  • 有多少个多边形?哪些点定义了多边形边界?您是否想要垂直填充,因为两条曲线的起点和终点 x 点不同?你必须澄清这些问题。在问题中包含所需的示例图形
  • 查看this 帖子,应该会回答您的问题。

标签: python matplotlib


【解决方案1】:

我正在努力明确地解释您的问题,但我认为您只想使用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]),
)

会给你

【讨论】:

  • 嗨@Sam,我有类似的问题,但在我的例子中,x1,y1 是一条有颜色的曲线(比如说红色),而 x2 和 y2 是另一条颜色不同的曲线(假设是蓝色。)我想用从红色(第一条曲线)到蓝色(第二条曲线)的渐变填充该区域。我怎样才能做到这一点?我尝试了几种方法,但都没有成功。
  • @OscarGabrielReyesPupo 听起来与这个问题几乎无关。我建议四处寻找更接近的东西,例如stackoverflow.com/q/29321835/1358308 或发布一个单独的问题,如果您仍然没有问题,请发布更多详细信息
  • 谢谢。我已经在stackoverflow.com/questions/63810793/… 中发布了这个问题
【解决方案2】:

您可以使用多边形补丁来绘制填充两条曲线之间的空间的四边形——唯一棘手的一点是生成定义多边形的 5 个点,但是(ab)使用zip 可以完成...您需要知道如何在绘图上放置多边形,但是当您知道 matplotlib.collections.PatchCollectionax.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))

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 2014-06-08
    • 1970-01-01
    • 2016-05-16
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多