Matplotlib — библиотека на языке программирования Python для визуализации данных. Поддерживается 2D и 3D графика

Основные виды графиков

  • Графики (line plot)
  • Диаграммы разброса (scatter plot)
  • Столбчатые диаграммы (bar chart) и гистограммы (histogram)
  • Круговые диаграммы (pie chart)
  • Ствол-лист диаграммы (stem plot)
  • Контурные графики (contour plot)
  • Поля градиентов (quiver)
  • Спектральные диаграммы (spectrogram
In [1]:
import matplotlib as mpl

# Вывод на экран текущей версии библиотеки matplotlib
print ('Current version on matplotlib library is', mpl.__version__)
Current version on matplotlib library is 2.1.2

Модуль pyplot

позволяет пользователю сосредоточиться на выборе готовых решений и настройке базовых параметров рисунка.

In [2]:
import matplotlib.pyplot as plt

1. Графики

Самым главным объектом в matplotlib является рисунок Figure (метод plt.figure()). Создать рисунок в matplotlib означает задать форму, размеры и свойства основы-холста (canvas), на котором будет создаваться будущий график.

Для вывода созданных рисунков на экран можно вызвать метод plt.show(). Будут показаны все рисунки (figures), которые были созданы.

In [3]:
# Нарисуем точку 

fig = plt.figure()   # Создание объекта Figure
plt.scatter(1.0, 1.0)   # scatter - метод для нанесения маркера в точке (1.0, 1.0)
plt.show()

После вызова любой графической команды, то есть функции, которая создаёт какой-либо графический объект, например, plt.scatter() или plt.plot(), всегда существует хотя бы одна область для рисования (по умолчанию прямоугольной формы).

Контейнеры рисунка (Figure containers) - Figure - это контейнер самого высокого уровня. На нём располагаются все другие контейнеры и графические примитивы.

In [4]:
fig = plt.figure()   # Создание объекта Figure
print (fig.axes)   # Список текущих областей рисования пуст
print (type(fig))   # тип объекта Figure
plt.scatter(1.0, 1.0)   # scatter - метод для нанесения маркера в точке (1.0, 1.0)

# После нанесения графического элемента в виде маркера
# список текущих областей состоит из одной области
print (fig.axes)

plt.show()
[]
<class 'matplotlib.figure.Figure'>
[<matplotlib.axes._subplots.AxesSubplot object at 0x00000254CC334B70>]

Контейнеры областей рисования (Axes containers)

Axes - очень важный контейнер, так как именно с ним чаще всего работает пользователь. Экземпляры Axes - это области, располагающиеся в контейнере Figure, для которых можно задавать координатную систему (декартовая или полярная). На нём располагаются все другие контейнеры, кроме Figure, и графические примитивы. Это области на рисунке, на которых располагаются графики и диаграммы, в которые вставляются изображения и т.д. Мультиоконные рисунки состоят из набора областей Axes.

In [5]:
# Области разного типа

fig = plt.figure()
# Добавление на рисунок прямоугольной (по умолчанию) области рисования
ax = fig.add_axes([0, 0, 1, 1])
print (type(ax))
plt.scatter(1.0, 1.0)

fig = plt.figure()
# Добавление на рисунок круговой области рисования
ax = fig.add_axes([0, 0, 1, 1], polar=True)
plt.scatter(0.0, 0.5)

plt.show()
<class 'matplotlib.axes._axes.Axes'>
In [6]:
# Простой график функции
import numpy as np

x = np.linspace(0, 5, 10) # 10 чисел от 0 до 5
y = x ** 2
plt.figure()
plt.plot(x, y, 'r')
plt.xlabel('x')
plt.ylabel('y')
plt.title('title')
plt.show()
In [7]:
# Надписи + Latex

fig, ax = plt.subplots()

ax.plot(x, x**2, label=r"$y = \alpha^2$")
ax.plot(x, x**3, label=r"$y = \alpha^3$")
ax.set_xlabel(r'$\alpha$', fontsize=18)
ax.set_ylabel(r'$y$', fontsize=18)
ax.set_title('plot')
ax.legend(loc=2); # 2 - положение легенды на графике
In [8]:
xs = np.linspace(0, 1, 20); 
ys = np.sin(xs)

fig = plt.figure()
axes = fig.add_subplot(1,1,1)
axes.plot(xs, ys)

# This should be called after all axes have been added
fig.tight_layout()
#fig.savefig('test.png')
In [9]:
# Несколько графиков
#  plt.subplots - это функция, которая возвращает кортеж, содержащий объект фигуры и осей
fig, axes = plt.subplots(nrows=1, ncols=2)

for ax in axes:
    ax.plot(x, y, 'r')
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    ax.set_title('title')
    
fig.tight_layout()
In [10]:
# График для объектов Series и DataFrame модуля pandas
import pandas as pd

ts = pd.Series(np.random.randn(100), index=pd.date_range('1/1/2018', periods=100))
ts = ts.cumsum()
ts.plot()
plt.show()
In [11]:
# стиль линий и легенда

plt.figure() 
ts.plot(style='k--', label='Series')

plt.legend()
plt.show()
In [12]:
# Для данных из DataFrame 

df = pd.DataFrame(np.random.randn(10,4), columns=['A','B','C','D'])
#df = pd.DataFrame(np.random.randn(100, 4), index=ts.index, columns=list('ABCD'))
#df = df.cumsum();

plt.figure()

df.plot()
plt.legend(loc='best')
plt.show()
<matplotlib.figure.Figure at 0x254cef61390>
In [13]:
# Отключить легенду

df.plot(legend=False);
In [14]:
# График плотности распределения

ser = pd.Series(np.random.randn(1000))
ser.plot(kind='kde')   # kde = Kernel Density Estimation plot = density
# поменяйте kde на hist
#ser.plot?
Out[14]:
<matplotlib.axes._subplots.AxesSubplot at 0x254cc9184a8>

2. Гистограммы

In [15]:
# метод pandas.DataFrame.hist вызывает метод matplotlib.pyplot.hist 

ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2018', periods=1000))
df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list('ABCD'))

