Привет всем! Сегодняшний пост будет посвящен вопросу, который звучит как «Построение графиков в Python». Как всегда — у каждого поста есть некоторая предыстория, и сегодняшняя предыстория берет начало с описания истории возникновения шахмат, которую я рассказывал не так давно своему сыну.
Наверняка, многие из вас помнят, какую награду (по легенде) попросил для себя изобретатель шахмат: зерна риса. Причем — на первой клетке — одно зернышко риса, на второй — два, на третье — четыре, на четвертой клетке — уже восемь, на пятой — 16, и далее-далее-далее, пока количество зерен на 64 клетке не составит 18446744073709551616 штук, а общее количество зерен, которые нужно вручить изобретателю составит аж 36893488147419103232 штук.
Все просто — есть математика, есть Python 🙂 который без проблем помогает решить данную задачу:
chessboard = 64 #Количество клеток на шахматной доске
cell = 1 #Начальное значение рисинок на клетке
while cell <= chessboard: #Организуем цикл
print(cell, 'клетка:', 2** cell) #Количество рисинок в каждой клетке равно предыдущему, умноженному на два.
cell = cell + 1 #Переходим к следующей клетке
Кстати, данный код с легкой модификацией позволяет посчитать и общее количество рисинок, которые необходимо вручить изобретателю:
chessboard = 64 #Количество клеток на шахматной доске
cell = 1 #Начальное количество рисинок на клетке
summa_list = [] #Создаем список, в который будем забрасывать значения количества рисинок на каждой клетке
while cell <= chessboard: #Организуем цикл
print(cell, 'клетка:', 2** cell) #Количество рисинок в каждой клетке равно предыдущему, умноженному на два
summa_list.append(2** cell) #Добавляем в список значения количества рисинок в каждой клетке
cell = cell + 1 #Переходим к следующей клетке
for cell in summa_list: #Начинаем цикл, в котором будем обрабатывать каждое значение клеток
cell = cell + cell #Считаем сумму всех зерен: значение = предыдущее значение + текущее
print('Общее количество зерен:', cell) #Выводим общую сумму необходимых зерен :)
Можно пойти на еще большее безумие, и посчитать общий вес риса, который необходим. Для этого узнаем вес одного рисового зернышка. Оказывается, есть даже мера веса под названием "Арузза Арузза", которая базируется на весе одного рисового зернышка и составляет 0,0186 грамма. Добавляем в код вычисление веса, заодно чуть окультуриваем код:
chessboard = 64 #Количество клеток на шахматной доске
cell = 1 #Начальная клетка
summa_list = [] #Создаем список
while cell <= chessboard: #Начинаем цикл print(cell, 'клетка:', 2** cell, 'зернышка. Вес риса:', (2** cell) * 0.0186) #Выводим номер клетки, количество зернышек в клетке и вес этих зерен summa_list.append(2** cell) #Загоняем в список количество зерен в клетке cell = cell + 1 #Переходим в следующую клетку for cell in summa_list: #Начинаем цикл cell = cell + cell #В котором считаем общий весь зерен во всех клетках print('Общее количество зерен:', cell) #Выводим общее количество зерен print('Общий вес зерна составит:', (cell*0.0186)/1000000, 'тонн') #Выводим общий вес зерен Итак, у нас имеется: количество и вес зерен. Давайте попробуем представить все в виде графика. Конечно же - можно использовать Excel, но ... если речь идет о более-менее регулярном построении графиков, лучше все же использовать Python и библиотеку Matplotlib. Кстати, оказывается, библиотека Matplotlib была разработана нейробиологом Джоном Хантером, для которого программирование было лишь хобби 🙂 Но давайте перейдем к более подробному разбирательству работы с библиотекой. Для начала установим ее (кстати, тут более подробно рассказывалось о том, как добавлять библиотеки в PyCharm)
Давайте скорректируем наш сегодняшний код так, что бы в конце получить график количества зерен, необходимых нам для награждения изобретателя:
import matplotlib.pyplot as plt
chessboard = 64
cell = 1
summa = 0
summa_list = []
while cell <= chessboard:
print(cell, 'клетка:', 2** cell, 'зернышка. Вес риса:', (2** cell) * 0.0186)
print('Вес зерна в клетке', cell, 'составляет', round((2** cell)*0.0186, 2), 'грамм')
summa_list.append(2** cell)
cell = cell + 1
for cell in summa_list:
cell = cell + cell
print('Общее количество зерен:', cell)
print('Общий вес зерна составит:', (cell*0.0186)/1000000, 'тонн')
#А теперь - график! :)
plt.title('График роста количества зерна') #Заголовок графика
plt.xlabel('Шахматные клетки') #Легенда оси X
plt.ylabel('Количества зерна в единицах') #Легенда оси Y
plt.plot(summa_list, color='red', linestyle='solid', label='Динамика роста количества зерен') #Выводим график,
# который состоит из списка summa_list, цвет графика - красный, сплошная линия, метка графика
plt.legend(loc = 'upper left') #Указываем расположение легенды
plt.show() #Выводим все на экран
Запускаем код, и получаем следующий график:
На первый взгляд кажется, что график не отображает действительности - ведь, если смотреть на текстовый вывод программы виден явный экспоненциальный рост количества зерен:
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" мы вернемся чуть позднее. Уверен, для повседневных задач вполне хватит того, что мы рассмотрели сегодня.
И да - код доступен на Git - мало-ли что 🙂
В случае возникновения вопросов пишите на почту, или в Telegram.
Support the Blog!
Running a blog takes a lot of effort, time, and passion. Your donations help improve the content, inspire new ideas, and keep the project going.
If you’ve enjoyed the blog’s materials, any support would mean the world to me. Thank you for being here! ❤️