我正在寻找填补两个预定义函数之间的空间,即:
def stravinska_SII(log_SII_Ha, eps=0):
strav_SII = 1.2 + eps + 0.61 / (log_SII_Ha - eps + 0.2)
strav_SII[log_SII_Ha > eps + 0.05] = -2
return strav_SII
和
def log_OIII_Hb_SII(log_SII_Ha, eps=0):
return 1.30 + eps + 0.72 / (log_SII_Ha - eps - 0.32)
但是,在移动 np.linspace
为函数提供适当的边界(当它向 y = +∞ 射出时)之后,我现在有一个仍未填充的补丁。我想知道我是否可以向社区询问如何用一种新颖的新方法来填补空白补丁......?
这是我将其称为补丁问题的图片:
注意我希望我可以定义一些函数,即在 -0.2 < x < 0.06 之间 y = 1.5 处的水平线,然后我可以用它来填充(因为 axhline 非常有问题,因为它使用缩放关系......)
我的问题的一个独立的情节是:
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from matplotlib import pyplot as plt
SII = np.linspace(-3.0, 0.20)
SIIs = np.linspace(-3.0,-0.38)
def log_OIII_Hb_SII(log_SII_Ha, eps=0):
return 1.30 + eps + 0.72 / (log_SII_Ha - eps - 0.32)
def stravinska_SII(log_SII_Ha, eps=0):
strav_SII = 1.2 + eps + 0.61 / (log_SII_Ha - eps + 0.2)
strav_SII[log_SII_Ha > eps + 0.05] = -2
return strav_SII
fig = plt.figure()
gs_left = gridspec.GridSpec(1, 1)
ax = fig.add_subplot(gs_left[0,0])
ax.plot(SII, log_OIII_Hb_SII(SII), '-k')
ax.plot(SII, log_OIII_Hb_SII(SII, 0.1), '--k')
ax.plot(SII, log_OIII_Hb_SII(SII, -0.1), '--k')
ax.plot(SIIs, stravinska_SII(SIIs), '-.k')
ax.set_xlim(-2.0, 1.0)
ax.set_ylim(-1.5, 2.5)
ax.fill_between(SII, log_OIII_Hb_SII(SII), stravinska_SII(SII), where=log_OIII_Hb_SII(SII)>=stravinska_SII(SII),
facecolor='gray', alpha=0.45, edgecolor='none')
plt.show()
最佳答案
只要连续(相对于 X)数据表现良好,fill_ Between
就可以很好地工作。如果您不这样做,那么您可能会考虑其他一些方法。
一种可能性是手动创建多边形。多边形将具有以下边:
- 第一条限制曲线上的点
- 第二条限制曲线上的点
好处是,使用这种方法,您没有任何 x/y 约束,如果需要,您甚至可以使用参数曲线。
应用于您的简单示例:
# create the limiting polygon
vert_x = np.concatenate((SII, SIIs[::-1]))
vert_y = np.concatenate((log_OIII_Hb_SII(SII), stravinska_SII(SIIs[::-1])))
p = plt.Polygon(np.column_stack((vert_x, vert_y)), facecolor='gray', alpha=.45, edgecolor='none')
ax.add_artist(p)
这样你的例子就变成了:
关于python - 填充 matplotlib 中两个函数之间的空间 : unsightly patch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25043721/