我正在尝试使用Python,MatPlotLib和Basemap将世界人口信息显示为地图上的叠加层。我在网上找到了人口信息,设法将其显示为地图上的圆圈,并根据人口数量更改了圆圈大小。看起来不错,但是我希望显示与轮廓相同的总体信息,但到目前为止还没有成功。
这就是我所拥有的:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as ml
from mpl_toolkits.basemap import Basemap
# Read data.
world_data = np.genfromtxt('worldData_formatted.csv', delimiter=',')
# Define map with coastlines.
m = Basemap(projection = 'mill', resolution='c')
m.drawcoastlines()
# Loop through data and append to list.
lats, lons, data, ms = [], [], [], []
for idx, i in enumerate(world_data):
lats.append(i[1])
lons.append(i[2])
data.append(i[3])
# Plot population circles. Circles are larger for bigger populations.
xt, yt = m(i[2], i[1])
ms = i[3] * 1e-6
m.plot(xt, yt, 'ro', markersize=ms, fillstyle='none')
# Convert to numpy array
x = np.array(lats)
y = np.array(lons)
z = np.array(data)
# Generate linear spaced vector
res = 1
xi = np.linspace(min(lats), max(lats) + res, (max(lats) - min(lats)) / res)
yi = np.linspace(min(lons), max(lons) + res, (max(lons) - min(lons)) / res)
xi, yi = np.meshgrid(xi, yi)
# Grid population data.
zi = ml.griddata(x, y, z, xi, yi)
# Make grid and plot contours and population circles
lat, lon = m.makegrid(zi.shape[1], zi.shape[0])
x,y = m(lat, lon)
m.contour(x, y, zi)
# Display plot
plt.axis('off')
plt.tight_layout(pad=0, w_pad=0, h_pad=0)
plt.show()
哪个输出:
人口圈子是正确的,您可以在东京,纽约,墨西哥城看到较大的圈子...但是轮廓完全不一样,仅在中东,哈萨克斯坦西部和乔治亚州北部显示一对(认为?)。等高线应该与圆重叠,但是我对等高线感兴趣的是这些人口将合并并在各个县之间表现出更多的流动性。
我认为我有两个问题。
第一个是我已经取消了轮廓信息的缩放比例,它可能以某种方式绕错了方向。我玩过翻转lon / lats并更改分辨率变量,但是并没有带来什么好处。
第二个原因是我缺少轮廓的分辨率信息,因为人口圈子覆盖了地图,但是轮廓信息非常有限。除了提到的轮廓外,俄罗斯北部仅约有四个轮廓,出于某种原因……
如果有人可以找出我的问题并提供帮助,将不胜感激。数据集可以在这里找到:https://pastebin.com/dQrAe5BC。