Простой словарь как граф matplotlib - PullRequest
0 голосов
/ 11 июня 2019

Я новичок и пытаюсь использовать словари и графы с Python. Я пытаюсь создать простой линейный график с названиями стран по оси x и населением по оси y. Однако я получаю сообщение об ошибке для этого кода:

#!/usr/bin/python
#
#Dictionary example
#
import sys
import matplotlib.pyplot as plt
import numpy as np

if __name__ == '__main__':

    country_names = [ 'Germany', 'Italy', 'Netherlands', 'France'] #list of countries

    capital_list =['Berlin', 'Rome', 'Amsterdam', 'Paris']#list of capitals to be mapped to countries
    population_list= ['3.5','2.1', '0.3', '2.8'] #list of population of induvidual countries, all figures in Million
    language_list=['German','Italian','Dutch','French'] #list of languages to be mapped to countries


    dictionary_list = [ {'COUNTRY': country, 'CAPITAL': capital, 'POPULATION':population, 'LANGUAGE': lang} for country, capital, population, lang in zip(country_names, capital_list, population_list, language_list)]
    #print(dictionary_list)
    x = [d['CAPITAL'] for d in dictionary_list]
    print x
    y = [d['POPULATION'] for d in dictionary_list ]
    print y

    # create plot space upon which to plot the data
    fig, ax = plt.subplots()

    # add the x-axis and the y-axis to the plot
    ax.plot(x, y);

Вот ошибка:

['Berlin', 'Rome', 'Amsterdam', 'Paris']
['3.5', '2.1', '0.3', '2.8']
Traceback (most recent call last):
  File "graph.py", line 29, in <module>
    ax.plot(x, y);
  File "/usr/lib/python2.7/dist-packages/matplotlib/__init__.py", line 1814, in inner
    return func(ax, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/matplotlib/axes/_axes.py", line 1425, in plot
    self.add_line(line)
  File "/usr/lib/python2.7/dist-packages/matplotlib/axes/_base.py", line 1708, in add_line
    self._update_line_limits(line)
  File "/usr/lib/python2.7/dist-packages/matplotlib/axes/_base.py", line 1730, in _update_line_limits
    path = line.get_path()
  File "/usr/lib/python2.7/dist-packages/matplotlib/lines.py", line 925, in get_path
    self.recache()
  File "/usr/lib/python2.7/dist-packages/matplotlib/lines.py", line 612, in recache
    x = np.asarray(xconv, np.float_)
  File "/usr/lib/python2.7/dist-packages/numpy/core/numeric.py", line 482, in asarray
    return array(a, dtype, copy=False, order=order)
ValueError: could not convert string to float: Berlin

Почему оси X и Y не могут иметь разные типы данных? Почему я должен конвертировать ось X в плавающее?

Пожалуйста, помогите.

Спасибо

1 Ответ

1 голос
/ 11 июня 2019

Кажется, вы используете python 2.7. Ваш код отлично работает для меня на python 3.6.5. Тем не менее проблему, с которой вы сталкиваетесь, можно решить путем явного преобразования population_list в список чисел до создания словаря как

population_list= map(float, ['3.5','2.1', '0.3', '2.8'])

Вышеупомянутое выражение генератора будет работать для вас, когда вы зацикливаетесь на нем. Если вы хотите увидеть фактический список, преобразуйте его обратно в список как

population_list= list(map(float, ['3.5','2.1', '0.3', '2.8']))

Кстати, я не вижу здесь необходимости в словаре. Вы можете напрямую составить списки после преобразования популяции в число с плавающей точкой.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...