如何使用matplotlib删除底图上ploygon内的轮廓/路径?

时间:2016-04-12 16:07:31

标签: matplotlib matplotlib-basemap

我正在处理一些天气数据,使用matplotlib在底图上绘制轮廓线。我使用的数据(x,y和数据)在此处上传http://www.mediafire.com/download/0epjjdm8auit611/mslp.txt 这里http://www.mediafire.com/download/1dn6p8nw96h2mmd/xlong.txt 在这里http://www.mediafire.com/download/31suzsz6j7u2bgz/xlat.txt。   工作示例代码如下: -

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

以上代码给出了以下情节......

enter image description here

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

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

生成的图像如下所示。正如您所看到的,facecolour没有效果,因为它不会隐藏它下面的任何数据。

enter image description here

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

我想到的解决方案是: -

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

2。从轮廓集合中检查每个轮廓并检查它是否通过多边形区域。最后从剧情中删除它。

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

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

1 个答案:

答案 0 :(得分:1)

matplotlib的Basemap工具包遵循与matplotlib本身相同的大部分逻辑。你会注意到你有zorder个参数来给你的情节调用。您只需要确保矩形的zorder高于轮廓的zorder

最近,我为类似的问题here提供了一个鼓掌。例如,代码逻辑应该是可重现的:

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

,请注意axvspanplot数据本身如何强制置于grid之上(通过修补zorder)。

编辑:低于zorder而不是矩形的等高线图的工作示例。

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

,结果是:

Rectangle overlapping countour plot

,原文是:

contour plot

,将标签带到那里。