Использование библиотеки Matplotlib. Как использовать эффект рисования от руки | jenyay.net

Использование библиотеки Matplotlib. Как использовать эффект рисования от руки

В Matplotlib есть возможность применения эффекта рисования от руки, чтобы графики выглядели в стиле комиксов с сайта xkcd.com. Такая возможность может быть полезна, если вы хотите придать вашим графикам некоторую несерьезность, например, на презентациях.

Чтобы включить этот эффект достаточно вызвать функцию matplotlib.pytplot.xkcd(), что показано на следующем примере.

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

import numpy as np


if __name__ == '__main__':
    x = np.arange(0, 10, 0.05)
    y = 2 * x + 1

    # !!! Включить оформление в стиле xkcd.com
    plt.xkcd()

    plt.plot (x, y)
    plt.show()

В результате график будет выглядеть следующим образом.

Симпатично, правда?

Такой эффект применим не только к обычным графика вида y = f(x), но и к остальным типам графиков, в том числе и к трехмерным графикам. Следующий пример показывает, как выглядят круговая диаграмма и гистограмма после вызова функции xkcd().

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

import numpy as np


if __name__ == '__main__':
    plt.xkcd()

    # Первый график
    plt.subplot(2, 2, 1)

    x1 = np.arange(0, 10, 0.05)
    y1 = 2 * x1 + 1
    plt.plot(x1, y1)

    # Второй график
    plt.subplot(2, 2, 2)
    # Данные для построения графика
    data = [20.0, 10.0, 5.0, 1.0, 0.5]

    # Нарисовать круговой график
    plt.pie(data)

    # Нарисовать третий график
    plt.subplot(2, 1, 2)
    xbar = [1, 2, 3, 4, 5]
    hbar = [10.0, 15.0, 5.0, 1.0, 5.5]
    plt.bar(xbar, hbar)

    plt.show()

После выполнения этого скрипта появится следующее окно:

Как видите, однажды вызвав функцию xkcd(), эффект начинает применяться ко всем последующим графикам. Но если вы хотите применить этот эффект только к одному графику, то можно воспользоваться оператором with. Дело в том, что функция xkcd() возвращает объект, у которого есть метод __exit__(), вызываемый при выходе из оператора with.

Далее показано, как нужно изменить предыдущий пример, чтобы эффект xkcd применялся только к круговой диаграмме.


Результат выглядит следующим образом:

%center% Attach:xkcd_03.png

До сих пор мы использовали функцию ''xkcd()'' без параметров, точнее с параметрами по умолчанию. Но у этой функции есть три необязательных параметра, которые позволяют настроить искажения, имитирующие дрожание руки. Все три параметра являются дробными числами. Объявление функции выглядит следующим образом:

''matplotlib.pyplot.xkcd(scale=1, length=100, randomness=2)''

Здесь:

* ''scale'' задает размах дрожания "руки" при рисовании.

* ''length'' задает период дрожания руки. Чем меньше это число, тем больше периодов колебания будет на графике.

* ''randomness'' задает величину случайного шума, количество резких дрожаний.

Рассмотрим действие этих параметров на примерах. Сначала посмотрим, как влияют первые два параметра ''scale'' и ''length''.

(:source lang="python":)
# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

import numpy as np


if __name__ == '__main__':
    x1 = np.arange(0, 10, 0.05)
    y1 = 2 * x1 + 1

    plt.figure(figsize=(9, 8))
    # Первый график
    with plt.xkcd(scale=1, length=100):
        plt.subplot(2, 2, 1)
        plt.plot(x1, y1)
        plt.text(2, 17.5, 'scale=1, length=100\n(default)')


    # Второй график
    with plt.xkcd(scale=1, length=50):
        plt.subplot(2, 2, 2)
        plt.plot(x1, y1)
        plt.text(2, 20, 'scale=1, length=50')


    # Третий график
    with plt.xkcd(scale=2, length=100):
        plt.subplot(2, 2, 3)
        plt.plot(x1, y1)
        plt.text(2, 20, 'scale=2, length=100')


    # Четвертый график
    with plt.xkcd(scale=2, length=50):
        plt.subplot(2, 2, 4)
        plt.plot(x1, y1)
        plt.text(2, 20, 'scale=2, length=50')

    plt.show()

Результат выполнения этого скрипта выглядит следующим образом:

Влияние параметра randomness демонстрирует следующий скрипт

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt

import numpy as np


if __name__ == '__main__':
    x1 = np.arange(0, 10, 0.05)
    y1 = 2 * x1 + 1

    plt.figure(figsize=(9, 8))

    # Первый график
    with plt.xkcd(scale=3, randomness=0.1):
        plt.subplot (2, 2, 1)
        plt.plot (x1, y1)
        plt.text (2, 20, 'randomness=0.1')


    # Второй график
    with plt.xkcd(scale=3, randomness=2):
        plt.subplot (2, 2, 2)
        plt.plot (x1, y1)
        plt.text (2, 20, 'randomness=2\n(default)')


    # Третий график
    with plt.xkcd(scale=3, randomness=5):
        plt.subplot (2, 2, 3)
        plt.plot (x1, y1)
        plt.text (2, 20, 'randomness=5')


    # Четвертый график
    with plt.xkcd(scale=3, randomness=10):
        plt.subplot (2, 2, 4)
        plt.plot (x1, y1)
        plt.text (2, 20, 'randomness=10')

    plt.show()

В этом примере всем функциям xkcd() был передан параметр scale=3, чтобы было более заметно влияние параметра randomness.

Честно говоря, лично мне больше нравятся параметры, установленные по умолчанию (scale=1, length=100, randomness=2).

Другие статьи про Matplotlib


Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.
5 stars

Рейтинг 5.0/5. Всего 7 голос(а, ов)



Stanpol 13.08.2013 - 17:47

аккуратные числа на осях и штрихи рядом с ними портят общую картину

Jenyay 13.08.2013 - 20:13

При желании шрифт можно установить Comic Sans.


Подписаться на комментарии
Автор:
Тема:
 Ваш комментарий
 
 
Введите код 438