Нанесение данных pandas csv на картографическую карту

новичок в 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') 

person jamie1234    schedule 21.11.2018    source источник
comment
Решил ли мой ответ вашу проблему? Если да: пожалуйста, примите мой ответ (стрелка под рейтингом). Если нет: дайте мне знать, где вы застряли.   -  person Lennart Thamm    schedule 25.11.2018


Ответы (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.

person Lennart Thamm    schedule 21.11.2018
comment
стандартизированы с использованием панд, а затем установите размер маркера пропорционально численности населения, установив s =. Большое спасибо за вашу помощь и извините за задержку с ответом! - person jamie1234; 27.11.2018