将熊猫Csv数据绘制到Cartopy地图上

时间:2018-11-21 13:09:31

标签: python pandas geography cartopy

是python的新手,通常进行编码,因此请原谅任何明显的错误。我在将城市人口数据(每个国家的城市人口数以千计)绘制到地图上时遇到了一些麻烦。人口数据存储在CSV文件中,该文件按国家,纬度,经度和年份(从1950年至2050年的年份)建立索引。我使用def编写了一个函数,因此我可以输入年份并获得按国家/地区划分的该年份的图表。我希望标记的大小与每个国家的人口成正比。但是,似乎绘制的标记大小与该国家/地区在列表中的位置成比例,因此列表顶部(按字母顺序排列)的国家/地区的标记较小,例如,巴西的标记较小,城市的标记较大人口。任何帮助将不胜感激。代码如下:

import pandas as pd
from matplotlib.animation import FuncAnimation
import cartopy.crs as ccrs
import cartopy.feature as cfeature

country_urban_pop = pd.read_csv('/Users/myusername/Desktop/urbanisation_data.csv')

def urban_pop_plot(year):
    lat, lon = country_urban_pop['latitude'], country_urban_pop['longitude']
    population = country_urban_pop[year]
    fig = plt.figure(figsize=(20, 16))
    ax = plt.axes(projection=ccrs.PlateCarree())
    ax.add_feature(cfeature.LAND)
    ax.add_feature(cfeature.OCEAN)
    ax.add_feature(cfeature.COASTLINE)
    ax.add_feature(cfeature.BORDERS, linestyle=':')
    ax.add_feature(cfeature.LAKES, alpha=0.5)
    ax.add_feature(cfeature.RIVERS)
    ax.coastlines()
    ax.set_global()
    ax.gridlines()
    ax.stock_img()
    plt.scatter(lon, lat, transform=ccrs.PlateCarree(), \
        label=None, c=population, cmap='Oranges', linewidth=0, alpha=0.5)
    plt.axis(aspect='equal')
    plt.xlabel('longitude')
    plt.ylabel('latitude')
    plt.colorbar(label='population')
    plt.clim(0, 10)

urban_pop_plot('1950') 

1 个答案:

答案 0 :(得分:1)

Matplotlib.pyplot.scatter接受标量的参数“ s”或标记点(https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html)中标记大小的数组。

假设“人口”包含年人口,则希望将其强制转换为numpy数组:population_array = np.array(population)并对其进行归一化,以便获得有意义的点值。一个好的起点可能是将其标准化为0到1之间的值,然后将其乘以合适的标量。此处的数据规范化指南:https://stackoverflow.com/a/41532180/8766814