2016-04-11 12 views
1

Ich versuche, die basemap tutorial for SST and ice analysis zu folgen. Meine Eingabedaten unterscheiden sich von den Daten in dem Beispiel, das von netCDF4 als maskiertes Array stammt.restrukturieren pandas datenframe in meshgrid für grundkarte

Ich habe einen pandas Datenrahmen wie:

val_df[0:5] 
Out[47]: 
    lat lon  value 
0 0.4 98.7 NaN 
1 0.4 98.8 NaN 
2 0.4 98.9 0.64 
3 0.4 99.0 NaN 
4 0.5 98.5 1.23 

den Lats und Lons eine einzigartige Lage auf einer Karte Raster für den Datenpunkt darstellen. Um eine Beispieldatenrahmen erstellen Sie den folgenden Code verwenden:

from itertools import product 
import pandas as pd 
import numpy as np 

locations = np.array([x for x in product([1,2,3],[4,5,6])]) 
data = np.random.random(len(locations)) 
val_df = pd.DataFrame({'lat':locations[:,0], 'lon':locations[:,1], 
         'value':data}) 

Was ich vor getan wird diese Datenrahmen nehmen, schwenken sie (mit dem eingebauten in Pivot-Funktion), so dass die lat Spalte ist der Index und die lon Spalte ist die Spalten und die Werte sind die Werte. Dann kann ich m.imshow verwenden, um die resultierenden Werte zu plotten.

Dies scheint jedoch eine schlechte Lösung zu sein. A) pcolormesh ist mehr empfohlen als imshow aus Gründen, die für mich unklar sind, B) Es scheint, dass Leute normalerweise meshgrid und dann ein maskiertes Array verwenden. Allerdings bin ich mir nicht sicher, wie ich meine Daten basierend auf den Grundkartenbeispielen in das Meshgrid und das maskierte Array strukturieren kann, da die Daten in den Beispielen vorgeformt sind.

Als ich die mesh_grid des Lats/Lons erstelle ich Sie wie folgt vor:

latmin = np.floor(val_df.lat.min()) 
latmax = np.ceil(val_df.lat.max()) 
lonmin = np.floor(val_df.lon.min()) 
lonmax = np.ceil(val_df.lon.max()) 
lats = np.arange(latmin, latmax, 0.1) 
lons = np.arange(lonmin, lonmax, 0.1) 
lats_mesh, lons_mesh = np.meshgrid(lats, lons) 

Aber ich bin an dieser Stelle unklar, wie zu strukturieren und maskieren die value Spalte, so dass die Werte in der richtigen Stelle erscheinen das Maschengitters, wenn ich es zu pcolormesh geben wie so:

from mpl_toolkits.basemap import Basemap 
m = Basemap(projection='merc' 
      , llcrnrlon=lonmin 
      , llcrnrlat=latmin 
      , urcrnrlon=lonmax 
      , urcrnrlat=latmax) 
m.drawcoastlines() 
m.drawstates() 
m.drawcountries() 
m.fillcontinents(color='gray', lake_color='white', zorder=0) 
m.drawmapboundary(fill_color='white') 

pc1 = m.pcolormesh(lons, lats, masked_data, shading='flat', cmap='hot_r', latlon=True) 
+0

Können Sie ein Beispiel mit beliebigen Daten, die wir ausführen können? – Chiel

+0

Ich habe eine tiefere Beschreibung hinzugefügt. – mnky9800n

+0

Wenn Sie Hilfe benötigen, ist es wichtig, dass Sie ein Skript erstellen, das Benutzer direkt kopieren und ausführen können. – Chiel

Antwort

1

Grundsätzlich ist die Antwort auf meine Frage, die ich brauchte, um meinen Datenrahmen zu schwenken.

val_pivot_df = val_df.pivot(index='lat', columns='lon', values='b_value') 

Dies schwenkt den Datenrahmen, füllt die Bereiche, in denen es keine Daten mit NaNs ist und gibt es wie so. Da basemap Pandas nicht mag, gebe ich die Daten dann als numpy arrays aus und zeichne sie auf.

lons = val_pivot_df.columns.values 
lats = val_pivot_df.index.values 

fig, ax = plt.subplots(1, figsize=(8,8)) 

m = Basemap(projection='merc', 
     llcrnrlat=val_df.dropna().min().lat-5 
     , urcrnrlat=val_df.dropna().max().lat+5 
     , llcrnrlon=val_df.dropna().min().lon-5 
     , urcrnrlon=val_df.dropna().max().lon+5 
     , resolution='i', area_thresh=10000 
     ) 

m.drawcoastlines() 
m.drawstates() 
m.drawcountries() 
m.fillcontinents(color='gray', lake_color='white')#, zorder=0) 
m.drawmapboundary(fill_color='0.3') 

x, y = np.meshgrid(lons,lats) 
px,py = m(x,y) 

data_values = val_pivot_df.values 
masked_data = np.ma.masked_invalid(data_values) 

cmap = plt.cm.viridis 

m.pcolormesh(px, py, masked_data, cmap=cmap, vmin=0, vmax=2, shading='flat') 

m.colorbar() 
Verwandte Themen