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

2024-05-14 15:44:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望填补两个预定义函数之间的空白,即:

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

以及

^{pr2}$

然而,在移动np.linspace以给出函数适当的边界(当它朝y=+∞方向发射时),我现在有一个未填充的补丁。我想知道我是否可以问社区如何用一种新的方法填补空白。。。?在

以下是我将称之为修补程序问题的图片:

enter image description here

注意:我希望我可以定义一些函数,例如,在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()

Tags: importlogplotmatplotlibasnpplteps
3条回答

stravinska_SII在x=-0.2处有一条渐近线。Matplotlib适当地尝试在x>;-0.2的行上填充。您正在使用fill_betweenwhere=参数隐藏此填充。在

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

只要您有良好的连续(相对于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)

这样,您的示例变成:

enter image description here

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

相关问题 更多 >

    热门问题