3

Matplotlibを使用してベースマップをプロットするのに苦労していて、かなり新しいので、助けを期待していました。

私は次の形式のデータを持っています:

[ (lat1, lon1, data1), 
  (lat2, lon2, data2),
  (lat3, lon3, data3),
  ...
  (latN, lonN, dataN) ]

そしてここにいくつかのサンプルデータがあります:

(32.0, -128.5, 3.99)
(31.0, -128.0, 3.5027272727272734)
(31.5, -128.0, 3.7383333333333333)
(32.0, -128.0, 3.624)
(32.5, -128.0, 3.913157894736842)
(33.0, -128.0, 4.443333333333334)

最後に、プロットする予定のデータに関する基本的な統計を次に示します。

LAT MIN:  22
LAT MAX:  50
LAT LEN:  1919
LON MIN:  -128
LON MAX:  -97
LON LEN:  1919
DATA MIN: 0
DATA MAX: 12
DATA LEN:  1919

米国本土のベースマップに等高線図を描く必要があります。私の人生では、プロット用のデータを設定する方法を理解できないようです。

X軸(LATS)はnp.arrayである必要があり、Y軸(LONS)はnp.arrayである必要があり、Z(DATA)はM = len(LATS)であるMxN行列である必要があることを読みました。 )およびN = len(LONS)。だから私には、Zを対角行列として見ています。対角線には、LATSとLONSのインデックスに対応するDATAで見つかった値である対角線上のデータが含まれています。

これが私のコードです:

def show_map(self, a):

    a = sorted(a, key = lambda entry: entry[0])     # sort by latitude
    a = sorted(a, key = lambda entry: entry[1])     # then sort by longitude

    lats = [ x[0] for x in a ]
    lons = [ x[1] for x in a ]
    data = [ x[2] for x in a ]

    lat_min = min(lats)
    lat_max = max(lats)
    lon_min = min(lons)
    lon_max = max(lons)
    data_min = min(data)
    data_max = max(data)

    x = np.array(lats)
    y = np.array(lons)
    z = np.diag(data)

    m = Basemap(
        projection = 'merc',
        llcrnrlat=lat_min, urcrnrlat=lat_max,
        llcrnrlon=lon_min, urcrnrlon=lon_max,
        rsphere=6371200., resolution='l', area_thresh=10000
        lat_ts = 20, resolution = 'c'
    )

    fig = plt.figure()
    plt.subplot(211)
    ax = plt.gca()

    # draw parallels
    delat = 10.0
    parallels = np.arange(0., 90, delat)
    m.drawparallels(parallels, labels=[1,0,0,0], fontsize=10)

    # draw meridians
    delon = 10.
    meridians = np.arange(180.,360.,delon)
    m.drawmeridians(meridians,labels=[0,0,0,1],fontsize=10)

    # draw map features
    m.drawcoastlines(linewidth = 0.50)
    m.drawcountries(linewidth = 0.50)
    m.drawstates(linewidth = 0.25)

    ny = z.shape[0]; nx = z.shape[1]        # make grid
    lo, la = m.makegrid(nx, ny)
    X, Y = m(lo, la)
    clevs = [0,1,2.5,5,7.5,10,15,20,30,40,50,70,100,150,200,250,300,400,500,600,750]
    cs = m.contour(X, Y, z, clevs)

    plt.show()

しかし、私が得たプロットはこれです:http: //imgur.com/li1Wg。この効果のために何かが必要です:http://matplotlib.org/basemap/_images/plotprecip.png

誰かが私が間違っていることを指摘し、これをプロットするのを手伝ってくれる?ありがとうございました。

ありがとう

4

3 に答える 3

2

私はそれを行う方法を理解しました。これは私が最終的に書いたコードであり、これは他のユーザーにも役立つと思います。私はMatplotlibを初めて使用するので、これを行うためのより良い方法がある場合は、それを述べてください。

https://gist.github.com/3789221

于 2012-09-25T22:31:08.800 に答える
1

リンクされた要点は解決策ですが、別の場所ではまだ間違っています。

あなたの質問とあなたのリンクされた要点で、あなたはlonとlatでxとyの座標を切り替えました。

xはlonを表します

yは緯度を表します

したがって、リンクされた要点ではまだ間違った結果が得られます。

于 2013-11-19T15:52:45.463 に答える
0

なぜあなたは書いているのですか:

z = np.diag(data) 

ドキュメントから、対角線をnumpy.diag(v, k=0)抽出するか、対角線配列を作成します。そのため、値の「対角領域」しか取得できません。

于 2012-09-25T16:14:46.727 に答える