вторник, 22 мая 2018 г.

Python. Графики

В качестве инструмента построения графиков рассмотрим библиотеку matplotlib и её модуль pyplot. Он предназначен для работы с двумерными фигурами и умеет строить большое число разнообразных типов графиков, обеспечивая при этом Matlab-подобный интерфейс. Простейший график можно создать с помощью следующих команд.
  import numpy as np
  import 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 
  # координаты точек
  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()


С поверхностью всё немного сложнее. 
  # координаты
  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(). 


1 комментарий: