После нескольких часов копания я наконец понял это! Что было не так с моим кодом, так это то, что я пытался вручную преобразовать географические c координаты в координаты точки для отображаемой диаграммы (умножением на 111139).
Хотя логика c для этого имеет смысл, я полагаю, что этот процесс прервался, когда я начал наносить данные на различные виды диаграмм (т. Е. Ортогональные, проекции Миллера и т. Д. c.), Потому что разные проекции / диаграммы будут иметь разные координаты точек (например, как расположение пикселей на экране вашего компьютера может не совпадать с расположением пикселей на другом экране компьютера).
Вместо этого модуль базовой карты имеет встроенную в функции, которая преобразует координаты реального мира в координаты, которые могут быть нанесены на график, для вас: 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
в пригодные для обработки точки. Надеюсь, что это поможет кому-то еще, кто может иметь эту проблему в будущем!