我遇到了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()
答案 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()