【问题标题】:Input Format to pcolormeshpcolormesh 的输入格式
【发布时间】:2017-07-03 21:57:16
【问题描述】:

我正在尝试使用 Basemap 制作热量/强度图。我的输入是当时的一组纬度、经度和强度。数据集如下所示:

lat[0], lon[0] = intensity[0]
lat[1], lon[1] = intensity[1]
...
lat[n], lon[n] = intensity[n]

在每个索引处,纬度和经度对应于正确的传感器读数。我的代码如下所示:

fig = plt.figure(figsize=(10, 8))


# Set title
fig.suptitle("Intensities {} {}".format(start_time, stop_time))


# US Centered Map
map_axis = fig.add_subplot(111)
map = Basemap(
    ax = map_axis,
    lat_0 = 40, lon_0 = -95,
    width = 6500e3, height = 6500e3,
    projection = 'stere',
    resolution = 'l'
)
map.drawcoastlines()


lats = ...
lons = ...
intn = ...


# Convert coordinates
lons, lats = map(lons, lats)


LONS, LATS = np.meshgrid(lons, lats)
map.pcolormesh(
    LONS, LATS,
    intn,
    vmin = 0, vmax = 100
)


fig.savefig(file_name)
plt.close(fig) 

此代码永远不会完成。我已经成功地自己绘制了底图。 pcolormesh 是失败的。程序因此错误而崩溃。

    $ ./plot_intensities.py
    Running 2013-04-10 00:02:30 2013-04-10 00:02:45
    Traceback (most recent call last):
      File "./plot_intensities.py", line 151, in <module>
        make_maps(samples)
      File "./plot_intensities.py", line 144, in make_maps
        make_map(bin_samples, start, walk)
      File "./plot_intensities.py", line 117, in make_map
        vmin = 0, vmax = 100
      File "/usr/lib/python3/dist-packages/mpl_toolkits/basemap/__init__.py", line 521, in with_transform
        return plotfunc(self,x,y,data,*args,**kwargs)
      File "/usr/lib/python3/dist-packages/mpl_toolkits/basemap/__init__.py", line 3418, in pcolormesh
        ret =  ax.pcolormesh(x,y,data,**kwargs)
      File "/usr/lib/python3/dist-packages/matplotlib/__init__.py", line 1814, in inner
        return func(ax, *args, **kwargs)
      File "/usr/lib/python3/dist-packages/matplotlib/axes/_axes.py", line 5395, in pcolormesh
        X, Y, C = self._pcolorargs('pcolormesh', *args, allmatch=allmatch)
      File "/usr/lib/python3/dist-packages/matplotlib/axes/_axes.py", line 4995, in _pcolorargs
        numRows, numCols = C.shape
    ValueError: not enough values to unpack (expected 2, got 1)

我了解我的数据,第三个参数intn 的格式不正确。我找不到任何关于我应该如何塑造该列表的文档。如何将其格式化为正确的形状?

谢谢。

【问题讨论】:

    标签: matplotlib matplotlib-basemap


    【解决方案1】:

    如您所知,pcolormesh 用于通过创建二维数组的伪彩色图来绘制四边形网格。错误详细信息确实表明:在numRows, numCols = C.shape 行,它期望C 是一个二维数组,而您提供的C 似乎是一个一维数组,从ValueError: not enough values to unpack (expected 2, got 1) 判断。您介绍的数据集在我看来只有对角线上的强度值(lat == lon)。要获得颜色网格,您至少需要将强度数据扩展到二维数组并以某种方式填充缺失值。例如:

    import matplotlib.pyplot as plt
    from mpl_toolkits.basemap import Basemap
    import numpy as np
    
    fig = plt.figure(figsize=(10, 8))
    # Set title
    fig.suptitle("Intensities {} {}".format('start_time', 'stop_time'))
    # US Centered Map
    map_axis = fig.add_subplot(111)
    map = Basemap(
        ax = map_axis,
        lat_0 = 40, lon_0 = -95,
        width = 6500e3, height = 6500e3,
        projection = 'stere',
        resolution = 'l'
    )
    map.drawcoastlines()
    
    # Tried my best to simulate your data example. Don't be surprise if the result is ugly ...
    nstep = 1
    lats = np.arange(map.latmin, map.latmax, nstep)
    lons = np.arange(map.lonmin, map.lonmax, nstep)
    l = min(len(lats), len(lons))
    lats = lats[:l]
    lons = lons[:l]
    intn = np.random.randint(0, 100, size=l)
    
    # Convert coordinates
    lons, lats = map(lons, lats)
    LONS, LATS = np.meshgrid(lons, lats)
    
    # The following 3 lines are just an example of the minimum you got to do before it works.
    intn_array = np.zeros(LONS.shape)
    for i in range(l):
        intn_array[i, i] = intn[i]
    intn = intn_array
    
    map.pcolormesh(
        LONS, LATS,
        intn_array,
        vmin = 0, vmax = 100
    )
    
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      相关资源
      最近更新 更多