Порог легенды фолиума выдает ошибку при изменении значений, серый цвет - PullRequest
0 голосов
/ 16 апреля 2020

Я использую пакет Folium для построения карты "Choropleth" с python. Отображаемые данные взяты из API, который отслеживает самые последние показатели заражения Covid-19 в каждой стране. Столбец, совместно используемый файлом стран.geo json (файл json карты мира) и данными, которые я извлек, является названием страны. Большинство стран закрашены цветом (успешно), в то время как некоторые страны не идентичны и поэтому закрашены серым, например, "США" в кадре данных pandas и "Соединенные Штаты Америки" в .geo Файл json не совпадает и поэтому не отображает их данные на карте.

covid_data = requests.get('https://covid2019-api.herokuapp.com/v2/current')
covid_data = covid_data.json()
covid_data = pd.DataFrame.from_dict(covid_data['data'])
location  confirmed  deaths  recovered  active
US     636350   28326      52096  555928
Spain     177644   18708      70853   88083

Я храню данные API в пределах pandas DataFrame, потому что он лучше всего работает с Folium. Мой хакерский способ преобразования данных из названий стран, которые не идентичны, с помощью кода: covid_data.location[covid_data.location=='US'] = 'United States of America'

. Таким образом, название страны теперь одинаково как для файла .geo json, так и для файла. DataFrame

location  confirmed  deaths  recovered  active
United States of America     636350   28326      52096  555928
Spain     177644   18708      70853   88083

теперь совпадает с

{ "type": "Feature", "properties": { "ADMIN": "United States of America", "ISO_A3": "USA"} "geometry": {}}     (countries.geojson)

Перед редактированием кадра данных карта отображалась, но при изменении US на Соединенные Штаты Америки выдается ошибка

return color_range [color_idx], fill_opacity IndexError: список индексов выходит за пределы диапазона

Таким образом, это означает, что я установил Choropleth threshold_scale равным 636 360 (что является самым высоким # в «Подтверждено»), но нет данных, соответствующих этому #. Поэтому, если я изменю значение threshold_scale на следующее наибольшее число, 177 644 (то есть в Италии), я получу ошибку

ValueError: Ожидается, что все значения попадут в один из предоставленных интервалов (или будут Nan). Пожалуйста, проверьте> параметр bins и / или ваши данные.

Вот остальная часть кода, чтобы помочь решить эту проблему,

#this variable is to get the highest value of the rates as the max threshold used for coloring
covid_data_max = covid_data['confirmed'].max()
covid_data_max = covid_data_max.item()
world_geo = r'countries.geojson'
world_map = folium.Map(location=[4.68, 8.33],
                    tiles='Mapbox Bright', zoom_start=3)
world_map = folium.Choropleth(
    geo_data=world_geo,
    name='choropleth',
    data=covid_data,
    columns=['location','confirmed'],
    key_on='properties.ADMIN',
    threshold_scale = [0,int((covid_data_max/15)),int((covid_data_max/10)),int((covid_data_max/4)),covid_data_max],
    fill_color='BuPu',
    fill_opacity=0.7,
    line_opacity=0.2,
    legend_name='Number of deaths per country',
    highlight=True,
    line_color='black'
    ).add_to(world_map)

folium.LayerControl().add_to(world_map)
world_map.save(r'./templates/map.html')

Вы можете увидеть изображение карта (по какой-то причине пороговое значение включает номера США):

enter image description here

Дайте мне знать, если есть что-нибудь еще, что я могу предоставить!

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Как подсказывает ошибка:

IndexError: список индексов вне диапазона

проблема в:

threshold_scale = [0,int((covid_data_max/15)),int((covid_data_max/10)),int((covid_data_max/4)),covid_data_max],

Вы можете просто добавьте 1 к covid_data_max:

threshold_scale = [0,int((covid_data_max/15)),int((covid_data_max/10)),int((covid_data_max/4)),covid_data_max+1],

, и вы получите свою карту:

enter image description here

Обратите внимание, что threshold_scale параметр больше не поддерживается в пользу параметра bins.

0 голосов
/ 18 апреля 2020

Таким образом, я смог отобразить цвет, отредактировав файл json, прежде чем он был преобразован в кадр pandas. Я все еще хотел бы объяснить, почему редактирование pandasFrame напрямую не работает. Возможно, это как-то связано с ошибкой

Значение пытается быть установлено для копии среза из DataFrame

Поэтому я кодировал для l oop, которая редактирует указанную c страну и изменяет ее на "Соединенные Штаты Америки", чтобы соответствовать записи .geo json для "Соединенные Штаты Америки"

for data, values in covid_data.items():
    if data == 'data':
        for country in values:
            if country['location'] == 'US':
                country['location']='United States of America'
...