342
Глава 15 • Генерирование данных
Рис. 15.12.
Простая гистограмма, созданная с использованием Plotly
Обратите внимание на интерактивность диаграмм, построенных с использованием
Plotly: если навести указатель мыши на столбец диаграммы, вы увидите данные,
связанные с этим столбцом. Данная возможность особенно полезна при нанесе-
нии нескольких наборов данных на одну диаграмму. Также обратите внимание на
кнопки в правом верхнем углу: они позволяют изменить масштаб визуализации
и сохранить ее в графическом файле.
Бросок двух кубиков
При броске двух кубиков вы получаете большие значения с другим распределением
результатов. Изменим наш код и создадим два кубика D6, моделирующих бросок
пары кубиков. При броске каждой пары программа складывает два числа (по одно-
му с каждого кубика) и сохраняет сумму в
results
. Сохраните копию
die_visual .py
под именем
dice_visual .py
и внесите следующие изменения:
dice_visual.py
from plotly.graph_objs import Bar, Layout
from plotly import offline
from die import Die
# Создание двух кубиков D6.
die_1 = Die()
die_2 = Die()
# Моделирование серии бросков с сохранением результатов в списке.
results = []
for roll_num in range(1000):
Моделирование бросков кубиков в Plotly
343
❶
result = die_1.roll() + die_2.roll()
results.append(result)
# Анализ результатов.
frequencies = []
❷
max_result = die_1.num_sides + die_2.num_sides
❸
for value in range(2, max_result+1):
frequency = results.count(value)
frequencies.append(frequency)
# Визуализация результатов.
x_values = list(range(2, max_result+1))
data = [Bar(x=x_values, y=frequencies)]
❹
x_axis_config = {'title': 'Result', 'dtick': 1}
y_axis_config = {'title': 'Frequency of Result'}
my_layout = Layout(title='Results of rolling two D6 dice 1000 times',
xaxis=x_axis_config, yaxis=y_axis_config)
offline.plot({'data': data, 'layout': my_layout}, filename='d6_d6.html')
Создав два экземпляра
Die
, мы бросаем кубики и вычисляем сумму для каждого
броска
. Самый большой возможный результат (12) вычисляется суммировани-
ем наибольших результатов на обоих кубиках; мы сохраняем его в
max_result
.
Наименьший возможный результат (2) равен сумме наименьших результатов на
обоих кубиках. В процессе анализа подсчитывается количество результатов для
каждого значения от 2 до
max_result
. (Также можно было использовать диапазон
range(2,
13)
, но он работал бы только для двух кубиков D6. При моделировании
реальных ситуаций лучше писать код, который легко адаптируется для разных
ситуаций. В частности, этот код позволяет смоделировать бросок пары кубиков
с
любым
количеством граней.)
При создании диаграммы мы включаем ключ
dtick
в словарь
x_axis_config
.
Этот параметр управляет расстоянием между делениями на оси x. С появлением
дополнительных столбцов на гистограмме в конфигурации по умолчанию Plotly
будет снабжать метками только часть столбцов. Параметр
'dtick':
1
приказывает
Plotly помечать все деления. Также мы обновляем заголовок диаграммы и изме-
няем имя выходного файла.
После выполнения кода в браузере должна появиться диаграмма, примерный вид
которой показан на рис. 15.13.
На диаграмме показаны примерные результаты, которые могут быть получены
для пары кубиков D6. Как видите, реже всего выпадают результаты 2 и 12, а чаще
всего 7, потому что эта комбинация может быть выброшена шестью способами,
а именно: 1+6, 2+5, 3+4, 4+3, 5+2 и 6+1.
Броски кубиков с разным числом граней
Создадим кубики с 6 и 10 гранями и посмотрим, что произойдет, если бросить их
50 000 раз:
|