【问题标题】:Preparing data to plot contours in Matplotlib's Basemap准备数据以在 Matplotlib 的底图中绘制轮廓
【发布时间】:2012-09-16 03:04:00
【问题描述】:

我很难用 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) 需要是 MxN 矩阵,其中 M = len(LATS) 和 N = len(LONS)。所以对我来说,我认为 Z 是一个对角矩阵,其中对角线包含对角线上的数据,即在 DATA 中找到的值对应于 LATS 和 LONS 的索引。

这是我的代码:

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

有人能指出我做错了什么并帮我策划吗?谢谢。

谢谢

【问题讨论】:

  • 可能您需要将 x、y 和 z 数组从一维数组重塑为 N 维数组(其中 N > 1)。希望这会有所帮助。
  • @khan,您能否向我提供有关如何执行此操作的更多详细信息?作为一个整体,我对 numpy 和 matplotlib 有点陌生,所以我正在阅读它。 x 和 y 实际上是纬度和经度值的列表(分别)。我不明白为什么它们应该是 N 维数组。
  • 我能够执行以下操作并使其作为常规绘图工作(pyplot.contour(...) 而不是 basemap.contour(...))pastebin.com/keiSHwPL
  • 但是,当我对 Basemap.contour(...) 执行相同操作时,使用此代码:pastebin.com/qBSUu79E,我收到错误:pastebin.com/V97vRNJ9
  • @daneil:尝试通过 np.reshape(m, n) 重塑数据,其中 m 和 n 是新矩阵的维度。

标签: numpy plot matplotlib contour matplotlib-basemap


【解决方案1】:

你为什么要写:

z = np.diag(data) 

documentationnumpy.diag(v, k=0) 提取对角线或构造对角线数组。 这应该就是为什么你只能得到一个“对角线区域”的值......

【讨论】:

  • 我错了。起初,我认为 z 需要是一个二维数组(?)/矩阵,因为轮廓需要一个二维数组并且只是盲目地使用它。
【解决方案2】:

我想出了怎么做。这是我最后写的代码,我认为这可以帮助其他用户。如果有更好的方法,请说明,因为我是 Matplotlib 的新手。

https://gist.github.com/3789221

【讨论】:

    【解决方案3】:

    您的链接要点是一个解决方案,但在另一个地方仍然是错误的。

    在您的问题和链接的要点中,您使用 lon 和 lat 切换了 x 和 y 坐标。

    x代表lon

    y代表纬度

    因此,您的链接要点仍然会得到错误的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-03
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多