python - 填充 matplotlib 中两个函数之间的空间 : unsightly patch

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

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

这样你的例子就变成了:

enter image description here

关于python - 填充 matplotlib 中两个函数之间的空间 : unsightly patch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25043721/

相关文章:

Python 文本小部件仅在窗口中打开

python-3.x - 如何使用 networkx 和 matplotlib 绘制重量标签?

python - 解码编码字符串列表

python - 如何在 GPU 上运行 theano

python - 编写Python或TCL VMD脚本

python - 安装 PyReadline 后 "ValueError: _type_ ' v ' not supported"错误

python - Jupyter 中的 Pydoop 失败

python - 如何创建 Tkinter 主菜单

python - 如何在Python中生成由多个图组成的动画?

latex - Ipython Notebook 中有没有办法内联显示 LaTeX 文件?