Нанесение данных CSV-панд на картографическую карту - PullRequest
0 голосов
/ 21 ноября 2018

плохо знакомы с 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 голосов
/ 21 ноября 2018

Matplotlib.pyplot.scatter принимает параметр "s" для скаляра или массив для размера маркера в точках (https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html).

Предполагая, что "совокупность" содержит годовую численность, которую вы быВы хотите привести его к типу массива: population_array = np.array(population) и нормализовать его, чтобы получить значение в точках, которое имеет смысл. Хорошей отправной точкой для этого может быть стандартизация его значений от 0 до 1, а затем умножение его наподходящий скаляр. Руководство по нормализации данных здесь: https://stackoverflow.com/a/41532180/8766814.

...