如何隐藏底图上特定区域的等高线/数据
How to hide contour lines / data from a specific area on Basemap
我正在使用一些气象数据在底图上绘制等高线。我之前完成的完整工作示例代码在此处 。一切正常,我不抱怨等高线图。但是,有一种特殊情况,我必须隐藏底图上特定区域(不规则纬度和经度)上的所有等高线。
我能想到的唯一可能的解决方案是在所需区域上绘制多边形线并填充与底图相同的颜色。经过大量搜索,我找到了这个 link How to draw rectangles on a Basemap (代码如下)
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', alpha=0.4 )
plt.gca().add_patch(poly)
lats = [ -30, 30, 30, -30 ]
lons = [ -50, -50, 50, 50 ]
m = Basemap(projection='sinu',lon_0=0)
m.drawcoastlines()
m.drawmapboundary()
draw_screen_poly( lats, lons, m )
plt.show()
它似乎部分起作用。但是,我想画一个不规则的区域。
感谢任何解决方案。
编辑:1
我明白问题出在哪里了。似乎在多边形区域内填充的任何颜色(面色)都不会使其隐藏下面的任何东西。无论是否使用 alpha
值,它始终只是透明的。为了说明这个问题,我裁剪了包含所有三个区域的图像,即。等高线、底图区域和多边形区域。多边形区域填充为红色,但如您所见,等高线始终可见。我在上面的代码中使用的特定行是:-
poly = Polygon(xy, facecolor='red', edgecolor='b')
因此问题不在于上面的代码。这似乎是多边形填充的问题。但仍然没有解决这个问题。生成的图像(裁剪后的图像)在下方(请参阅我在附件图像下方进行的第二次编辑):-
编辑 2:
从这个与我有类似要求的 http://matplotlib.1069221.n5.nabble.com/Clipping-a-plot-inside-a-polygon-td41950.html 中得到线索,我能够删除一些数据。但是,删除的数据仅来自多边形区域外部,而不是内部。这是我从中获取线索的代码:-
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import RegularPolygon
data = np.arange(100).reshape(10, 10)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.contourf(data)
poly = RegularPolygon([ 0.5, 0.5], 6, 0.4, fc='none',
ec='k', transform=ax.transAxes)
for artist in ax.get_children():
artist.set_clip_path(poly)
现在我的问题是,删除多边形区域内数据的命令是什么?
没有注意到对此有声明,所以我可能只是给出已经提出的解决方案 。您可以修改 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='white',zorder=5)
ax.add_patch(rect1)
plt.show()
,结果为:
我正在使用一些气象数据在底图上绘制等高线。我之前完成的完整工作示例代码在此处
我能想到的唯一可能的解决方案是在所需区域上绘制多边形线并填充与底图相同的颜色。经过大量搜索,我找到了这个 link How to draw rectangles on a Basemap (代码如下)
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', alpha=0.4 )
plt.gca().add_patch(poly)
lats = [ -30, 30, 30, -30 ]
lons = [ -50, -50, 50, 50 ]
m = Basemap(projection='sinu',lon_0=0)
m.drawcoastlines()
m.drawmapboundary()
draw_screen_poly( lats, lons, m )
plt.show()
它似乎部分起作用。但是,我想画一个不规则的区域。
感谢任何解决方案。
编辑:1
我明白问题出在哪里了。似乎在多边形区域内填充的任何颜色(面色)都不会使其隐藏下面的任何东西。无论是否使用 alpha
值,它始终只是透明的。为了说明这个问题,我裁剪了包含所有三个区域的图像,即。等高线、底图区域和多边形区域。多边形区域填充为红色,但如您所见,等高线始终可见。我在上面的代码中使用的特定行是:-
poly = Polygon(xy, facecolor='red', edgecolor='b')
因此问题不在于上面的代码。这似乎是多边形填充的问题。但仍然没有解决这个问题。生成的图像(裁剪后的图像)在下方(请参阅我在附件图像下方进行的第二次编辑):-
编辑 2: 从这个与我有类似要求的 http://matplotlib.1069221.n5.nabble.com/Clipping-a-plot-inside-a-polygon-td41950.html 中得到线索,我能够删除一些数据。但是,删除的数据仅来自多边形区域外部,而不是内部。这是我从中获取线索的代码:-
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import RegularPolygon
data = np.arange(100).reshape(10, 10)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.contourf(data)
poly = RegularPolygon([ 0.5, 0.5], 6, 0.4, fc='none',
ec='k', transform=ax.transAxes)
for artist in ax.get_children():
artist.set_clip_path(poly)
现在我的问题是,删除多边形区域内数据的命令是什么?
没有注意到对此有声明,所以我可能只是给出已经提出的解决方案
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='white',zorder=5)
ax.add_patch(rect1)
plt.show()
,结果为: