python - 如何在 Matplotlib 中填充边界空间
问题描述
我需要填充 3 个图形之间的空间,但我不明白如何限制图形 y2 上的区域
import numpy as np
import matplotlib.pyplot as plt
y = lambda z: (4 * z - z ** 2) ** (1 / 2)
y1 = lambda x: (8 * x - x ** 2) ** (1 / 2)
y2 = lambda c: c * 3 ** (1 / 2)
x = np.linspace(0, 12, 100)
z = np.linspace(0, 12, 100)
c = np.linspace(0, 12, 100)
plt.ylim(0, 4)
plt.xlim(0, 4)
plt.plot(z, y(z), color='blue', label="y=(18-x^2)^(1/2)")
plt.plot(c, y2(c))
plt.plot(x, y1(x), color='red', label='y=3*2^(1/2) - (18-x^2)^(1/2)')
plt.grid(True, zorder=5)
plt.fill_between(x, y(z), y1(x), alpha=0.5)
plt.show()
解决方案
要填充 abovey
和 above的空间y2
,您可以取两者中的最大值。为了只填写 where y1
is above y2
,您可以使用以下where
参数:
plt.fill_between(x, np.maximum(y(z), y2(c)), y1(x), where=y2(c)<=y1(x), alpha=0.5)
您可能需要在 s 中使用超过 100 个点linspace
来避免没有填充的小区域。对于这张图片,我使用了np.linspace(0, 12, 500)
.
要拥有更好的标签,您可以使用乳胶格式(用 $ 符号括起来,并为幂添加大括号):
plt.plot(..., label="$y=(18-x^2)^{1/2}$")
plt.plot(..., label='$y=3*2^{1/2} - (18-x^2)^{1/2}$')
要获得平方根符号,请使用 latex 函数\sqrt
。要在 Python 字符串中使用反斜杠,反斜杠应该加倍,或者字符串前面应该有一个r
(原始字符串)。
plt.plot(..., label="$y=\\sqrt{18-x^2}$")
plt.plot(..., color='red', label='$y=3*\\sqrt{2} - \\sqrt{18-x^2}$')