【发布时间】:2018-07-15 04:55:03
【问题描述】:
我正在尝试在matplotlib.Basemap 上绘制 1x1 度数据,并且我想用白色填充海洋。但是,为了让海洋的边界沿着matplotlib绘制的海岸线,白色海洋掩膜的分辨率应该比我数据的分辨率高很多。
找了半天,我尝试了两种可能的解决方案:
(1) maskoceans() 和 is_land() 函数,但由于我的数据分辨率低于底图绘制的地图,因此边缘看起来不太好。我也不想将我的数据插值到更高分辨率。
(2) m.drawlsmask(),但由于无法分配 zorder,因此 pcolormesh 图总是覆盖蒙版。
这段代码
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.basemap as bm
#Make data
lon = np.arange(0,360,1)
lat = np.arange(-90,91,1)
data = np.random.rand(len(lat),len(lon))
#Draw map
plt.figure()
m = bm.Basemap(resolution='i',projection='laea', width=1500000, height=2900000, lat_ts=60, lat_0=72, lon_0=319)
m.drawcoastlines(linewidth=1, color='white')
data, lon = bm.addcyclic(data,lon)
x,y = m(*np.meshgrid(lon,lat))
plt.pcolormesh(x,y,data)
plt.savefig('1.png',dpi=300)
添加m.fillcontinents(color='white') 会生成以下图像,这是我需要的,但要填充海洋而不是陆地。
编辑:
m.drawmapboundary(fill_color='lightblue') 也会填满土地,因此无法使用。
理想的结果是海洋是白色的,而我用plt.pcolormesh(x,y,data) 绘制的结果显示在陆地上。
【问题讨论】:
-
我不认为你在这里问什么很清楚。您可以使用minimal reproducible example 使您的问题可重现,人们可以运行该minimal reproducible example,您可以使用不想要的结果的图片来解释问题。
m.drawmapboundary(fill_color='lightblue')用浅蓝色填充海洋。目前尚不清楚为什么这在这里行不通。 -
感谢您的建议,但
m.drawmapboundary(fill_color='lightblue')也填满了土地。 -
那么期望的结果究竟是什么?请注意,底图中没有海洋,海洋只是没有被陆地覆盖的一切。也许您可以考虑到这一点来制定您的问题?
-
理想的结果是海洋是白色的,而我用
plt.pcolormesh(x,y,data)绘制的图只显示在陆地上。所以与此相反:i.stack.imgur.com/w92pA.png,那里的土地是白色的,plt.pcolormesh(x,y,data)绘制的内容只出现在海洋上。
标签: python matplotlib mask matplotlib-basemap