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

Немного рекламы

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

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

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import pylab
import numpy

def func1 (x):
    return 2 * x + 1


x = numpy.arange (0, 10, 0.05)
y = func1 (x)

# !!! Включить оформление в стиле xkcd.com
pylab.xkcd()
pylab.plot (x, y)

pylab.show()

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

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

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

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import pylab
import numpy
from mpl_toolkits.mplot3d import Axes3D

def func1 (x):
    return 2 * x + 1


pylab.xkcd()

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

x1 = numpy.arange (0, 10, 0.05)
y1 = func1 (x1)
pylab.plot (x1, y1)


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

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


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

pylab.show()

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

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

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

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import pylab
import numpy
from mpl_toolkits.mplot3d import Axes3D

def func1 (x):
    return 2 * x + 1


# Первый график
with pylab.xkcd():
    pylab.subplot (2, 2, 1)

    x1 = numpy.arange (0, 10, 0.05)
    y1 = func1 (x1)
    pylab.plot (x1, y1)


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

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


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

pylab.show()

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

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

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

Здесь:

  • scale задает размах дрожания "руки" при рисовании.
  • length задает период дрожания руки. Чем меньше это число, тем больше периодов колебания будет на графике.
  • randomness задает величину случайного шума, количество резких дрожаний.

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

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import pylab
import numpy
from mpl_toolkits.mplot3d import Axes3D

def func1 (x):
    return 2 * x + 1


x1 = numpy.arange (0, 10, 0.05)
y1 = func1 (x1)

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


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


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


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

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

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

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import pylab
import numpy
from mpl_toolkits.mplot3d import Axes3D

def func1 (x):
    return 2 * x + 1


x1 = numpy.arange (0, 10, 0.05)
y1 = func1 (x1)

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


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


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


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

pylab.show()

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

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

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


Немного рекламы

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

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



Stanpol 13.08.2013 - 17:47

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

Jenyay 13.08.2013 - 20:13

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


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