问题
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:
- A plot with continents on top of a meshplot and/or image
- 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