«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Использование Plotly для интерактивной визуализации данных о бросках игральных костей

Использование Plotly для интерактивной визуализации данных о бросках игральных костей

Опубликовано 1 августа 2024 г.
Просматривать:266

В этом уроке мы научимся использовать Plotly для создания интерактивных визуализаций. Наш проект посвящен анализу результатов броска игральных костей. При броске шестигранного кубика с равными шансами выпадет любое число от 1 до 6. Однако, когда вы бросаете несколько кубиков, некоторые числа становятся более вероятными, чем другие. Наша цель — определить эти вероятности путем моделирования бросков игральных костей и создания набора данных. После этого мы визуально представим результаты нескольких бросков, чтобы показать, какие результаты статистически более вероятны.

Что такое Плотли?

Plotly — это графическая библиотека с открытым исходным кодом, которая позволяет пользователям создавать интерактивные веб-визуализации. Он поддерживает множество типов диаграмм, включая линейные графики, точечные диаграммы, гистограммы и многое другое. Plotly особенно полезен для создания визуализаций, которые можно встроить в веб-приложения, поскольку он предлагает интерактивные функции, такие как масштабирование, панорамирование и наведение информации.

Установка Плотли

Мы установим Plotly с помощью pip. Нам также необходимо установить pandas — библиотеку для эффективной работы с данными, поскольку от нее зависит Plotly Express.

$ python -m pip install --user plotly
$ python -m pip install --user pandas

Посетите галерею типов диаграмм на веб-сайте Plotly, чтобы увидеть различные визуализации, которые можно создать с помощью Plotly.

Создание класса Die

Сначала мы создадим следующий класс Die для имитации броска игральной кости. Мы назовем файл Die.py.

from random import randint

class Die:
    """A class representing a single die."""

    def __init__(self, num_sides = 6):
        """Assume a six-sided die"""
        self.num_sides = num_sides


    def roll(self):
        """Return a random value between 1 and number of sides."""
        return randint(1, self.num_sides)

Метод __ init __ принимает один необязательный аргумент. При создании экземпляра Die количество сторон будет шесть, если не указан аргумент. Если указан аргумент, он установит количество сторон кубика.

Методroll() использует функцию randint() для возврата случайного числа от 1 до количества сторон. Эта функция может возвращать начальное значение (1), конечное значение (num_sides) или любое целое число между ними. Игральные кости называются в зависимости от количества сторон: шестигранная игральная кость называется D6, десятигранная игральная кость называется D10 и так далее.

Бросание кубика

Сначала мы импортируем модуль Plotly Express, используя псевдоним px, чтобы избежать повторного вводаplotly.express. Мы создадим экземпляр кубика для имитации броска двух кубиков D8. Мы назовем этот файл dice_visual.py.

import plotly.express as px

from die import Die

# Create two D8.
die_1 = Die(8)
die_2 = Die(8)

# Make some rolls, and store results in a list.
results = []
for roll_num in range(500_000):
    result = die_1.roll()   die_2.roll()
    results.append(result)

Анализ результатов

Наименьший возможный результат — это сумма наименьших чисел на каждом кубике (2). Максимально возможный результат — это сумма наибольшего числа на каждом кубике (16), присвоенного max_results. Переменная max_result улучшает читаемость кода генерации poss_results. Мы могли бы написать range (2,16), но это сработает только для двух кубиков D8. При моделировании реальных обстоятельств лучше всего разрабатывать код, который может легко обрабатывать широкий спектр сценариев.

# Analyze the result.
frequencies = []
max_results = die_1.num_sides   die_2.num_sides
poss_results = range(2, max_results   1)
for value in poss_results:
    frequency = results.count(value)
    frequencies.append(frequency)

Визуализация результатов.

Мы определили заголовок и присвоили его «title». Мы создали словарь для указания меток осей. Ключи словаря представляют метки, которые мы хотим настроить, а значения представляют пользовательские метки, которые мы хотим использовать. Мы называем ось X «Результат», а ось Y — «Частота результата». Чтобы построить гистограмму, мы используем функцию px.bar() и передаем необязательные переменные «title» и «labels».

# Visualize the results.
title = "Results of Rolling Two D8 Dice 500,000 Times"
labels = {'x': 'Result', 'y': 'Frequency of Result'}
fig = px.bar(x = poss_results, y = frequencies, title = title,
 labels = labels)
fig.show()

График создается с соответствующим заголовком и метками для каждой оси, как показано на рисунке ниже.