plt.figure();
df['B'].hist()
#df[['B']]
Out[15]:
<matplotlib.axes._subplots.AxesSubplot at 0x254ceb2edd8>
In [16]:
df['B'].plot(kind='hist')
Out[16]:
<matplotlib.axes._subplots.AxesSubplot at 0x254cf41f978>
In [17]:
df.hist()
Out[17]:
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x00000254CF8CDBE0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x00000254CF5BF630>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x00000254CF5F9710>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x00000254CF5317F0>]],
      dtype=object)
In [18]:
df.plot(kind='hist')
Out[18]:
<matplotlib.axes._subplots.AxesSubplot at 0x254cf4e8828>
In [19]:
# число интервалов для построения гистограммы bins=10

df['B'].hist(bins=10)
Out[19]:
<matplotlib.axes._subplots.AxesSubplot at 0x254cf6ae208>
In [20]:
df['B'].hist(bins=50)
Out[20]:
<matplotlib.axes._subplots.AxesSubplot at 0x254cef75fd0>

3. Столбчатые диаграммы

In [21]:
df = pd.DataFrame(np.random.rand(10,4), columns=['A','B','C','D']) # randn -> rand

df.plot(kind='bar');
In [22]:
df = pd.DataFrame(np.random.rand(10,4), columns=['A','B','C','D']) # randn -> rand

df['A'].plot(kind='bar'); # color='b' color="#888888"
In [23]:
# Пропорциональное распределение значений, параметр stacked=True

df.plot(kind='bar', stacked=True );
In [24]:
# Горизонтально kind='barh'

