如何反转 fill_ Between

问题描述 投票:0回答:1

我正在尝试使用 matplotlib 填充两条相交线下方和两条线上方的区域。我可以在两条线之间填充,但还没有找到一种简单的方法来反转之前获得的区域。我唯一的解决方法是创建一些额外的函数(底部一个低函数和一个最小函数,以及顶部的等效函数),这有点麻烦并且需要手动输入(见下文)。还有更好的解决方案吗?

import numpy as np
import matplotlib.pyplot as plt

# Doesn't work
def f1(x): return 32.0 * x + 2.0
def f2(x): return -55.0 * x
xRng=[-1, 1]
plt.plot(xRng, [f1(x) for x in xRng], 'b-')
plt.plot(xRng, [f2(x) for x in xRng], 'r-')
plt.fill_between(xRng, [f1(x) for x in xRng], [f2(x) for x in xRng], color='g') # Would like the fill inverted
plt.title('Not good'); plt.show()

# Works, but clumsy
def fLo(x): return -100
def fHi(x): return 100
def fMin(x): return min(f1(x), f2(x))
def fMax(x): return max(f1(x), f2(x))
xRng=np.linspace(-1, 1, 100)
plt.plot(xRng, [f1(x) for x in xRng], 'b-')
plt.plot(xRng, [f2(x) for x in xRng], 'r-')
plt.fill_between(xRng, [fMin(x) for x in xRng], [fLo(x) for x in xRng], color='g')
plt.fill_between(xRng, [fMax(x) for x in xRng], [fHi(x) for x in xRng], color='g')
plt.title('Complicated'); plt.show()

编辑:按照@Mad Physicist的建议交换BG和FG颜色在基本情况下会起作用,但如果有几个这样的区域需要叠加

python matplotlib fill
1个回答
2
投票

看起来

fill_between
不能很好地处理无限值(例如 在对数刻度上填充 matlibplot python 中曲线下的区域)。但是,如果您只想绘制这些特定的线条,则可以反转绘图的颜色:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-1, 1, 100)
y1 = 32.0 * x + 2.0
y2 = -55.0 * x

fig, ax = plt.subplots()
ax.set_facecolor('g')
ax.plot(x, y1, 'b-')
ax.plot(x, y2, 'r-')
ax.fill_between(x, y1, y2, color='w')
ax.set_xlim(x.min(), x.max())
plt.show()

这非常老套,不能很好地处理交互式绘图,但它会显示你想要的绘图,希望相当轻松。

稍微好一点的方法可能是仅将

x
覆盖的区域的背景设置为绿色补丁:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-1, 1, 100)
y1 = 32.0 * x + 2.0
y2 = -55.0 * x

fig, ax = plt.subplots()
ax.plot(x, y1, 'b-')
ax.plot(x, y2, 'r-')
ax.axvspan(x.min(), x.max(), color='g')
ax.fill_between(x, y1, y2, color='w')
ax.set_xlim(x.min(), x.max())
plt.show()

© www.soinside.com 2019 - 2024. All rights reserved.