限制绘图大小后移动轮廓标签

时间:2017-08-23 16:13:49

标签: python numpy matplotlib

我遇到了pyplot中轮廓标签的问题。当我限制绘图的域时,轮廓标签会写在不再存在的绘图部分中。在一些使用真实数据的图中,这意味着很少的线实际上具有标签。有没有一种简单的方法可以确保所有标签都显示在放大的图中?

这对应的实际数据不是有规律的间隔,我将在几个不同的变量上使用它。我知道我可以使用手动选项,但这意味着知道我选择的域中有哪些轮廓。

例如,在下面的示例中,第二个图中缺少8000轮廓标签。

import numpy as np
from matplotlib import pyplot as plt

#Make some Fake Data
x = np.arange(-100,101,1)
x,y = np.meshgrid(x,x)
z = x**2+y**2+6*x

#Plot said fake data
ax = plt.subplot(111)
clevs = np.arange(0,z.max(),2000)
cs = ax.contour(x,y,z,clevs,colors='k')
plt.clabel(cs,inline=True,fmt='%3.0d')
plt.show()

#Plot zoomed in fake data
ax = plt.subplot(111)
clevs = np.arange(0,z.max(),2000)
cs = ax.contour(x,y,z,clevs,colors='k')
ax.set_xlim(-50,50) #Limit the x-axis
plt.clabel(cs,inline=True,fmt='%3.0d')
plt.show()

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:3)

您可以使用有限的数据创建等值线图,这样clabel被强制置于数据范围内,因此会显示在图中。这可以使用屏蔽的numpy数组完成,如下所示

import numpy as np
from matplotlib import pyplot as plt

x = np.arange(-100,101,1)
x,y = np.meshgrid(x,x)
z = x**2+y**2+6*x

ax = plt.subplot(121)
clevs = np.arange(0,z.max(),2000)
cs = ax.contour(x,y,z,clevs,colors='k')
plt.clabel(cs,inline=True,fmt='%3.0d')

#Plot zoomed in fake data
ax2 = plt.subplot(122)
clevs = np.arange(0,z.max(),2000)

def limitcontour(ax, x,y,z,clevs, xlim=None, ylim=None, **kwargs):
    mask = np.ones(x.shape).astype(bool)
    if xlim:
        mask = mask & (x>=xlim[0]) & (x<=xlim[1])
    if ylim:
        mask = mask & (y>=ylim[0]) & (y<=ylim[1])
    xm = np.ma.masked_where(~mask , x)
    ym = np.ma.masked_where(~mask , y)
    zm = np.ma.masked_where(~mask , z)

    cs = ax.contour(xm,ym,zm, clevs,**kwargs)
    if xlim: ax.set_xlim(xlim) #Limit the x-axis
    if ylim: ax.set_ylim(ylim)
    ax.clabel(cs,inline=True,fmt='%3.0d')

limitcontour(ax2, x,y,z, clevs, xlim=[-50,50], ylim=[-90,90], colors="k")

ax.set_title("all data")
ax2.set_title("masked data")
plt.show()

enter image description here