Ich zeichne die hier verfügbare netCDF-Datei: https://goo.gl/QyUI4J
Mit dem folgenden Code sieht die Karte folgendermaßen aus:
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')
3 Antworten
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
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 !!
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.
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.
Verwandte Fragen
Neue Fragen
python
Python ist eine dynamisch typisierte Mehrzweck-Programmiersprache mit mehreren Paradigmen. Es wurde entwickelt, um schnell zu lernen, zu verstehen, zu verwenden und eine saubere und einheitliche Syntax durchzusetzen. Bitte beachten Sie, dass Python 2 ab dem 01.01.2020 offiziell nicht mehr unterstützt wird. Fügen Sie für versionenspezifische Python-Fragen das Tag [python-2.7] oder [python-3.x] hinzu. Wenn Sie eine Python-Variante (z. B. Jython, PyPy) oder eine Bibliothek (z. B. Pandas und NumPy) verwenden, fügen Sie diese bitte in die Tags ein.