2016-04-19 4 views
1

Ich versuche, Schraffur (wie Punkte, Hashes, ..) über Konturkarte hinzuzufügen. Eine solche Schraffur könnte die einzigen statistisch signifikanten Konturen oder Konturen mit bestimmten Kriterien darstellen. Wie das folgende Bild auf Natur Artikel (zweite und dritte Handlung) http://www.nature.com/articles/srep16853/figures/3.Overly Patches, die die signifikanten Punkte über Konturkarte darstellen

Der folgende Code zeigt das Niederschlagsprotokoll von NOAA-Daten available zum Download an.

import numpy as np 
import sys 
import netCDF4 as nc 
import matplotlib.pyplot as plt 
import matplotlib.mlab as m 
import mpl_toolkits.basemap as bm 
import os 
sys.path.insert(0, '../');import py4met as sm;reload(sm) 

#- Reading data for a timeslice, latitude, and longitude: 
diri_output="./" 
diri="./" 
tmp_file = nc.Dataset(diri+"precip.mon.mean.nc","r") 
print(tmp_file.variables) 
p_pre = tmp_file.variables['precip'] 
lat  = tmp_file.variables['lat'][:] 
lon  = tmp_file.variables['lon'][:] 
time = tmp_file.variables['time'] 
tmp_file.close 


lat1=np.min(lat) 
lat2=np.max(lat) 
lon1=np.min(lon) 
lon2=np.max(lon) 

[lonall, latall] = np.meshgrid(lon[:], lat[:]) 
plt.figure(num=None, figsize=(8+4, 6+4), dpi=80, facecolor='w', edgecolor='k')  
mapproj = bm.Basemap(projection='cyl',llcrnrlat=lat1, llcrnrlon=lon1,urcrnrlat=lat2, urcrnrlon=lon2,resolution='l') 
mapproj.drawcoastlines() 
mapproj.drawmapboundary(fill_color='white') 
mapproj.drawcountries() 
x, y = mapproj(lonall, latall) 
plt.contourf(x,y,p_pre[240,:,:],cmap=plt.cm.GnBu) 
plt.colorbar(orientation='horizontal',pad=0.05,shrink=0.6) 
plt.title("title") 
xx,yy=np.where(p_pre[240,:,:] >= 20) 
sig=np.copy(p_pre[0,:,:]) 
sig[:,:]=1 
sig[xx,yy]=0 
#plt.contourf(x,y,sig,hatches=['.']) 
plt.show() 

ich will alle Konturen über 20 mm schlüpfen, so habe ich den obigen Befehl

plt.contourf (x, y, sig, Luken = [ ''])

aber es hat nicht funktioniert (es macht dotes überall auf der Karte und nicht nur Konturen mit bestimmten Kriterien), also habe ich es kommentiert. Irgendwelche Ideen.

Antwort

0

Sehen Sie diese matplotlib example page für eine Demo, wie Luken mit contourf verwendet werden können. Von besonderer Relevanz für Ihr Problem ist, dass (1) gibt es ein Schlüsselwort level, dass contourf dauert, um die Grenzen, welche Werte werden farbig und/oder schraffiert zu etablieren und (2) eine leere Zeichenfolge "" kann für die Abwesenheit von a verwendet werden Luke.

Also, statt der plt.contourf Linie haben Sie versuchen, auf Kommentar

levels = [p_pre[240,:,:].min(), 20, p_pre[240,:,:].max()] 
plt.contourf(x, y, p_pre[240,:,:], levels=levels, hatches=["", "."], alpha=0) 

ich Mühe hatte, Ihr Grundstück aus dem Daten neu zu erstellen Sie verknüpft, so erzeugt ich einige Zufallsdaten das Bild unter Verwendung des gleichen zu machen Prinzipien, die ich oben beschrieben habe.

enter image description here

+0

Vielen Dank, es funktioniert für mich. Jetzt habe ich verstanden, die Anzahl der schraffierten verwendet ist die Anzahl der Zeilen -1, so kann ich verschiedene Konturen Ebenen mit verschiedenen Schraffuren schlüpfen. Danke noch einmal. – kernel

+0

Ich bin froh, dass Matplotlib solche Fähigkeiten hat, ich habe gesucht, wie patchen in MatLab und ich habe solche eingebaute Fähigkeiten nicht gefunden, eher fand ich den folgenden Beitrag auf MatLab Dateiaustausch [link] (http: //www.mathworks .com/matlabcentral/fileexchange/30733-hatchfill). – kernel

Verwandte Themen