【问题标题】:How to remove contour/ path inside ploygon on basemap using matplotlib?如何使用 matplotlib 删除底图上多边形内的轮廓/路径?
【发布时间】:2016-04-13 01:03:39
【问题描述】:

我正在处理一些天气数据,以使用 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-basemap


    【解决方案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()
    

    ,结果为:

    ,原文是:

    ,将标签带到那里。

    【讨论】:

    • 非常感谢。那行得通。但是,对于每个轮廓线,我也有 clabelclabel 上的 zorder 没有影响。有什么想法也可以删除它吗?
    • @sundar_ima 您的代码序列可能有问题,因为我无法重现您的问题。正如您在我编辑的帖子中看到的,标签位于矩形下方。
    • Thant 工作得很好。非常感谢。接受你的回答。
    猜你喜欢
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 2022-11-04
    • 2022-01-23
    相关资源
    最近更新 更多