2017-07-03 73 views
0

我试图使用底图制作热量/强度图。我的投入是一系列的投注,投注和强度。数据集如下所示:输入格式为pcolormesh

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的格式不正确。我无法找到任何有关我应该如何塑造该列表的文档。如何将其格式化为正确的形状?

谢谢。

回答

2

如您所知,pcolormesh用于通过创建二维数组的伪彩色图来绘制四边形网格。错误细节确实表明:在线numRows, numCols = C.shape,它预计C是一个二维阵列,而你提供的C似乎是一个1D阵列,从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() 

enter image description here