【问题标题】:Plotting pandas csv data onto cartopy map将 pandas csv 数据绘制到 cartopy 地图上
【发布时间】:2019-04-24 01:33:31
【问题描述】:

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') 

【问题讨论】:

  • 我的回答解决了您的问题吗?如果是这样:请接受我的回答(评级下方的箭头)。如果没有:让我知道你卡在哪里了。

标签: python pandas geography cartopy


【解决方案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

【讨论】:

  • 使用 pandas 标准化,然后通过设置 s= 将标记大小设置为与人口成正比。非常感谢您的帮助,对于延迟回复深表歉意!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多