使用底图和python在地图上绘制海洋 [英] Plotting oceans in maps using basemap and python
问题描述
我正在绘制可用的netCDF文件: https://goo.gl/QyUI4J
I am plotting the netCDF file available here: https://goo.gl/QyUI4J
使用下面的代码,地图如下所示:
Using the code below, the map looks like this:
但是,我希望海洋是白色的.更好的是,我希望能够指定海洋显示为哪种颜色.如何更改下面的代码来做到这一点?目前,问题在于海洋正在数据规模上标绘. (请注意,netCDF文件的大小约为3.5 GB).
However, I want the oceans to be in white color. Better still, I want to be able to specify what color the oceans show up in. How do I change the code below to do that? Right now, the issue is that the oceans are getting plotted on the data scale. (please note that the netCDF file is huge ~3.5 GB).
import pdb, os, glob, netCDF4, numpy
from matplotlib import pyplot as plt
from mpl_toolkits.basemap import Basemap
def plot_map(path_nc, var_name):
"""
Plot var_name variable from netCDF file
:param path_nc: Name of netCDF file
:param var_name: Name of variable in netCDF file to plot on map
:return: Nothing, side-effect: plot an image
"""
nc = netCDF4.Dataset(path_nc, 'r', format='NETCDF4')
tmax = nc.variables['time'][:]
m = Basemap(projection='robin',resolution='c',lat_0=0,lon_0=0)
m.drawcoastlines()
m.drawcountries()
# find x,y of map projection grid.
lons, lats = get_latlon_data(path_nc)
lons, lats = numpy.meshgrid(lons, lats)
x, y = m(lons, lats)
nc_vars = numpy.array(nc.variables[var_name])
# Plot!
m.drawlsmask(land_color='white',ocean_color='white')
cs = m.contourf(x,y,nc_vars[len(tmax)-1,:,:],numpy.arange(0.0,1.0,0.1),cmap=plt.cm.RdBu)
# add colorbar
cb = m.colorbar(cs,"bottom", size="5%", pad='2%')
cb.set_label('Land cover percentage '+var_name+' in '+os.path.basename(path_nc))
plt.show()
plot_map('perc_crops.nc','LU_Corn.nc')
推荐答案
您需要使用nc_vars数据集上的"noreferrer> maskoceans
You need to use maskoceans
on your nc_vars
dataset
在contourf
之前,插入
nc_new = maskoceans(lons,lats,nc_vars[len(tmax)-1,:,:])
,然后使用新屏蔽的数据集调用contourf
,即
and then call contourf
with the newly masked dataset i.e.
cs = m.contourf(x,y,nc_new,numpy.arange(0.0,1.0,0.1),cmap=plt.cm.RdBu)
要指定海洋的颜色,如果您想要白色的海洋,可以将呼叫打到drawslmask
,也可以在该呼叫中指定海洋的颜色-例如插入m.drawlsmask(land_color='white',ocean_color='cyan')
.
To dictate the ocean colour, you can either drop the call to drawslmask
if you want white oceans or specify an ocean colour in that call - e.g. insert m.drawlsmask(land_color='white',ocean_color='cyan')
.
我在下面给出了对您的修改尽可能少的工作代码.取消对drawslmask
的调用的注释,以查看青绿色的海洋.
I've given the working code with as few alterations to yours as possible below. Uncomment the call to drawslmask
to see cyan coloured oceans.
import pdb, os, glob, netCDF4, numpy
from matplotlib import pyplot as plt
from mpl_toolkits.basemap import Basemap, maskoceans
def plot_map(path_nc, var_name):
"""
Plot var_name variable from netCDF file
:param path_nc: Name of netCDF file
:param var_name: Name of variable in netCDF file to plot on map
:return: Nothing, side-effect: plot an image
"""
nc = netCDF4.Dataset(path_nc, 'r', format='NETCDF4')
tmax = nc.variables['time'][:]
m = Basemap(projection='robin',resolution='c',lat_0=0,lon_0=0)
m.drawcoastlines()
m.drawcountries()
# find x,y of map projection grid.
lons, lats = nc.variables['lon'][:],nc.variables['lat'][:]
# N.B. I had to substitute the above for unknown function get_latlon_data(path_nc)
# I guess it does the same job
lons, lats = numpy.meshgrid(lons, lats)
x, y = m(lons, lats)
nc_vars = numpy.array(nc.variables[var_name])
#mask the oceans in your dataset
nc_new = maskoceans(lons,lats,nc_vars[len(tmax)-1,:,:])
#plot!
#optionally give the oceans a colour with the line below
#Note - if land_color is omitted it will default to grey
#m.drawlsmask(land_color='white',ocean_color='cyan')
cs = m.contourf(x,y,nc_new,numpy.arange(0.0,1.0,0.1),cmap=plt.cm.RdBu)
# add colorbar
cb = m.colorbar(cs,"bottom", size="5%", pad='2%')
cb.set_label('Land cover percentage '+var_name+' in '+os.path.basename(path_nc))
plt.show()
plot_map('perc_crops.nc','LU_Corn.nc')
P.S. .这是要测试的大文件!
P.S. That's a big file to test!!
这篇关于使用底图和python在地图上绘制海洋的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!