如何使用 matplotlib 删除底图上多边形内的轮廓/路径?
How to remove contour/ path inside ploygon on basemap using matplotlib?
我正在处理一些天气数据,使用 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()
上面的代码给出了下面的情节...
剧情绝对OK。但我想隐藏/删除特定区域的等高线。因此,我在底图上绘制了一个多边形并试图将数据隐藏在多边形下方。我用来做的代码如下:-
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
没有任何效果,因为它没有隐藏任何数据。
我想做的是删除穿过这个多边形的等高线,或者使用图像处理技术隐藏/裁剪多边形区域。
我想到的解决方案是:-
1.将一些白色应用于多边形区域,使其与底图颜色匹配并隐藏数据(这在上面的示例中已经完成,但不起作用)。
2。遍历轮廓集合中的每个轮廓并检查它是否穿过多边形区域。最后将其从绘图中删除。
3。最后,切掉多边形区域。
我的想法没有超出上述想法。非常感谢解决此问题的任何解决方案。
matplotlib 的底图工具包遵循与 matplotlib 本身大部分相同的逻辑。您会注意到矩形的 zorder arguments to give to your plot calls. You just need to make sure that the zorder 高于轮廓的 zorder
。
最近我给了一个类似问题的awnser 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()
,请注意 axvspan
和 plot
数据本身是如何被迫位于 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()
,结果是:
,原文为:
,将标签带到那里。
我正在处理一些天气数据,使用 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()
上面的代码给出了下面的情节...
剧情绝对OK。但我想隐藏/删除特定区域的等高线。因此,我在底图上绘制了一个多边形并试图将数据隐藏在多边形下方。我用来做的代码如下:-
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
没有任何效果,因为它没有隐藏任何数据。
我想做的是删除穿过这个多边形的等高线,或者使用图像处理技术隐藏/裁剪多边形区域。
我想到的解决方案是:-
1.将一些白色应用于多边形区域,使其与底图颜色匹配并隐藏数据(这在上面的示例中已经完成,但不起作用)。
2。遍历轮廓集合中的每个轮廓并检查它是否穿过多边形区域。最后将其从绘图中删除。
3。最后,切掉多边形区域。
我的想法没有超出上述想法。非常感谢解决此问题的任何解决方案。
matplotlib 的底图工具包遵循与 matplotlib 本身大部分相同的逻辑。您会注意到矩形的 zorder arguments to give to your plot calls. You just need to make sure that the zorder 高于轮廓的 zorder
。
最近我给了一个类似问题的awnser 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()
,请注意 axvspan
和 plot
数据本身是如何被迫位于 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()
,结果是:
,原文为:
,将标签带到那里。