我有一个经纬度数据集,如下所示:
id,spp,lon,lat
1a,sp1,1,9
1b,sp1,3,11
1c,sp1,6,12
2a,sp2,1,9
2b,sp2,1,10
2c,sp2,3,10
2d,sp2,4,11
2e,sp2,5,12
2f,sp2,6,12
3a,sp3,4,13
3b,sp3,5,11
3c,sp3,8,8
4a,sp4,4,12
4b,sp4,6,11
4c,sp4,7,8
5a,sp5,8,8
5b,sp5,7,6
5c,sp5,8,2
6a,sp6,8,8
6b,sp6,7,5
6c,sp6,8,3
从这些数据中,我想生成如下网格:
^{pr2}$它使用变量“spp”作为分类(分组)因子,给出网格中每个单元格中的数据记录数。在
从这个网格,我想创建一个热图,叠加在一个地理地图上,这样我就得到了类似下图的结果。在
我(最后)设法写了一些代码,可以做我想做的。在
这里是:
import csv
import numpy as np
from mpl_toolkits.basemap import Basemap
from matplotlib import cm as cmap
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
#read input data
with open('testdata.csv', 'r') as csvfile:
reader = csv.reader(csvfile, delimiter=',')
headers = reader.next()
input_data = list(reader)
#grid dimensions with one-degree resolution
lat_inf, lon_inf = 0, 0
lat_sup, lon_sup = 90, 360
resolution = 1
latitude, longitude = [], []
latitude = range(lat_inf, lat_sup, resolution)
longitude = range(lon_inf, lon_sup, resolution)
#create output grid
output_grid = []
for i in latitude:
output_grid.append([])
for j in longitude:
output_grid[i].append(0)
#traverse the input_data evaluating the lat, lon coordinates
#summing +1 in the output_grid[latitude][longitude].
for row in input_data:
lat = int(row[2])
lon = int(row[3])
#sp = row[1]
#check its indexes
i_lat = latitude.index(lat)
i_lon = longitude.index(lon)
#increase counter
output_grid[i_lat][i_lon] += 1
output_grid = np.array(output_grid, np.int16)
#create map
m = Basemap()
m.drawcoastlines(linewidth=0.25)
#display image
im = m.imshow(output_grid.transpose(), cmap='summer', origin='lower', aspect='auto', interpolation='none')
m.colorbar(im)
plt.show()
它(基本上)可以工作,但问题是网格图像没有正确显示:它看起来太小,在地图的左下角,如下图所示)。在
另外,除了摆弄Matplotlib颜色映射之外,有没有其他方法可以更改图像网格的背景颜色?在
任何提示,想法,建议将不胜感激。在
doc for Basemap上写着
因此,您需要将数据转换为lat和lon的度数,将它们传递给Basemap,然后使用返回给您的数据来绘制位置。在
您得到的颜色是“酷”的默认颜色(请参见绘图右侧的颜色栏)。我不确定如何更改它,但我认为应该有一些参数可以传递给MPL例程来告诉它哪个颜色用于“cool”而哪个颜色用于“warm”。在
在底图上绘制图像可能是可能的,但您需要调整坐标和范围以使其处于正确的位置。在
最好使用
pcolormesh
,它支持非等距网格,因此非常适合不同的投影。你需要的不仅是你的数据,还有一个网格。此网格定义数据的每个点的位置。 在使用栅格之前,您需要将其转换为底图坐标系,因此如果lons,lats = np.meshgrid(..., ...)
是栅格,m = Basemap(..)
,则转换后的栅格是然后可以将其提供给
^{pr2}$pcolormesh
一个完整的例子,我们有一个形状(60x40)的数据数组,我们希望它位于经度范围-10到50度之间,纬度范围在-20到20度之间:
相关问题 更多 >
编程相关推荐