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.2 我的问题的一个自成一体的情节是:

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()

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)