df.plot(kind='barh', stacked=True);
In [25]:
titanic = pd.read_csv('titanic.csv')
#print(titanic)
In [26]:
tclass = titanic.groupby(['pclass', 'survived']).size().unstack() # unstack собирает в единый DataFrame
tclass
Out[26]:
survived 0 1
pclass
1st 123 200
2nd 158 119
3rd 528 181
In [27]:
tclass.plot(kind='bar', stacked=True );

4. Сектора (пирожковый график Pie Chart)

In [28]:
# matplotlib.pyplot.pie

t = titanic.groupby(['pclass']).size()
print(t)

plt.subplot(aspect=True)
plt.pie(t, labels=t.index.values, autopct='%i%%')
plt.title("Passenger Class on the Titanic"); # ;!!!
pclass
1st    323
2nd    277
3rd    709
dtype: int64
In [29]:
explode = (0, 0.1, 0.2)  # only "explode" the 2nd slice (i.e. 'Hogs')

plt.subplot()
plt.pie(t, explode=explode, labels=t.index.values, autopct='%i%%', shadow=True, startangle=90)
plt.axis('equal') 
plt.title("Passenger Class on the Titanic");

5. Диаграмма рассеяния scatter plot

Диаграмма рассеяния (также точечная диаграмма, англ. scatter plot) — математическая диаграмма, изображающая значения двух переменных в виде точек на декартовой плоскости.

На диаграмме рассеяния каждому наблюдению (или элементарной единице набора данных) соответствует точка, координаты которой (в декартовой системе координат) равны значениям двух каких-то параметров этого наблюдения. Если предполагается, что один из параметров зависит от другого, то обычно значения независимого параметра откладывается по горизонтальной оси, а значения зависимого — по вертикальной. Диаграммы рассеяния используются для демонстрации наличия или отсутствия корреляции между двумя переменными.

In [30]:
x = np.random.rand(100)
y = np.random.rand(100)
plt.scatter(x, y);
In [31]:
plt.scatter(x, 5*x);
In [32]:
plt.scatter(x, y*x);
In [33]:
plt.scatter(x, y/x);
In [34]:
plt.scatter(x, y*x, alpha=0.8, marker=r'$\clubsuit$');
In [35]:
plt.scatter(x, y,  marker='^');
In [36]:
N=100
r0 = 0.6
area = (20 * np.random.rand(N))**2  # 0 to 10 point radii
c = np.sqrt(area)
r = np.sqrt(x * x + y * y)
area1 = np.ma.masked_where(r < r0, area)
area2 = np.ma.masked_where(r >= r0, area)
plt.scatter(x, y, s=area1, marker='^', c=c)
plt.scatter(x, y, s=area2, marker='o', c=c)
Out[36]:
<matplotlib.collections.PathCollection at 0x254cf777c18>

6. Линия тренда

Тренд (от англ. trend — тенденция) — это долговременная тенденция изменения исследуемого временного ряда. Тренды могут быть описаны различными уравнениями — линейными, логарифмическими, степенными и так далее. Фактический тип тренда устанавливают на основе подбора его функциональной модели статистическими методами либо сглаживанием исходного временного ряда.

In [37]:
diamonds = pd.read_csv('diamonds.csv')

# the raw data
x = diamonds.carat[diamonds.carat < 2]
y = diamonds.price[diamonds.carat < 2]
plt.plot(x, y, 'o',  alpha=0.05)

# 2nd order polynomial
params = np.polyfit(x, y, 2)
xp = np.linspace(x.min(), 2, 20)
yp = np.polyval(params, xp)
plt.plot(xp, yp, 'k')

#overplot an error band
sig = np.std(y - np.polyval(params, x))
plt.fill_between(xp, yp - sig, yp + sig, color='k', alpha=0.2)

plt.xlabel("Carat")
plt.ylabel("Price");

7. График для множественных испытаний (Bootstrap Plot)

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

In [38]:
data = pd.Series(np.random.rand(1000))
#plt.figure()
pd.plotting.bootstrap_plot(data, size=50, samples=500, color='grey')
#plt.show()
Out[38]: