我有一个.dat
文件,其中包含坐标列表(〜100k)和每个坐标处的温度。它具有这样的结构:
-59.083 -26.583 0.2
-58.417 -26.250 0.6
-58.412 -26.417 0.4
...
为了直观地显示温度范围,我创建了一个numpy数组,并使用Python的Basemap模块绘制了数据集。我编写的代码如下:
from matplotlib import pyplot as plt
from mpl_toolkits.basemap import Basemap
import numpy as np
m = Basemap(projection='mill',llcrnrlat=-90,urcrnrlat=90,\
llcrnrlon=-180,urcrnrlon=180,resolution='c')
m.drawcoastlines(linewidth=0.15)
data = np.loadtxt('gridly.dat')
xcoordlist = []
ycoordlist = []
tempvallist = []
for i in data:
xcoord = i[0]
ycoord = i[1]
tempval = i[2]
xcoord2 = xcoord*111139 #<--- Multiplying converts each coordinate's degrees to meters)
ycoord2 = ycoord*111139
xcoordlist.append(xcoord2)
ycoordlist.append(ycoord2)
tempvallist.append(tempval)
xco = np.array(xcoordlist)
yco = np.array(ycoordlist)
tval = np.array(tempvallist)
gridsize = 100
m.hexbin(yco, xco, C=tval, gridsize=gridsize)
cb = m.colorbar()
plt.show()
[绘制数据时,我得到的几乎是我想要的,但是,由于某种原因,六角形的热图被偏移了,给出了以下图表:
我一直在网上搜索可能出问题的地方,但不幸的是找不到答案或进行故障排除。有谁知道我该如何解决这个问题?
经过数小时的挖掘,我终于明白了!我的代码出了什么问题,我试图将地理坐标手动转换为显示图表的点坐标(乘以111139)。
尽管这样做的逻辑是有道理的,但我认为当我开始将数据绘制到不同种类的图表(即正交图,米勒投影等)上时,此过程就破裂了,因为不同的投影/图表将具有不同的点坐标(有点像您计算机屏幕上的像素位置可能与其他计算机屏幕上的像素位置不对齐)。
相反,底图模块具有内置功能,可以将现实世界的坐标转换为可以在图表上为您绘制的坐标:m(x, y)
。
因此,经过改进和正确的脚本将是:
from matplotlib import pyplot as plt
from mpl_toolkits.basemap import Basemap
import numpy as np
m = Basemap(projection='mill',llcrnrlat=-90,urcrnrlat=90,\
llcrnrlon=-180,urcrnrlon=180,resolution='c')
m.drawcoastlines(linewidth=0.15)
data = np.loadtxt('gridly.dat')
xcoordlist = []
ycoordlist = []
tempvallist = []
for i in data:
lat = i[0]
lon = i[1]
tempval = i[2]
xpt, ypt = m(lon, lat)
xcoordlist.append(xpt)
ycoordlist.append(ypt)
tempvallist.append(tempval)
xco = np.array(xcoordlist)
yco = np.array(ycoordlist)
tval = np.array(tempvallist)
gridsize = 100
m.hexbin(xco, yco, C=tval, gridsize=gridsize)
cb = m.colorbar()
plt.show()
您可以看到xpt, ypt = m(lon, lat)
的位置,该函数将lon
文件中的真实经度(lat
)和纬度(.dat
)转换为可饮用点。希望这对以后可能遇到此问题的其他人有所帮助!