Получение ошибки KeyError: 'name_long' для объекта 'country' 'records' 'name = country.attributes['name_long']"

Я получил его пример, чтобы попробовать на другой странице " Сделать легенду цветовой панели в Matplotlib / Cartopy", но когда я пытаюсь запустить его в Jupyter Notebook, он выдает такие ошибки:

KeyError                                  Traceback (most recent call last)
<ipython-input-3-55c282431f2e> in <module>()
     14 ax = plt.axes(projection=ccrs.Robinson())
     15 for country in shpreader.Reader(countries_shp).records():
---> 16     name = country.attributes['name_long']
     17     num_users = countries[name]
     18     ax.add_geometries(country.geometry, ccrs.PlateCarree(),

KeyError: 'name_long'

Пожалуйста помоги! Пример кода:

import cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np

cmap = mpl.cm.Blues
# Countries is a dictionary of {"country_name": number of users}, for example
countries = {"United States": 100, "Canada": 50, "China": 10}

max_users = float(max(countries.values()))
shapename = 'admin_0_countries'
countries_shp = shpreader.natural_earth(resolution='110m', category='cultural', name=shapename)
ax = plt.axes(projection=ccrs.Robinson())
for country in shpreader.Reader(countries_shp).records():
    name = country.attributes['name_long']
    num_users = countries[name]
    ax.add_geometries(country.geometry, ccrs.PlateCarree(),
                facecolor=cmap(num_users/max_users, 1))

plt.savefig('iOS_heatmap.png', transparent=True, dpi=900)

1 ответ

Решение

Ваш словарь / карта country.attributes не имеет значения для ключа 'name_long',

Ваша страна Record как указано в документации для shapereader.

Записи имеют атрибуты, которые являются простым словарём. Какие бы данные вы ни читали, 'name_long' приписывать.

Вы, кажется, загружаете данные из NaturalEarthData Веб-сайт. Поэтому проверьте, какие атрибуты на самом деле доступны оттуда.

Согласно вашему комментарию, у вас, кажется, есть 'NAME_LONG' ключ, но... 'NAME_LONG' != 'name_long'

Другие вопросы по тегам