В качестве инструмента построения графиков рассмотрим библиотеку matplotlib и её модуль pyplot. Он предназначен для работы с двумерными фигурами и умеет строить большое число разнообразных типов графиков, обеспечивая при этом Matlab-подобный интерфейс. Простейший график можно создать с помощью следующих команд.
import numpy as npimport matplotlib.pyplot as plt
# векторы абсцисс и ординат
X = np.linspace(0, 2*np.pi, 50)
Y = np.sin(X)
# создание графика и его отображение
plt.plot(X,Y)
plt.show()
Как видно, отрисовка происходит через обращение к модулю pyplot (plt). График строит функция plot(), а отображает - show().
Для спецификации параметров линии можно использовать как "стандартные" коды, так и именованые аргументы функции plot(). Например, следующий фрагмент кода изменяет цвет и структуру линии, а также ограничивает диапазон отображения.
plt.plot(X,Y,'r--')
plt.xlim((1, 3)) # предел по X - от 1 до 3
plt.ylim((0, 1.5)) # предел по Y - от 0 до 1.5
plt.show()
Чтобы объединить несколько кривых на одном графике, просто перечислите их в функции plot(), при этом для каждой из них можно задать собственные парамеры кривых с помощью соответствующих "кодов". Следующий пример не только отрисовывает два графика в одном окне, но также делает подписи осей и отображает заголовок.
plt.plot(X,Y, X,np.cos(X)) # объединение 2-х графиков
plt.legend(('sin','cos')) # подписи
plt.title('Trigonometry') # заголовок
plt.xlabel('Time, s') # наименование оси абсцисс
plt.ylabel('Amplitude, c.u.') # наименование оси ординат
plt.show()
Если необходимо отобразить графики по-отдельности, нужно для каждого изображения создавать отдельное окно с помощью функции figure().
plt.plot(X,Y) # первый график
plt.figure() # новое окно
plt.plot(X,np.cos(X)) # второй график
plt.show()
Другой вариант - отображение графиков в одном окне, но разных областях. Для этого служит функция subplot(), которая делит окно на заданное число частей и управляет доступом к ним. Если число частей меньше десяти, то можно использовать нотацию в виде трёхзначного числа:
строки-столбцы-номер_графика
Следующий пример строит два графика, расположенных горизонтально (цифра 1 соответствует одной строке, цифра 2 - двум столбцам, последняя цифра определяет область для отображения).
plt.subplot(121)
plt.plot(X,Y)
plt.subplot(122)
plt.plot(X,np.cos(X))
plt.show()
Для того, чтобы иметь возможность строить трёхмерные графики, нам понадобится модуль mpl_toolkits.mplot3d. Интересно, что после загрузки в явном виде мы на него ссылаться не будем, но без этого модуля программа не заработает. Итак, чтобы построить прямую в пространстве, выполним следующий код
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d
# координаты точек
N = np.linspace(0,10,50)
X = 5*np.cos(N)
Y = 3*np.sin(N)
Z = 0.8*N
N = np.linspace(0,10,50)
X = 5*np.cos(N)
Y = 3*np.sin(N)
Z = 0.8*N
# построение и отображение графика
plt.gca(projection='3d') # указываем тип
plt.plot(X,Y,Z) # строим
plt.show()
plt.gca(projection='3d') # указываем тип
plt.plot(X,Y,Z) # строим
plt.show()
С поверхностью всё немного сложнее.
# координаты
X = np.mgrid[0:8:0.1, -5:5:0.1]
Z = np.cos(X[0])*np.sin(X[1])
# создание окна для 3D объекта
sub = plt.figure().add_subplot(111,projection='3d')
# построение графика
sub.plot_surface(X[0],X[1],Z)
# подпись осей
sub.set_xlabel('X')
sub.set_ylabel('Y')
sub.set_zlabel('Z')
plt.show()
Сначала мы задаём сетку с помощью функции mgrid(), затем формируем поверхность Z для каждой пары элементов из исходной сетки X. В данном примере это просто произведение косинуса абсциссы на синус ординаты (напомню, что произведение массивов в NumPy выполняется поэлементно). Для построение графика нужно сгенерировать объект subplot, т.к. он содержит метод plot_surface() для создания поверхностей. Дальнейшая работа программы происходит через данный объект и заключается в построении графика и (опционально) указании наименования координатных осей. Отображение происходит, как и раньше, через функцию show().
А можно подставить в координату Y значения из списка?
ОтветитьУдалить