Image description

Дальнейшие настройки

Есть одна проблема, которую нам нужно решить с помощью только что созданного сюжета. Поскольку имеется 11 столбцов, настройки макета оси X по умолчанию оставляют некоторые столбцы без меток. Хотя настройки по умолчанию подходят для большинства визуализаций, эта диаграмма выглядела бы лучше, если бы все столбцы были помечены.

Plotly предлагает метод update_layout(), который позволяет вносить различные изменения в фигуру после ее создания. Вот как вы можете указать Plotly присвоить каждому столбцу собственную метку.

# Further customize chart.
fig.update_layout(xaxis_dtick = 1)
fig.show()
#fig.write_html('dice_visual_d6d10.xhtml')

Метод update_layout() применяется к объекту fig, который представляет всю диаграмму. Мы используем опцию xaxis_dtick, чтобы установить расстояние между делениями на оси X. Мы устанавливаем интервал равным 1, чтобы каждый столбец был помечен. Когда вы снова запустите dice_visual.py, вы должны увидеть метки на каждой полосе.

Image description

Этот код можно легко настроить для имитации броска игральных костей разного размера. Чтобы создать D6 и D10, передайте аргументы 6 и 10 при создании двух экземпляров кубика. Измените первый цикл на желаемое количество рулонов и соответствующим образом измените заголовок графика.

Мы можем заставить нашу программу автоматически сохранять диаграмму в виде HTML-файла, заменив вызов fig.show() вызовом fig.write_html().

Метод write_html() требует один аргумент: имя файла, в который производится запись. Если вы укажете только имя файла, файл будет сохранен в том же каталоге, что и файл .py. Вы также можете вызвать write_html() с объектом Path, чтобы сохранить выходной файл в любом месте вашей системы.

Вот полный код:

import plotly.express as px

from die import Die

# Create two D8.
die_1 = Die(8)
die_2 = Die(8)

# Make some rolls, and store results in a list.
results = []
for roll_num in range(500_000):
    result = die_1.roll()   die_2.roll()
    results.append(result)

# Analyze the result.
frequencies = []
max_results = die_1.num_sides   die_2.num_sides
poss_results = range(2, max_results   1)
for value in poss_results:
    frequency = results.count(value)
    frequencies.append(frequency)

# Visualize the results.
title = "Results of Rolling Two D8 Dice 500,000 Times"
labels = {'x': 'Result', 'y': 'Frequency of Result'}
fig = px.bar(x = poss_results, y = frequencies, title = title, labels = labels)

# Further customize chart.
fig.update_layout(xaxis_dtick = 1)
fig.write_html('dice_visual.xhtml')

Рефакторинг

Для ясности в листингах в этом разделе используется длинная форма циклов for. Мы можем провести рефакторинг кода, используя понимание списков для одного или обоих циклов. Вот код, использующий понимание списка:

import plotly.express as px

from die import Die

# Create two D8.
die_1 = Die(8)
die_2 = Die(8)

# Make some rolls, and store results in a list.
results = [die_1.roll()   die_2.roll() for roll_num in range(500_000) ]

# Analyze the result.
max_results = die_1.num_sides   die_2.num_sides
poss_results = range(2, max_results   1)
frequencies = [results.count(value) for value in poss_results]

# Visualize the results.
title = "Results of Rolling Two D8 Dice 500,000 Times"
labels = {'x': 'Result', 'y': 'Frequency of Result'}
fig = px.bar(x = poss_results, y = frequencies, title = title, labels = labels)

# Further customize chart.
fig.update_layout(xaxis_dtick = 1)

fig.write_html('dice_visual_list_comprehension.xhtml')

Заключение

В заключение, анализ и представление статистических данных становится мощным и привлекательным с помощью Plotly для интерактивной визуализации данных о бросках игральных костей. Моделируя броски игральных костей и визуализируя результаты, мы можем лучше понять вероятности различных результатов. Интерактивные функции Plotly, такие как наведение информации, панорамирование и масштабирование, улучшают взаимодействие с пользователем и делают данные более доступными. Кроме того, возможность настраивать и сохранять визуализации в виде файлов HTML позволяет легко делиться ими и интегрировать их в веб-приложения. В этой статье показано, как использовать возможности Plotly для создания информативных и привлекательных диаграмм. Plotly — отличный инструмент для анализа и представления данных.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/terrancoder/using-plotly-for-interactive-dice-roll-data-visualization-48f6?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить это
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3