Книга «Изучаем Python»



Pdf көрінісі
бет176/238
Дата07.01.2022
өлшемі7,86 Mb.
#18670
түріКнига
1   ...   172   173   174   175   176   177   178   179   ...   238
Байланысты:
2 5343781172763690906

ПРИМЕЧАНИЕ

Возможно, при установке пакетов вам придется использовать команду 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 

генерирует диаграммы с более темным фоном, чем на рисунке.)





Достарыңызбен бөлісу:
1   ...   172   173   174   175   176   177   178   179   ...   238




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет