Python的底图没有与正确的坐标对齐?

2024-05-19 18:41:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个.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()

当我绘制数据时,我得到的几乎完全是我想要的,然而,由于某种原因,六边形热图被偏移,给出了以下图表: enter image description here

我一直在网上搜索可能的错误,但不幸的是找不到答案或故障排除。有人知道我如何解决这个问题吗


Tags: 数据fromimportnumpynp绘制温度array
1条回答
网友
1楼 · 发布于 2024-05-19 18:41:35

经过几个小时的挖掘,我终于找到了答案!我的代码的错误在于,我试图手动将地理坐标转换为显示图表的点坐标(乘以111139)

虽然这样做的逻辑是有道理的,但我相信当我开始将数据绘制到不同类型的图表(即正交、米勒投影等)上时,这个过程就失败了,因为不同的投影/图表将具有不同的点坐标(有点像计算机屏幕上的像素位置可能与不同计算机屏幕上的像素位置不对齐)

相反,Basemap模块有一个内置函数,可以将真实世界的坐标转换为可以绘制在图表上的坐标,对于您来说: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文件转换为可封装点。希望这能帮助将来可能有此问题的任何人

相关问题 更多 >