Matplotlib — это библиотека Python для построения качественных двухмерных графиков.
Замечание. При работе с matplotlib в Debian Wheezy возникает ошибка:
«Matplotlib KeyError ItalicAngle в Debian Wheezy»
Решение проблемы описано здесь.
Рассмотрим некоторые примеры использования matplotlib.
Пример. Построить график функции \(y = x^2\) на отрезке [-10, 10] с шагом изменения аргумента 0.01.
# -*- coding: utf8 -*-
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10, 10.01, 0.01) #Массив значений аргумента
plt.plot(x, x**2) #Построение графика
plt.xlabel(r'$x$') #Метка по оси x в формате TeX
plt.ylabel(r'$f(x)$') #Метка по оси y в формате TeX
plt.title(r'$y=x^2$') #Заголовок в формате TeX
plt.grid(True) #Сетка
plt.show() #Показать график
При построении графика можно использовать третий параметр, который позволяет изменять цвет и тип графика. Значение этого параметра по умолчанию равно 'b-', что означает сплошная синяя линия. Например, на следующем рисунке точки изображаются в виде кружков зеленого цвета.
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10, 11, 1)
plt.plot(x, x**2, 'go')
plt.show()
Подробное описание различных стилей отображения графиков можно найти в документации.
Очень легко можно построить графики нескольких функций на одном рисунке.
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10, 10.01, 0.01)
plt.plot(x, np.sin(x), x, np.cos(x), x, -x)
plt.xlabel(r'$x$')
plt.ylabel(r'$f(x)$')
plt.title(r'$f_1(x)=\sin(x),\ f_2(x)=\cos(x),\ f_3(x)=-x$')
plt.grid(True)
plt.show()
Работа с matplotlib основана на использовании графических окон и осей (оси позволяют задать некоторую графическую область). Все построения применяются к текущим осям. Это позволяет изображать несколько графиков в одном графическом окне. По умолчанию создается одно графическое окно figure(1) и одна графическая область subplot(111) в этом окне. Команда subplot позволяет разбить графическое окно на несколько областей. Она имеет три параметра: nr; nc; np. Параметры nr и nc определяют количество строк и столбцов на которые разбивается графическая область, параметр np определяет номер текущей области (np принимает значения от 1 до nr*nc). Если nr*nc<10, то передавать параметры nr,nc,np можно без использовния запятой. Например, допустимы формы subplot(2,2,1) и subplot(221).
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10, 10.01, 0.01); t = np.arange(-10, 11, 1)
#subplot 1
plt.subplot(221)
plt.plot(x, np.sin(x))
plt.title(r'$\sin(x)$')
plt.grid(True)
#subplot 2
plt.subplot(222)
plt.plot(x, np.cos(x),'g')
plt.axis('equal')
plt.grid(True)
plt.title(r'$\cos(x)$')
#subplot 3
plt.subplot(223)
plt.plot(x, x**2, t, t**2, 'ro')
plt.title(r'$x^2$')
#subplot 4
plt.subplot(224)
plt.plot(x, x)
plt.subplot(224).spines['left'].set_position('center')
plt.subplot(224).spines['bottom'].set_position('center')
plt.title(r'$x$')
plt.show()
Построение графика функции в полярной системе координат
import numpy as np
import matplotlib.pyplot as plt
plt.subplot(111, polar=True)
phi = np.arange(0,2*np.pi,0.01)
rho = 2*phi
plt.plot(phi, rho, lw=2)
plt.show()
Построение графика функции, заданной параметрически
import numpy as np
import matplotlib.pyplot as plt
t = np.arange(0,2*np.pi,0.01)
r=4
plt.plot(r*np.sin(t),r*np.cos(t),lw=3)
plt.axis('equal')
plt.show()
Построение графика функции двух переменных
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np
ax = axes3d.Axes3D(plt.figure())
i = np.arange(-1, 1, 0.01)
X, Y = np.meshgrid(i, i)
Z = X**2-Y**2
ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)
plt.show()
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np
ax = axes3d.Axes3D(plt.figure())
i = np.arange(-1, 1, 0.01)
X, Y = np.meshgrid(i, i)
Z = X**2-Y**2
ax.plot_surface(X, Y, Z, rstride=10, cstride=10)
plt.show()
Построение графика функции двух переменных, заданной параметрически
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np
ax = axes3d.Axes3D(plt.figure())
u = np.linspace(0, 2*np.pi, 100)
v = np.linspace(0, np.pi, 100)
r=5
x = r * np.outer(np.cos(u), np.sin(v))
y = r * np.outer(np.sin(u), np.sin(v))
z = r * np.outer(np.ones(np.size(u)), np.cos(v))
ax.plot_surface(x, y, z, rstride=4, cstride=4)
plt.show()