2016-04-11 6 views
1

私はbasemap tutorial for SST and ice analysisに従おうとしています。入力データは例のデータと異なりますが、netCDF4はマスクされた配列です。パンダのデータフレームをベースマップのメッシュグリッドに再構成

ように私はpandasデータフレームを持っている:ラッツとロンは、データポイントのマップグリッド上の固有の位置を表す

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 

。次のコードを使用できるサンプルデータフレームを作成するには:

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}) 

iがそれを旋回し、このデータフレームを取る前に、やっていること(使用して内蔵のピボット機能)latカラムがインデックスとなるように、 lonカラムはカラムで、値は値です。次に、m.imshowを使用して結果の値をプロットすることができます。

しかし、これは貧弱な解決策であるようです。 A)pcolormeshは、私には不明な理由でimshowよりお勧めします。B)人々は通常meshgridを使い、次にマスクされた配列のようです。しかし、サンプルのデータはあらかじめ用意されているため、ベースマップの例に基づいて、メッシュグリッドとマスクされた配列にデータをどのように構造化するかについては、私は本当に不明です。

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) 

しかし、私は、構造と値が正しい場所に表示されるようにvalue列をマスクする方法を、この時点では不明だ:私はラッツ/ロンのmesh_gridを作成する場合

私は次のようにします私はそうのようpcolormeshにそれを与えるメッシュグリッドの:

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

私たちが実行できる任意のデータを使って例を挙げることはできますか? – Chiel

+0

私はもっと詳しい説明を追加しました。 – mnky9800n

+0

ヘルプが必要な場合は、人々が直接コピーして実行できるスクリプトを作成することが重要です。 – Chiel

答えて

1

基本的に、私の質問への答えは、私は私のデータフレームを旋回させる必要があります。

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

これはNaNsでデータが存在しない領域で満たし、そうのようにそれを返し、データフレームを旋回させます。ベースマップはパンダが好きではないので、私はデータを数の少ない配列として出力し、プロットします。

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() 
関連する問題