Ich zeichne die hier verfügbare netCDF-Datei: https://goo.gl/QyUI4J

Mit dem folgenden Code sieht die Karte folgendermaßen aus: Bildbeschreibung hier eingeben

Ich möchte jedoch, dass die Ozeane weiß sind. Besser noch, ich möchte angeben können, in welcher Farbe die Ozeane angezeigt werden. Wie ändere ich den folgenden Code, um dies zu tun? Im Moment ist das Problem, dass die Ozeane auf der Datenskala dargestellt werden. (Bitte beachten Sie, dass die netCDF-Datei ~ 3,5 GB groß ist).

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')
5
user308827 13 Aug. 2015 im 21:42

3 Antworten

Beste Antwort

Sie müssen maskoceans auf Ihrem {{{ X1}} Datensatz

Fügen Sie dies vor contourf ein

nc_new = maskoceans(lons,lats,nc_vars[len(tmax)-1,:,:])

Und dann contourf mit dem neu maskierten Datensatz aufrufen, d.h.

cs = m.contourf(x,y,nc_new,numpy.arange(0.0,1.0,0.1),cmap=plt.cm.RdBu)

Um die Ozeanfarbe zu bestimmen, können Sie entweder den Anruf an drawslmask abbrechen, wenn Sie weiße Ozeane möchten, oder eine Ozeanfarbe in diesem Anruf angeben - z. füge m.drawlsmask(land_color='white',ocean_color='cyan') ein.

Ich habe den Arbeitscode mit möglichst wenigen Änderungen an Ihrem unten angegeben. Kommentieren Sie den Aufruf von drawslmask aus, um cyanfarbene Ozeane zu sehen.

Ausgabe

enter image description here

Voll funktionsfähige Version des Codes

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. Das ist eine große Datei zum Testen !!

8
J Richard Snape 20 Aug. 2015 im 13:55

Die Farben, die Sie in der Karte sehen, beziehen sich auf die Farbkarte cm.plt.RdBu, die an die Funktion contourcf übergeben wird. Sie müssen diese Farbkarte ändern, um die gewünschten Ergebnisse zu erzielen. Hier finden Sie ein Tutorial für die Grundkarten-Farbkarte.

-2
rfkortekaas 13 Aug. 2015 im 19:48

Die rechtmäßig gute Lösung besteht darin, die Dienstprogrammfunktion maskoceans zu verwenden , das ein Datenarray aufnimmt und alle Punkte in Ozeanen und Seen maskiert.

Stattdessen könnten Sie den einfachen Ausweg nehmen. Zeichnen Sie zuerst Ihr Konturdiagramm und verwenden Sie dann drawlsmask, das transparente Farben ermöglicht:

# Colors can be RGBA tuples
m.drawlsmask(land_color=(0, 0, 0, 0), ocean_color='deeppink', lakes=True)

Land ist transparent, wodurch das Konturdiagramm durchscheint.

4
approxiblue 20 Aug. 2015 im 14:26