Numpy 准备数据以在Matplotlib'中绘制等高线;s底图
我很难用Matplotlib绘制底图,而且我对它相当陌生,所以我希望能得到一些帮助 我有以下格式的数据:Numpy 准备数据以在Matplotlib'中绘制等高线;s底图,numpy,plot,matplotlib,contour,matplotlib-basemap,Numpy,Plot,Matplotlib,Contour,Matplotlib Basemap,我很难用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.738333333333
[ (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(数据)需要是MxN矩阵,其中M=len(LATS)和N=len(LONS)。对我来说,Z是一个对角线矩阵,其中对角线包含对角线上的数据,对角线上的值是对应于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()
然而,我得到的情节是:。我需要这样的东西:
有人能指出我做错了什么并帮我策划吗?多谢各位
谢谢你为什么要写:
z = np.diag(data)
从中,numpy.diag(v,k=0)
提取对角线或构造对角线数组。
这就是为什么你只能得到一个“对角线区域”的值…我知道怎么做了。这是我最后编写的代码,我认为这可以帮助其他用户。如果有更好的方法,请说明,因为我是Matplotlib新手
您的链接要点是一个解决方案,但在另一个地方仍然是错误的 在你的问题和链接的要点中,你用lon和lat切换了x和y坐标 x代表lon y代表纬度
因此,链接的gist仍然会得到错误的结果。可能需要将x、y和z数组从1D数组重新调整为N-D数组(其中N大于1)。希望这能有所帮助。@khan,你能给我提供更多关于如何做的细节吗?我对numpy和matplotlib整体来说是个新手,所以我正在阅读有关它的文章。x和y实际上分别是纬度和经度值的列表。我不明白为什么它们应该是N-D数组。我可以做以下操作,并将其作为常规绘图(pyplot.contour(…)而不是basemap.contour(…)但是,当我对basemap.contour(…)执行相同操作时,使用以下代码:,我得到错误:@daneil:尝试通过np重塑数据。重塑(m,N)其中m和n是新矩阵的维数。我错了。起初,我认为z需要是一个二维数组(?)/矩阵,因为轮廓需要一个二维数组,只是盲目地使用它。