ПРИМЕЧАНИЕ
Возможно, при установке пакетов вам придется использовать команду pip3 вместо pip . Если же эта
команда не работает, попробуйте исключить флаг --user .
Галерея Pygal
Примеры визуализаций, которые могут быть построены с использованием Pygal,
представлены в галерее диаграмм: зайдите на сайт http://www.pygal.org/, щелкните
на ссылке
Documentation
, затем щелкните на ссылке
Chart
types
. Каждый пример со-
провождается исходным кодом, так что вы сможете увидеть, как была построена
каждая из визуализаций.
Создание класса кубика
Для моделирования броска одного кубика мы будем использовать следующий
класс:
die.py
from random import randint
class Die():
"""Класс, представляющий один кубик."""
def __init__(self, num_sides=6):
"""По умолчанию используется шестигранный кубик."""
self.num_sides = num_sides
def roll(self):
""""Возвращает случайное число от 1 до числа граней."""
return randint(1, self.num_sides)
Метод
__init__()
получает один необязательный аргумент. Если при создании
экземпляра кубика аргумент с количеством сторон не передается, по умолчанию
создается шестигранный кубик. Если же аргумент присутствует, то переданное
значение используется для определения количества граней . (Кубики принято
обозначать по количеству граней: шестигранный кубик — D6, восьмигранный —
D8 и т. д.)
Моделирование бросков кубиков в Pygal 329
Метод
roll()
использует функцию
randint()
для получения случайного числа
в диапазоне от 1 до количества граней . Функция может вернуть начальное зна-
чение , конечное значение (
num_sides
) или любое целое число в этом диапазоне.
Бросок кубика
Прежде чем строить визуализацию на основе этого класса, бросим кубик D6, вы-
ведем результаты и убедимся в том, что они выглядят разумно:
die_visual.py
from die import Die
# Создание кубика D6.
die = Die()
# Моделирование серии бросков с сохранением результатов в списке.
results = []
for roll_num in range(100):
result = die.roll()
results.append(result)
print(results)
В точке создается экземпляр
Die
с шестью гранями по умолчанию. В точке
моделируются 100 бросков кубика, а результат каждого броска сохраняется в спи-
ске
results
. Выборка выглядит примерно так:
[4, 6, 5, 6, 1, 5, 6, 3, 5, 3, 5, 3, 2, 2, 1, 3, 1, 5, 3, 6, 3, 6, 5, 4,
1, 1, 4, 2, 3, 6, 4, 2, 6, 4, 1, 3, 2, 5, 6, 3, 6, 2, 1, 1, 3, 4, 1, 4,
3, 5, 1, 4, 5, 5, 2, 3, 3, 1, 2, 3, 5, 6, 2, 5, 6, 1, 3, 2, 1, 1, 1, 6,
5, 5, 2, 2, 6, 4, 1, 4, 5, 1, 1, 1, 4, 5, 3, 3, 1, 3, 5, 4, 5, 6, 5, 4,
1, 5, 1, 2]
Беглое знакомство с результатами показывает, что класс
Die
работает. В результа-
тах встречаются граничные значения 1 и 6, то есть модель возвращает наименьшее
и наибольшее возможное значение; значения 0 и 7 не встречаются, а значит, все
результаты лежат в диапазоне допустимых значений. Также в выборке встречаются
все числа от 1 до 6, то есть представлены все возможные результаты.
Анализ результатов
Чтобы проанализировать результаты бросков одного кубика D6, мы подсчитаем,
сколько раз выпадало каждое число:
die_visual.py
...
# Моделирование серии бросков с сохранением результатов в списке.
results = []
for roll_num in range(1000):
result = die.roll()
results.append(result)
330 Глава 15 • Генерирование данных
# Анализ результатов.
frequencies = []
for value in range(1, die.num_sides+1):
frequency = results.count(value)
frequencies.append(frequency)
print(frequencies)
Так как Pygal используется для анализа, а не для вывода результатов, количество
моделируемых бросков можно увеличить до 1000 . Для анализа создается пустой
список
frequencies
, в котором хранится количество выпадений каждого значения.
Программа перебирает возможные значения (от 1 до 6 в данном случае) в цикле ,
подсчитывает количество вхождений каждого числа в результатах , после чего
присоединяет полученное значение к списку
frequencies
. Содержимое списка
выводится перед построением визуализации:
[155, 167, 168, 170, 159, 181]
Результаты выглядят разумно: мы видим все шесть частот, по одной для каждого
возможного результата при броске D6, и ни одна из частот не выделяется на общем
фоне. А теперь займемся наглядным представлением результатов.
Построение гистограммы
Имея список частот, можно построить гистограмму результатов. Гистограмма пред-
ставляет собой столбцовую диаграмму, наглядно отображающую относительные
частоты результатов. Код построения гистограммы выглядит так:
die_visual.py
import pygal
...
# Анализ результатов.
frequencies = []
for value in range(1, die.num_sides+1):
frequency = results.count(value)
frequencies.append(frequency)
# Визуализация результатов.
hist = pygal.Bar()
hist.title = "Results of rolling one D6 1000 times."
hist.x_labels = ['1', '2', '3', '4', '5', '6']
hist.x_title = "Result"
hist.y_title = "Frequency of Result"
hist.add('D6', frequencies)
hist.render_to_file('die_visual.svg')
Чтобы построить столбцовую диаграмму, мы создаем экземпляр
pygal.Bar()
, ко-
торый сохраняется в переменной
hist
. Затем мы задаем атрибут
title
объекта
Моделирование бросков кубиков в Pygal 331
hist
(обычная строка, используемая как заголовок гистограммы), используем воз-
можные результаты броска D6 как метки оси x , а также добавляем надпись для
каждой из осей. Метод
add()
используется для добавления на гистограмму серии
значений (при этом ему передается метка для добавляемого набора и список
значений, отображаемых на диаграмме). Наконец, диаграмма записывается в файл
SVG, что предполагает имя файла с расширением
.svg
.
Полученную диаграмму проще всего просмотреть в браузере. Откройте новую
вкладку в любом браузере, а в ней откройте файл
die_visual .svg
(из папки, в которой
был сохранен файл
die_visual .py
). Диаграмма должна выглядеть примерно так, как
на рис. 15.11. (Мы слегка изменили изображение для печати; по умолчанию Pygal
генерирует диаграммы с более темным фоном, чем на рисунке.)
Достарыңызбен бөлісу: |