在轮廓上覆盖底图

时间:2014-01-11 11:32:04

标签: python matplotlib matplotlib-basemap

此问题是对an earlier question以及@JoeKington here的跟进。这两种解决方案都能很好地满足我的需求。 但是我一直试图在轮廓上叠加底图。通过这里的例子http://matplotlib.org/basemap/users/examples.html,我似乎没有做对。我认为我的基本问题是将轮廓x,y值转换为地图坐标。我重复1)轮廓的代码(由@usethedeathstar给出,效果非常好)和2)地图对象和绘图。

#!/usr/bin/python
from mpl_toolkits.basemap import Basemap
import numpy as np
from scipy.interpolate import griddata

class d():
    def __init__(self):
        A0 = open("meansr2.txt","rb") # 
        A1 = A0.readlines()
        A = np.zeros((len(A1),3))
        for i, l in enumerate(A1):
            li = l.split()
            A[i,0] = float(li[0])
            A[i,1] = float(li[1])
            A[i,2] = float(li[2])
        self.Lon = A[:,0]
        self.Lat = A[:,1]
        self.Z = A[:,2]
data = d()
numcols, numrows = 300, 300
xi = np.linspace(data.Lon.min(), data.Lon.max(), numrows)
yi = np.linspace(data.Lat.min(), data.Lat.max(), numcols)
xi, yi = np.meshgrid(xi, yi)

x, y, z = data.Lon, data.Lat, data.Z
points = np.vstack((x,y)).T
values = z
wanted = (xi, yi)
zi = griddata(points, values, wanted)

定义地图对象

m = Basemap(projection = 'merc',llcrnrlon = 21, llcrnrlat = -18, urcrnrlon = 34, urcrnrlat = -8, resolution='h')
m.drawcountries(linewidth=0.5, linestyle='solid', color='k', antialiased=1, ax=None, zorder=None)
m.drawmapboundary(fill_color = 'white')
m.fillcontinents(color='coral',lake_color='blue')
parallels = np.arange(-18, -8, 2.)
m.drawparallels(parallels, color = 'black', linewidth = 0.5, labels=[True,False,False,False])
meridians = np.arange(22,34, 2.)
m.drawmeridians(meridians, color = '0.25', linewidth = 0.5, labels=[False,False,False,True])

import pylab as plt

尝试将表单lat / lon转换为地图坐标     #lat = list(data.Lat)     #lon = list(data.Lon)     #x,y = m(lon,lat) 评论: 用(x,y,zi)尝试contourf,然后用xi,#yi重写所有上述定义,包括重新定义x,y和lon的许多不同尝试,lat.J

情节功能

fig = plt.figure(0, figsize=(8,4.5))
im = plt.contourf(xi, yi, zi)
plt.scatter(data.Lon, data.Lat, c= data.Z)
plt.colorbar()
plt.show()

上面给出了两个并列的情节。 这是一些数据,以防需要测试

Lon   Lat     Z   Z2  pos
32.6  -13.6   41   9  CHIP
27.1  -16.9   43  12  CHOM
32.7  -10.2   46  14  ISOK
24.2  -13.6   33  13  KABO
28.5  -14.4   43  11  KABW
28.1  -12.6   33  16  KAFI
27.9  -15.8   46  13  KAFU
24.8  -14.8   44   9  KAOM
31.1  -10.2   35  14  KASA
25.9  -13.5   24   8  KASE
29.1   -9.8   10  13  KAWA
25.8  -17.8   39  11  LIVI
33.2  -12.3   44   8  LUND
28.3  -15.4   46  12  LUSA
27.6  -16.1   47   9  MAGO
28.9  -11.1   31  15  MANS
31.3   -8.9   39   9  MBAL
31.9  -13.3   45   9  MFUW
23.1  -15.3   31   9  MONG
31.4  -11.9   39   9  MPIK
27.1  -15.0   42  12  MUMB
24.4  -11.8   15   9  MWIN
28.6  -13.0   39   9  NDOL
31.3  -14.3   44  12  PETA
23.3  -16.1   39   5  SENA
30.2  -13.2   38  11  SERE
24.3  -17.5   32  10  SESH
26.4  -12.2   23  12  SOLW
23.1  -13.5   27  14  ZAMB

任何帮助将不胜感激

我要感谢所有看过我的问题的人,并且可能已经尝试过这个问题。通过一致的尝试,我注意到底图在轮廓上的重叠实际上适用于以下几行 在地图对象定义之后

m = Basemap(projection = 'merc',llcrnrlon = 21, llcrnrlat = -18, urcrnrlon = 34, urcrnrlat = -8, resolution='h')

我有

x, y = m(xi, yi)
fig=plt.figure(figsize=(8,4.5))
cs = m.contour(x,y,zi,colors='b',linewidths=1.)

轮廓(x,y,zi)绘制地图上的轮廓。由于我使用的是contourf,我仍然需要找出为什么contourf不能给我完整的轮廓。 非常感谢你们的耐心和宽容。

0 个答案:

没有答案