Matplotlib Basemap: Removing Ocean

核能气质少年 提交于 2020-03-03 10:20:09

问题


I have an meshplot onto which I want to overlay continents in basemap. I am using this code:

       from mpl_toolkits.basemap import Basemap
       import matplotlib.pyplot as plt
       m = Basemap(width=12000000,height=9000000,projection='lcc',
            resolution=None,lat_1=45.,lat_2=55,lat_0=50,lon_0=-107.)

       m.drawlsmask(land_color='coral',ocean_color='aqua',lakes=True)
       plt.show()

referring to this, my requirements is opposite. I want continents ontop of the meshplot or image I have so only mesh at the ocean area is visible.


回答1:


Your requirements:

  1. A plot with continents on top of a meshplot and/or image
  2. Only mesh/image at the ocean area is visible

To get the plot, you must use 'zorder' in each of the layers involved. The data to plot must be transformed appropriately. Here is a code that you can try, and the output plot it produces.

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np

m = Basemap(projection='lcc', width=12000000, height=9000000, 
    resolution='c', lat_1=45., lat_2=55, lat_0=50, lon_0=-107.)

# if resolution is None, coastlines wont draw

# draw only land areas with zorder=20
# any other layers with zorder below 20 will be hidden by land areas
m.drawlsmask(land_color='coral', ocean_color='none', lakes=True, zorder=20)
m.drawcoastlines(linewidth=0.3, color='gray', zorder=25)

filename = "small_01.png"  #use your image here
lonmin, lonmax, latmin, latmax = (-130, -40, 35, 45) # set limits of the image

# compute the limits of the image in data coordinates
left, bottom = m (lonmin, latmin)
top, right = m(lonmax, latmax)
image_extent = (left, right, bottom, top)

ax = plt.gca()
# set zorder < 20, to plot the image below land areas
ax.imshow(plt.imread(filename), extent=image_extent, zorder=15)

# plot some meshgrid data
# set zorder above image, but below land
xs = np.linspace(-130, -60, 20)
ys = np.linspace(20, 60, 10)
x2d, y2d = np.meshgrid(xs, ys)

#ax.plot(*m(x2d, y2d), 'ro', zorder=16)  # faster
ax.scatter(*m(x2d, y2d), s=2, zorder=16)

plt.show()

Edit 1

Some useful code snippet:

# This plots shaded relief terrain covering land and sea.
m.shadedrelief(zorder = 25)

# This plots only ocean/sea parts on top.
m.drawlsmask(land_color='none', ocean_color='aqua', zorder=26)



来源:https://stackoverflow.com/questions/59850239/matplotlib-basemap-removing-ocean

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!