我正在尝试将热图与我创建的世界地图结合起来。我得到的是一个3列的CSV文件。第一列包含国家/地区名称,第二列和第三列分别包含纬度和经度。现在,我编写了一个类,根据该坐标在世界地图上绘制点。那很好,但是我现在想要的是一个热图,因为只有几个点,一切看起来都很好,但是我要有很多点。因此,应根据一个国家的点数和指定的边界来实现热图。
import csv
class toMap:
def setMap(self):
filename = 'log.csv'
lats, lons = [], []
with open(filename) as f:
reader = csv.reader(f)
next(reader)
for row in reader:
lats.append(float(row[1]))
lons.append(float(row[2]))
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
map = Basemap(projection='robin', resolution='l', area_thresh=1000.0,
lat_0=0, lon_0=-130)
map.drawcoastlines()
map.drawcountries()
map.fillcontinents(color='gray')
#map.bluemarble()
#map.drawmapboundary()
map.drawmeridians(np.arange(0, 360, 30))
map.drawparallels(np.arange(-90, 90, 30))
x, y = map(lons, lats)
map.plot(x, y, 'ro', markersize=3)
plt.show()
def main():
m = toMap()
m.setMap()
Run Code Online (Sandbox Code Playgroud)
以下是CSV外观的示例:
Vietnam,10.35,106.35
United States,30.3037,-97.7696
Colombia,4.6,-74.0833
China,35.0,105.0
Indonesia,-5.0,120.0
United States,38.0,-97.0
United States,41.7511,-88.1462
Bosnia and Herzegovina,43.85,18.3833
United States,33.4549,-112.0777
Run Code Online (Sandbox Code Playgroud)
遵循我上面的评论中的相同逻辑,我对您的代码进行了一些更改以获得所需的映射。
我的解决方案使用cartopy库。
因此,这是您的代码,包括我的更改(和注释):
import csv
class toMap:
def setMap(self):
# --- Save Countries, Latitudes and Longitudes ---
filename = 'log.csv'
pais, lats, lons = [], [], []
with open(filename) as f:
reader = csv.reader(f)
next(reader)
for row in reader:
pais.append(str(row[0]))
lats.append(float(row[1]))
lons.append(float(row[2]))
#count the number of times a country is in the list
unique_pais = set(pais)
unique_pais = list(unique_pais)
c_numero = []
for p in unique_pais:
c_numero.append(pais.count(p))
print p, pais.count(p)
maximo = max(c_numero)
# --- Build Map ---
import cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
cmap = mpl.cm.Blues
# --- Using the shapereader ---
test = 0
shapename = 'admin_0_countries'
countries_shp = shpreader.natural_earth(resolution='110m',
category='cultural', name=shapename)
ax = plt.axes(projection=ccrs.Robinson())
for country in shpreader.Reader(countries_shp).records():
nome = country.attributes['name_long']
if nome in unique_pais:
i = unique_pais.index(nome)
numero = c_numero[i]
ax.add_geometries(country.geometry, ccrs.PlateCarree(),
facecolor=cmap(numero / float(maximo), 1),
label=nome)
test = test + 1
else:
ax.add_geometries(country.geometry, ccrs.PlateCarree(),
facecolor='#FAFAFA',
label=nome)
if test != len(unique_pais):
print "check the way you are writting your country names!"
plt.show()
def main():
m = toMap()
m.setMap()
Run Code Online (Sandbox Code Playgroud)
按照您的逻辑,我已经根据一些国家/地区制作了一个自定义log.csv文件,这是我的地图:

(我使用了Blues颜色图,比例的最大值是根据一个国家在csv文件中出现的最大次数来定义的。)
根据您在编辑问题之前的示例图像,我认为这正是您想要的!
| 归档时间: |
|
| 查看次数: |
7704 次 |
| 最近记录: |