在matplotlib中填充两个函数之间的空间:难看的补丁

时间:2014-07-30 17:57:27

标签: 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

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 = +∞射出)之后,我现在有一个未填充的补丁。我想知道我是否可以通过一种新颖的方法向社区提出填补空白补丁的方法......?

以下是我将称为补丁问题的图片:

enter image description here

N.B。我希望我能定义一些函数,即y = 1.5的水平线在-0.2之间。 x<然后我可以使用填充的0.06(因为它使用缩放关系时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()

3 个答案:

答案 0 :(得分:3)

fill_between可以很好地工作,只要你有很好的表现连续(就X而言)数据。如果你不这样做,你可能会考虑其他一些方法。

一种可能性是手工创建多边形。多边形将具有以下边缘:

  • 指向第一条限制曲线
  • 指向第二条限制曲线

不错的是,使用这种方法,您没有任何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)

这样你的例子就变成了:

enter image description here

答案 1 :(得分:0)

stravinska_SII在x = -0.2处有一个渐近线。 Matplotlib正在尝试填充以上行x> -0.2。您正在使用fill_between where=参数隐藏此填充。

您需要将函数stravinska_SII更改为不产生大于x = -0.2的大正数,或者接受填充在该行上方的事实是合适的。

答案 2 :(得分:0)

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