使用底图和python在地图上绘制海洋 [英] Plotting oceans in maps using basemap and python

查看:407
本文介绍了使用底图和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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