Построение графиков на Python | Набор 1
Подзаголовки требуются, когда мы хотим показать два или более участков на одном рисунке. Мы можем сделать это двумя способами, используя два немного разных метода.
Способ 1
# importing required modules
import matplotlib.pyplot as plt
import numpy as np
# function to generate coordinates
def create_plot(ptype):
# setting the x-axis values
x = np.arange(-10, 10, 0.01)
# setting the y-axis values
if ptype == 'linear':
y = x
elif ptype == 'quadratic':
y = x**2
elif ptype == 'cubic':
y = x**3
elif ptype == 'quartic':
y = x**4
return(x, y)
# setting a style to use
plt.style.use('fivethirtyeight')
# create a figure
fig = plt.figure()
# define subplots and their positions in figure
plt1 = fig.add_subplot(221)
plt2 = fig.add_subplot(222)
plt3 = fig.add_subplot(223)
plt4 = fig.add_subplot(224)
# plotting points on each subplot
x, y = create_plot('linear')
plt1.plot(x, y, color ='r')
plt1.set_title('$y_1 = x$')
x, y = create_plot('quadratic')
plt2.plot(x, y, color ='b')
plt2.set_title('$y_2 = x^2$')
x, y = create_plot('cubic')
plt3.plot(x, y, color ='g')
plt3.set_title('$y_3 = x^3$')
x, y = create_plot('quartic')
plt4.plot(x, y, color ='k')
plt4.set_title('$y_4 = x^4$')
# adjusting space between subplots
fig.subplots_adjust(hspace=.5,wspace=0.5)
# function to show the plot
plt.show()
Выход:
Давайте пройдемся по этой программе шаг за шагом:
plt.style.use('fivethirtyeight')
- Стиль участков можно настроить, установив различные доступные стили или установив свой собственный. Вы можете узнать больше об этой функции здесь
fig = plt.figure()
- Рисунок действует как контейнер верхнего уровня для всех элементов графика. Итак, мы определяем фигуру как инжир который будет содержать все наши подзаголовки.
plt1 = fig.add_subplot(221)
plt2 = fig.add_subplot(222)
plt3 = fig.add_subplot(223)
plt4 = fig.add_subplot(224)
- Здесь мы используем метод рис.add_subplot для определения подзаголовков и их положений. Прототип функции выглядит следующим образом:
add_subplot(nrows, ncols, plot_number)
- Если к фигуре применяется подзаголовок, фигура будет условно разделена на подоси «nrows» * ‘ncols». Параметр «plot_number» определяет подзаголовок, который должен быть создан вызовом функции. ‘plot_number «может варьироваться от 1 до максимум «nrows» * » ncols’.
Если значения трех параметров меньше 10, подзаголовок функции может быть вызван с одним параметром int, где сотни представляют «nrows», десятки представляют «ncols», а единицы представляют «plot_number». Это означает: вместо подзаголовка(2, 3, 4) мы можем написать подзаголовок(234).
Эта цифра позволит понять, как указываются позиции:
x, y = create_plot('linear')
plt1.plot(x, y, color ='r')
plt1.set_title('$y_1 = x$')
- Далее мы строим наши точки на каждом подзаголовке. Во-первых, мы генерируем координаты по оси x и y, используя функция create_plot, указав тип кривой, которую мы хотим.
Затем мы наносим эти точки на наш подзаголовок, используя .метод построения графика. Название подзаголовка задается с помощью метод set_title. С помощью $ в начале и в конце текста заголовка убедитесь, что » _ «(подчеркивание) читается как нижний индекс, а » ^ » — как верхний.
fig.subplots_adjust(hspace=.5,wspace=0.5)
- Это еще один полезный метод, который создает пространство между подзаголовками.
plt.show()
- В конце концов, мы вызываем метод plt.show (), который покажет текущую цифру.
Способ 2
# importing required modules
import matplotlib.pyplot as plt
import numpy as np
# function to generate coordinates
def create_plot(ptype):
# setting the x-axis values
x = np.arange(0, 5, 0.01)
# setting y-axis values
if ptype == 'sin':
# a sine wave
y = np.sin(2*np.pi*x)
elif ptype == 'exp':
# negative exponential function
y = np.exp(-x)
elif ptype == 'hybrid':
# a damped sine wave
y = (np.sin(2*np.pi*x))*(np.exp(-x))
return(x, y)
# setting a style to use
plt.style.use('ggplot')
# defining subplots and their positions
plt1 = plt.subplot2grid((11,1), (0,0), rowspan = 3, colspan = 1)
plt2 = plt.subplot2grid((11,1), (4,0), rowspan = 3, colspan = 1)
plt3 = plt.subplot2grid((11,1), (8,0), rowspan = 3, colspan = 1)
# plotting points on each subplot
x, y = create_plot('sin')
plt1.plot(x, y, label = 'sine wave', color ='b')
x, y = create_plot('exp')
plt2.plot(x, y, label = 'negative exponential', color = 'r')
x, y = create_plot('hybrid')
plt3.plot(x, y, label = 'damped sine wave', color = 'g')
# show legends of each subplot
plt1.legend()
plt2.legend()
plt3.legend()
# function to show plot
plt.show()
Выход:
Давайте также рассмотрим важные части этой программы:
plt1 = plt.subplot2grid ((11,1), (0,0), интервал строк = 3, интервал столбцов = 1)
plt2 = plt.subplot2grid ((11,1), (4,0), интервал строк = 3, интервал столбцов = 1)
plt3 = plt.subplot2grid ((11,1), (8,0), интервал строк = 3, интервал столбцов = 1)
- subplot2grid аналогичен “pyplot.subplot”, но использует индексацию на основе 0 и позволяет подзаголовку занимать несколько ячеек.
Давайте попробуем понять аргументы метода subplot2grid:
1. аргумент 1 : геометрия сетки
2. аргумент 2: расположение подзаголовка в сетке
3. аргумент 3: (диапазон строк) Количество строк, покрытых подзаголовком.
4. аргумент 4: (colspan) Количество столбцов, охваченных подзаголовком.
Эта цифра сделает эту концепцию более понятной:
- В нашем примере каждый подзаголовок охватывает 3 строки и 1 столбец с двумя пустыми строками (строка № 4,8).
x, y = create_plot('sin')
plt1.plot(x, y, label = 'sine wave', color ='b')
- В этой части нет ничего особенного, так как синтаксис построения точек на подзаголовке остается прежним.
plt1.legend()
- Это покажет метку подзаголовка на рисунке.
plt.show()
- Наконец, мы вызываем функцию plt.show(), чтобы показать текущий график.
Примечание: После рассмотрения двух приведенных выше примеров мы можем сделать вывод, что следует использовать subplot() метод, когда участки имеют одинаковый размер, где как метод следует предпочесть, когда мы хотим большей гибкости в отношении положения и размеров наших подзаголовков.
3-D построение графика
Мы можем легко построить трехмерные фигуры в matplotlib. Теперь мы обсудим некоторые важные и часто используемые трехмерные графики.
- Точки построения
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import style
import numpy as np
# setting a custom style to use
style.use('ggplot')
# create a new figure for plotting
fig = plt.figure()
# create a new subplot on our figure
# and set projection as 3d
ax1 = fig.add_subplot(111, projection='3d')
# defining x, y, z co-ordinates
x = np.random.randint(0, 10, size = 20)
y = np.random.randint(0, 10, size = 20)
z = np.random.randint(0, 10, size = 20)
# plotting the points on subplot
# setting labels for the axes
ax1.set_xlabel('x-axis')
ax1.set_ylabel('y-axis')
ax1.set_zlabel('z-axis')
# function to show the plot
plt.show()
- Вывод вышеприведенной программы предоставит вам окно, которое может поворачивать или увеличивать сюжет. Вот скриншот: (темные точки ближе, чем светлые)
- Давайте попробуем сейчас разобраться в некоторых важных аспектах этого кодекса.
from mpl_toolkits.mplot3d import axes3d
- Это модуль, необходимый для построения графика на трехмерном пространстве.
ax1 = fig.add_subplot(111, projection='3d')
- Здесь мы создаем подзаголовок на нашей фигуре и задаем аргумент проекции как 3d.
ax1.scatter(x, y, z, c = 'm', marker = 'o')
- Теперь мы используем .разброс() функция для построения точек в плоскости XYZ.
- Построение линий
# importing required modules
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import style
import numpy as np
# setting a custom style to use
style.use('ggplot')
# create a new figure for plotting
fig = plt.figure()
# create a new subplot on our figure
ax1 = fig.add_subplot(111, projection='3d')
# defining x, y, z co-ordinates
x = np.random.randint(0, 10, size = 5)
y = np.random.randint(0, 10, size = 5)
z = np.random.randint(0, 10, size = 5)
# plotting the points on subplot
ax1.plot_wireframe(x,y,z)
# setting the labels
ax1.set_xlabel('x-axis')
ax1.set_ylabel('y-axis')
ax1.set_zlabel('z-axis')
plt.show()
- Скриншот трехмерного графика вышеприведенной программы будет выглядеть так:
- Основное отличие этой программы от предыдущей заключается в:
ax1.plot_wireframe(x,y,z)
- Мы использовали .plot_wireframe() способ построения линий над заданным набором трехмерных точек.
- Построение Графиков
# importing required modules
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import style
import numpy as np
# setting a custom style to use
style.use('ggplot')
# create a new figure for plotting
fig = plt.figure()
# create a new subplot on our figure
ax1 = fig.add_subplot(111, projection='3d')
# defining x, y, z co-ordinates for bar position
x = [1,2,3,4,5,6,7,8,9,10]
y = [4,3,1,6,5,3,7,5,3,7]
z = np.zeros(10)
# size of bars
dx = np.ones(10) # length along x-axis
dy = np.ones(10) # length along y-axs
dz = [1,3,4,2,6,7,5,5,10,9] # height of bar
# setting color scheme
color = []
for h in dz:
if h > 5:
color.append('r')
else:
color.append('b')
# plotting the bars
ax1.bar3d(x, y, z, dx, dy, dz, color = color)
# setting axes labels
ax1.set_xlabel('x-axis')
ax1.set_ylabel('y-axis')
ax1.set_zlabel('z-axis')
plt.show()
- Скриншот созданной трехмерной среды находится здесь:
- Давайте рассмотрим важные аспекты этой программы:
x = [1,2,3,4,5,6,7,8,9,10]
y = [4,3,1,6,5,3,7,5,3,7]
z = np.zeros(10)
- Здесь мы определяем базовые положения баров.
dx = np.ones(10) # length along x-axis
dy = np.ones(10) # length along y-axs
dz = [1,3,4,2,6,7,5,5,10,9] # height of bar
- dx, dy, dz обозначают размер бара. Рассмотрим стержень как кубоид, тогда dx, dy, dz-его расширения вдоль оси x, y, z соответственно.
for h in dz:
if h > 5:
color.append('r')
else:
color.append('b')
- Здесь мы задаем цвет для каждой полосы в виде списка. Цветовая схема красная для полос высотой более 5 и синяя в противном случае.
ax1.bar3d(x, y, z, dx, dy, dz, color = color)
- Наконец, для построения графиков мы используем функцию .bar3d ().
- Построение кривых
# importing required modules
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import style
import numpy as np
# setting a custom style to use
style.use('ggplot')
# create a new figure for plotting
fig = plt.figure()
# create a new subplot on our figure
ax1 = fig.add_subplot(111, projection='3d')
# get points for a mesh grid
u, v = np.mgrid[0:2*np.pi:200j, 0:np.pi:100j]
# setting x, y, z co-ordinates
x=np.cos(u)*np.sin(v)
y=np.sin(u)*np.sin(v)
z=np.cos(v)
# plotting the curve
ax1.plot_wireframe(x, y, z, rstride = 5, cstride = 5, linewidth = 1)
plt.show()
- Вывод этой программы будет выглядеть следующим образом:
- Здесь мы изобразили сферу в виде сетчатой сетки.
Давайте пройдемся по некоторым важным частям:
u, v = np.mgrid[0:2*np.pi:200j, 0:np.pi:100j]
- Мы используем np.mgrid для получения точек, чтобы создать сетку.
Вы можете прочитать больше об этом здесь.
x=np.cos(u)*np.sin(v)
y=np.sin(u)*np.sin(v)
z=np.cos(v)
- Это не что иное, как параметрическое уравнение сферы.
ax1.plot_wireframe(x, y, z, rstride = 5, cstride = 5, linewidth = 1)
- Аган, мы используем .plot_wireframe(). Здесь, первая поездка и аргументы cstride можно использовать для определения того, насколько плотной должна быть наша сетка.