我有一个.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)
虽然这样做的逻辑是有道理的,但我相信当我开始将数据绘制到不同类型的图表(即正交、米勒投影等)上时,这个过程就失败了,因为不同的投影/图表将具有不同的点坐标(有点像计算机屏幕上的像素位置可能与不同计算机屏幕上的像素位置不对齐)
相反,Basemap模块有一个内置函数,可以将真实世界的坐标转换为可以绘制在图表上的坐标,对于您来说:
m(x, y)
因此,经过改进的正确脚本应该是:
正如您看到的
xpt, ypt = m(lon, lat)
,该函数将现实世界的经度(lon
)和纬度(lat
)从.dat
文件转换为可封装点。希望这能帮助将来可能有此问题的任何人相关问题 更多 >
编程相关推荐