如何使用matplotlib删除底图上多边形内的等高线/路径?

如何使用matplotlib删除底图上多边形内的等高线/路径?,matplotlib,matplotlib-basemap,Matplotlib,Matplotlib Basemap,我正在使用一些天气数据,使用matplotlib在底图上绘制等高线。我使用的数据(x、y和数据)上传到这里 在这里 在这里。 工作示例代码如下所示:- from mpl_toolkits.basemap import Basemap import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import Polygon m = Basemap(projection='merc', llcrnrlat=7

我正在使用一些天气数据,使用matplotlib在底图上绘制等高线。我使用的数据(x、y和数据)上传到这里 在这里 在这里。 工作示例代码如下所示:-

from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon

m = Basemap(projection='merc', llcrnrlat=7, urcrnrlat=40,
            llcrnrlon=68, urcrnrlon=110, resolution='l')

x = np.loadtxt('xlong.txt', delimiter=',')
y = np.loadtxt('xlat.txt', delimiter=',')
Z = np.loadtxt('mslp.txt', delimiter=',')

x, y = m(x, y)
CS = plt.contour(x, y, Z, colors='b')

plt.show()
上面的代码给出了下面的图

情节绝对正确。但我想隐藏/删除特定区域上的轮廓线。因此,我在底图上绘制了一个多边形,并试图将数据隐藏在该多边形下。我使用的代码如下所示:-

from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon


def draw_screen_poly(lats, lons, m):
    x, y = m(lons, lats)
    xy = zip(x, y)
    poly = Polygon(xy, facecolor='red')
    plt.gca().add_patch(poly)

lats = [30, 35, 35, 30]
lons = [80, 80, 90, 90]

m = Basemap(projection='merc', llcrnrlat=7, urcrnrlat=40,
            llcrnrlon=68, urcrnrlon=110, resolution='l')

x = np.loadtxt('xlong.txt', delimiter=',')
y = np.loadtxt('xlat.txt', delimiter=',')
Z = np.loadtxt('mslp.txt', delimiter=',')

x, y = m(x, y)
CS = plt.contour(x, y, Z, colors='b')

draw_screen_poly(lats, lons, m)

plt.show()
生成的图像如下所示。如您所见,
facecolor
没有任何效果,因为它不会隐藏任何数据

我想做的是要么删除通过该多边形的轮廓线,要么使用图像处理技术隐藏/剪裁多边形区域

我想到的解决办法是:-

1。将一些白色应用于多边形区域,使其与底图颜色匹配,并隐藏数据(在上述示例中已完成此操作,但不起作用)。

2。从“轮廓”集合中遍历每个轮廓,并检查其是否穿过多边形区域。最后将其从绘图中删除。

3。最后,切掉多边形区域。


我的思想并没有超出上述想法。我们高度赞赏解决此问题的任何解决方案。

matplotlib的Basemap toolkit遵循与matplotlib本身基本相同的逻辑。您会注意到,您需要为绘图调用提供参数。您只需确保矩形的高度高于轮廓的
zorder

最近,我给了一个类似问题的答案。代码逻辑应该是可复制的,例如:

import numpy as np
import matplotlib.pyplot as plt

t = np.arange(-1, 2, .01)
s = np.sin(2*np.pi*t)

plt.plot(t, s,zorder=4)

p = plt.axvspan(1.25, 1.55, facecolor='g', alpha=1,zorder=3)

plt.axis([-1, 2, -1, 2])
plt.grid(zorder=2)

plt.show()
,请注意
axvspan
plot
数据本身是如何强制位于
网格的顶部的(通过修补
zorder

编辑:等高线图的工作示例,其Z阶比矩形低

import matplotlib
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt

matplotlib.rcParams['xtick.direction'] = 'out'
matplotlib.rcParams['ytick.direction'] = 'out'

delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
# difference of Gaussians
Z = 10.0 * (Z2 - Z1)


# Create a simple contour plot with labels using default colors.  The
# inline argument to clabel will control whether the labels are draw
# over the line segments of the contour, removing the lines beneath
# the label
fig = plt.figure()
ax = fig.add_subplot(111)
CS = plt.contour(X, Y, Z,zorder=3)
plt.clabel(CS, inline=1, fontsize=10)
plt.title('Simplest default with labels')

rect1 = matplotlib.patches.Rectangle((0,0), 2, 1, color='yellow',zorder=5)

ax.add_patch(rect1)

plt.show()
,其结果是:

,原文为:


,这就带来了标签。

非常感谢。成功了。但是,我还为每个等高线设置了
clabel
。在
clabel
上对zorder没有影响。有没有办法也删除这个?@sundar_ima可能是你的代码序列有问题,因为我无法重现你的问题。正如你在我编辑的帖子中看到的,标签位于矩形下方。Thant工作得非常好。非常感谢你。接受你的回答。