Построение графиков в Python

Построение графиков в Python

Привет всем! Сегодняшний пост будет посвящен вопросу, который звучит как «Построение графиков в Python». Как всегда — у каждого поста есть некоторая предыстория, и сегодняшняя предыстория берет начало с описания истории возникновения шахмат, которую я рассказывал не так давно своему сыну.

Наверняка, многие из вас помнят, какую награду (по легенде) попросил для себя изобретатель шахмат: зерна риса. Причем — на первой клетке — одно зернышко риса, на второй — два, на третье — четыре, на четвертой клетке — уже восемь, на пятой — 16, и далее-далее-далее, пока количество зерен на 64 клетке не составит 18446744073709551616 штук, а общее количество зерен, которые нужно вручить изобретателю составит аж 36893488147419103232 штук.

Все просто — есть математика, есть Python 🙂 который без проблем помогает решить данную задачу:

  1. chessboard = 64 #Количество клеток на шахматной доске
  2. cell = 1 #Начальное значение рисинок на клетке
  3.  
  4. while cell <= chessboard: #Организуем цикл
  5.     print(cell, 'клетка:', 2** cell) #Количество рисинок в каждой клетке равно предыдущему, умноженному на два. 
  6.     cell = cell + 1 #Переходим к следующей клетке

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

  1. chessboard = 64 #Количество клеток на шахматной доске
  2. cell = 1 #Начальное количество рисинок на клетке
  3. summa_list = [] #Создаем список, в который будем забрасывать значения количества рисинок на каждой клетке
  4.  
  5. while cell <= chessboard: #Организуем цикл
  6.     print(cell, 'клетка:', 2** cell) #Количество рисинок в каждой клетке равно предыдущему, умноженному на два
  7.     summa_list.append(2** cell) #Добавляем в список значения количества рисинок в каждой клетке
  8.     cell = cell + 1 #Переходим к следующей клетке
  9.  
  10. for cell in summa_list: #Начинаем цикл, в котором будем обрабатывать каждое значение клеток 
  11.     cell = cell + cell #Считаем сумму всех зерен: значение = предыдущее значение + текущее
  12.  
  13. print('Общее количество зерен:', cell) #Выводим общую сумму необходимых зерен :)

Можно пойти на еще большее безумие, и посчитать общий вес риса, который необходим. Для этого узнаем вес одного рисового зернышка. Оказывается, есть даже мера веса под названием «Арузза Арузза«, которая базируется на весе одного рисового зернышка и составляет 0,0186 грамма. Добавляем в код вычисление веса, заодно чуть окультуриваем код:

  1. chessboard = 64 #Количество клеток на шахматной доске
  2. cell = 1  #Начальная клетка
  3. summa_list = []  #Создаем список
  4. while cell <= chessboard:  #Начинаем цикл
  5.     print(cell, 'клетка:', 2** cell, 'зернышка. Вес риса:', (2** cell) * 0.0186)  #Выводим номер клетки, количество зернышек в клетке и вес этих зерен
  6.     summa_list.append(2** cell) #Загоняем в список количество зерен в клетке
  7.     cell = cell + 1  #Переходим в следующую клетку
  8. for cell in summa_list: #Начинаем цикл
  9.     cell = cell + cell #В котором считаем общий весь зерен во всех клетках
  10. print('Общее количество зерен:', cell) #Выводим общее количество зерен
  11. print('Общий вес зерна составит:', (cell*0.0186)/1000000, 'тонн') #Выводим общий вес зерен

Итак, у нас имеется: количество и вес зерен. Давайте попробуем представить все в виде графика. Конечно же — можно использовать Excel, но … если речь идет о более-менее регулярном построении графиков, лучше все же использовать Python и библиотеку Matplotlib. Кстати, оказывается, библиотека Matplotlib была разработана нейробиологом Джоном Хантером, для которого программирование было лишь хобби 🙂

Но давайте перейдем к более подробному разбирательству работы с библиотекой.
Для начала установим ее (кстати, тут более подробно рассказывалось о том, как добавлять библиотеки в PyCharm)

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

  1. import matplotlib.pyplot as plt
  2.  
  3. chessboard = 64
  4. cell = 1
  5. summa = 0
  6. summa_list = []
  7. while cell <= chessboard:
  8.     print(cell, 'клетка:', 2** cell, 'зернышка. Вес риса:', (2** cell) * 0.0186)
  9.     print('Вес зерна в клетке', cell, 'составляет', round((2** cell)*0.0186, 2), 'грамм')
  10.     summa_list.append(2** cell)
  11.     cell = cell + 1
  12. for cell in summa_list:
  13.     cell = cell + cell
  14. print('Общее количество зерен:', cell)
  15. print('Общий вес зерна составит:', (cell*0.0186)/1000000, 'тонн')
  16.  
  17. #А теперь - график! :)
  18. plt.title('График роста количества зерна') #Заголовок графика
  19. plt.xlabel('Шахматные клетки') #Легенда оси X
  20. plt.ylabel('Количества зерна в единицах')  #Легенда оси Y
  21. plt.plot(summa_list, color='red', linestyle='solid', label='Динамика роста количества зерен') #Выводим график,
  22. # который состоит из списка summa_list, цвет графика - красный, сплошная линия, метка графика
  23. plt.legend(loc = 'upper left') #Указываем распложение легенды
  24. plt.show() #Выводим все на экран

Запускаем код, и получаем следующий график:
Построение графиков в Python

На первый взгляд кажется, что график не отображает действительности — ведь, если смотреть на текстовый вывод программы виден явный экспоненциальный рост количества зерен:
1 клетка: 2 зернышка. Вес риса: 0.0372
2 клетка: 4 зернышка. Вес риса: 0.0744
3 клетка: 8 зернышка. Вес риса: 0.1488
4 клетка: 16 зернышка. Вес риса: 0.2976
5 клетка: 32 зернышка. Вес риса: 0.5952
6 клетка: 64 зернышка. Вес риса: 1.1904
7 клетка: 128 зернышка. Вес риса: 2.3808
8 клетка: 256 зернышка. Вес риса: 4.7616
9 клетка: 512 зернышка. Вес риса: 9.5232
10 клетка: 1024 зернышка. Вес риса: 19.0464
в то же время, как визуально рост начинается после 50-й клетки. Поверьте — это лишь иллюзия. Для пробы попробуйте вывести график с первой по, например, десятую ячейки:
Построение графиков в Python-2

По этому поводу недавно была потрясающая статья, но ссылку на нее увы, я не сохранил. Впрочем — это уже совсем другая история 🙂

Спасибо за внимание! Более подробно вопроса, звучащего как «Построение графиков в Python» мы вернемся чуть позднее. Уверен, для повседневных задач вполне хватит того, что мы рассмотрели сегодня.

В случае возникновения вопросов пишите на почту, или в Telegram.