Python 在matplotlib中填充两个函数之间的空间:难看的修补程序
我希望填补两个预定义函数之间的空白,即:Python 在matplotlib中填充两个函数之间的空间:难看的修补程序,python,matplotlib,ipython,Python,Matplotlib,Ipython,我希望填补两个预定义函数之间的空白,即: 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 及 但是,在移动np.linspace以给函数提供适当的边界后(当它向y方向发射时=+∞) 我现在有一个补丁还没有填满。我
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
及
但是,在移动np.linspace
以给函数提供适当的边界后(当它向y方向发射时=+∞) 我现在有一个补丁还没有填满。我想知道我是否可以向社区询问如何用一种新的方法填充这个空补丁
以下是我将称之为补丁问题的图片:
注意:我希望我能定义一些函数,例如,y=1.5,在-0.2import 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()
stravinska_SII
在x=-0.2处有一条渐近线。Matplotlib正适当地尝试在x>-0.2的直线上方填充。您正在使用fill_-between
where=参数隐藏此填充
您需要更改函数
stravinska\u SII
以避免在x=-0.2以上产生大的正数,或者接受这样一个事实,即在行上方填充是合适的。只要您具有良好的连续性(关于x),那么fill\u之间的fill\u就可以很好地工作如果你不知道,那么你可以考虑其他方法。
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)
Y2 = np.linspace(-0.2575, 0.06)
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
def y(x):
y = (x**2) - 1.682687002
return y
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.plot(Y2, y(Y2), ':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')
ax.fill_between(Y2, y(Y2), log_OIII_Hb_SII(Y2),
facecolor='gray', alpha=0.45, edgecolor='none')
plt.show()
一种可能是手动创建多边形。多边形将具有以下边:
- 第一条极限曲线上的点
- 第二条极限曲线上的点
很好的一点是,使用这种方法,您没有任何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)
因此,您的示例变成:
你能把这个问题归结为一个简单的、自包含的例子来重现这个问题并包含你的绘图代码吗?你使用的是ax.fill\u between吗?
它不接收任何数据,只是一个简单的np.linspace(xmim,xmas)设置。那么我该如何应用np.clip()准确地说?我的数据不是用来创建线条的,而是定义的函数…然后使用np.linspace来绘制给定范围内的线条,即np.linspace(-2,2)。我已经在上面的问题中添加了如何绘制线条的方法。希望您可以看到,如果函数没有剪裁到xrange(-3.0,-0.38)中将朝一个方向发射。
# 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)