Python matplotlib как построить несколько графиков в одном окне
Перейти к содержимому

Python matplotlib как построить несколько графиков в одном окне

  • автор:

Как создать несколько графиков Matplotlib на одном рисунке

Как создать несколько графиков Matplotlib на одном рисунке

Вы можете использовать следующий синтаксис для создания нескольких графиков Matplotlib на одном рисунке:

import matplotlib.pyplot as plt #define grid of plots fig, axs = plt.subplots(nrows= 2 , ncols= 1 ) #add data to plots axs[0].plot(variable1, variable2) axs[1].plot(variable3, variable4) 

В следующих примерах показано, как использовать эту функцию на практике.

Пример 1: сложите графики вертикально

В следующем коде показано, как создать три графика Matplotlib, расположенные вертикально:

#create some data var1 = [1, 2, 3, 4, 5, 6] var2 = [7, 13, 16, 18, 25, 19] var3 = [29, 25, 20, 25, 20, 18] #define grid of plots fig, axs = plt.subplots(nrows= 3 , ncols= 1 ) #add title fig. suptitle('Plots Stacked Vertically') #add data to plots axs[0].plot(var1, var2) axs[1].plot(var1, var3) axs[2].plot(var2, var3) 

Несколько графиков, сложенных вертикально в Matplotlib

Пример 2: сложить графики по горизонтали

В следующем коде показано, как создать три графика Matplotlib, расположенные горизонтально:

#create some data var1 = [1, 2, 3, 4, 5, 6] var2 = [7, 13, 16, 18, 25, 19] var3 = [29, 25, 20, 25, 20, 18] #define grid of plots fig, axs = plt.subplots(nrows= 1 , ncols= 3 ) #add title fig. suptitle('Plots Stacked Horizontally') #add data to plots axs[0].plot(var1, var2) axs[1].plot(var1, var3) axs[2].plot(var2, var3) 

Несколько графиков Matplotlib, расположенных горизонтально

Пример 3: создание сетки графиков

Следующий код показывает, как создать сетку графиков Matplotlib:

#create some data var1 = [1, 2, 3, 4, 5, 6] var2 = [7, 13, 16, 18, 25, 19] var3 = [29, 25, 20, 25, 20, 18] var4 = [4, 4, 6, 4, 7, 11] #define grid of plots fig, axs = plt.subplots(nrows= 2 , ncols= 2 ) #add title fig. suptitle('Grid of Plots') #add data to plots axs[0, 0].plot(var1, var2) axs[0, 1].plot(var1, var3) axs[1, 0].plot(var1, var4) axs[1, 1].plot(var3, var1) 

Несколько графиков в Matplotlib

Пример 4: Совместное использование осей между участками

Вы можете использовать аргументы sharex и sharey , чтобы убедиться, что несколько графиков используют одну и ту же ось X:

#create some data var1 = [1, 2, 3, 4, 5, 6] var2 = [7, 13, 16, 18, 25, 19] var3 = [29, 25, 20, 25, 20, 18] var4 = [4, 4, 6, 4, 7, 11] #define grid of plots fig, axs = plt.subplots(nrows= 2 , ncols= 2 , sharex= True , sharey= True ) #add title fig. suptitle('Grid of Plots with Same Axes') #add data to plots axs[0, 0].plot(var1, var2) axs[0, 1].plot(var1, var3) axs[1, 0].plot(var1, var4) axs[1, 1].plot(var3, var1) 

Как построить несколько строк в Matplotlib

Как построить несколько строк в Matplotlib

Вы можете отобразить несколько строк на одном графике Matplotlib, используя следующий синтаксис:

import matplotlib.pyplot as plt plt.plot(df['column1']) plt.plot(df['column2']) plt.plot(df['column3']) . plt.show() 

В этом руководстве представлено несколько примеров того, как построить несколько линий на одной диаграмме с использованием следующего кадра данных pandas:

import numpy as np import pandas as pd #make this example reproducible np.random.seed (0) #create dataset period = np.arange (1, 101, 1) leads = np.random.uniform (1, 50, 100) prospects = np.random.uniform (40, 80, 100) sales = 60 + 2\*period + np.random.normal (loc=0, scale=.5\*period, size=100) df = pd.DataFrame() #view first 10 rows df.head (10) period leads prospects sales 0 1 27.891862 67.112661 62.563318 1 2 36.044279 50.800319 62.920068 2 3 30.535405 69.407761 64.278797 3 4 27.699276 78.487542 67.124360 4 5 21.759085 49.950126 68.754919 5 6 32.648812 63.046293 77.788596 6 7 22.441773 63.681677 77.322973 7 8 44.696877 62.890076 76.350205 8 9 48.219475 48.923265 72.485540 9 10 19.788634 78.109960 84.221815 

Постройте несколько строк в Matplotlib

В следующем коде показано, как построить три отдельные линии на одном графике в matplotlib:

import matplotlib.pyplot as plt #plot individual lines plt.plot(df['leads']) plt.plot(df['prospects']) plt.plot(df['sales']) #display plot plt.show() 

Несколько строк в диаграмме Matplotlib

Настройка линий в Matplotlib

Вы также можете настроить цвет, стиль и ширину каждой линии:

#plot individual lines with custom colors, styles, and widths plt.plot(df['leads'], color='green') plt.plot(df['prospects'], color='steelblue', linewidth= 4 ) plt.plot(df['sales'], color='purple', linestyle='dashed') #display plot plt.show() 

Настроить несколько строк в Matplotlib

Добавить легенду в Matplotlib

Вы также можете добавить легенду, чтобы различать строки:

#plot individual lines with custom colors, styles, and widths plt.plot(df['leads'], label='Leads', color='green') plt.plot(df['prospects'], label='Prospects', color='steelblue', linewidth= 4 ) plt.plot(df['sales'], label='Sales', color='purple', linestyle='dashed') #add legend plt.legend() #display plot plt.show() 

Добавить легенду для нескольких строк в Matplotlib

Добавьте метки и заголовки осей в Matplotlib

Наконец, вы можете добавить метки осей и заголовок, чтобы сделать график завершенным:

#plot individual lines with custom colors, styles, and widths plt.plot(df['leads'], label='Leads', color='green') plt.plot(df['prospects'], label='Prospects', color='steelblue', linewidth= 4 ) plt.plot(df['sales'], label='Sales', color='purple', linestyle='dashed') #add legend plt.legend() #add axis labels and a title plt.ylabel('Sales', fontsize= 14 ) plt.xlabel('Period', fontsize= 14 ) plt.title('Company Metrics', fontsize= 16 ) #display plot plt.show() 

Вы можете найти больше руководств по Matplotlib здесь .

Как вывести несколько графиков одновременно?

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

import random import matplotlib.pyplot as plt import numpy as np import pandas as pd plt.style.use('ggplot') mn, mx, N = -10000, 10000, 1000 dataset = pd.Series(data=[random.randint(mn, mx) for _ in range(1000)], name='X') print("Характеристики полученных целочисленных данных :\n") print(f"Минимальное значение : ") print(f"Количество повторяющихся значений : ") print(f"Максимальное значение : ") print(f"Сумма чисел : ") plt.plot(list(range(1000)), dataset, alpha=0.8) plt.title("Линейный график\n(по заданным целочисленным данным)") plt.show() plt.hist(dataset, alpha=0.8) plt.title('Гистограмма значений \n(по заданным целочисленным данным)') plt.show() dataframe = pd.DataFrame(dataset) dataframe['X_по_возрастанию'] = dataframe.X.sort_values().values dataframe['X_по_убыванию'] = dataframe.X.sort_values(ascending=False).values dataframe.head() plt.plot(dataframe['X_по_возрастанию'], label="X по возрастанию") plt.plot(dataframe['X_по_убыванию'], label="X по убыванию") plt.title('Два линейных графика отсортированных значений\n(по заданным целочисленным данным)') plt.legend() plt.show() 

Отслеживать
74.3k 114 114 золотых знаков 38 38 серебряных знаков 56 56 бронзовых знаков
задан 2 мая 2021 в 10:26
11 1 1 золотой знак 1 1 серебряный знак 4 4 бронзовых знака
удалите все вызовы plt.show() кроме последнего
2 мая 2021 в 10:30

Может что-то не так делаю, но в таком случае график едет и все в куче. Надо в идеале чтобы три окна одновременно появлялись. Или три полноценных графика в одном окне.

2 мая 2021 в 10:33

это уже следующий вопрос 😉 Для того чтобы графики не «съезжали» значения различных графиков должны лежать приблизительно в одинаковых диапазонах. В противном случае графики будут «ехать»

2 мая 2021 в 10:40
А вывод нескольких окон одновременно возможен? В моем случае 3
2 мая 2021 в 10:48

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Для того чтобы отобразить несколько независимых графиков в одном окне — предназначена функция subplot() из пакета pylab .

import random import matplotlib.pyplot as plt import numpy as np import pandas as pd # Импортируем один из пакетов Matplotlib import pylab plt.style.use('ggplot') mn, mx, N = -10000, 10000, 1000 dataset = pd.Series(data=[random.randint(mn, mx) for _ in range(1000)], name='X') print("Характеристики полученных целочисленных данных :\n") print(f"Минимальное значение : ") print(f"Количество повторяющихся значений : ") print(f"Максимальное значение : ") print(f"Сумма чисел : ") # Две строки, два столбца. Текущая ячейка - 1 pylab.subplot (2, 2, 1) pylab.plot(list(range(1000)), dataset, alpha=0.8) pylab.title ("Линейный график") # Две строки, два столбца. Текущая ячейка - 3 pylab.subplot (2, 2, 3) pylab.hist(dataset, alpha=0.8) #plot (xlist, ylist) pylab.title ("Гистограмма значений") dataframe = pd.DataFrame(dataset) dataframe['X_по_возрастанию'] = dataframe.X.sort_values().values dataframe['X_по_убыванию'] = dataframe.X.sort_values(ascending=False).values dataframe.head() # Две строки, два столбца. Текущая ячейка - 2 pylab.subplot (1, 2, 2) pylab.plot (dataframe['X_по_возрастанию'], label="X по возрастанию") pylab.plot (dataframe['X_по_убыванию'], label="X по убыванию") pylab.title ("Два линейных графика") # Покажем окно с нарисованным графиком pylab.show() 

введите сюда описание изображения

Отслеживать
ответ дан 2 мая 2021 в 11:38
74.3k 114 114 золотых знаков 38 38 серебряных знаков 56 56 бронзовых знаков

Ответ @S.Nick в целом верен, но у него есть один большой недостаток: в нём используется matplotlib.pylab . Разработчики matplotlib рекомендуют пользоваться pyplot .

pylab был разработан для упрощения жизни тем людям, кто переходит в Python из MATLAB. Этот пакет импортирует в глобальное пространство имён все рисовальные функции pyplot И вычислительные функции numpy , благодаря чему пайтоновский скрипт становится похожим на матлабовский. Типа такого:

from pylab import * x = linspace(-3, 3, 30) y = x**2 plot(x, y) show() 

Вызовы pylab.subplot работают, но несколько бессмысленны, так как это прямые синонимы функций из pyplot . В ответе S.Nick вы можете заменить все обращения к pylab.subplot на вызов оригинала pyplot.subplot :

import random import matplotlib.pyplot as plt import numpy as np import pandas as pd plt.style.use('ggplot') mn, mx, N = -10000, 10000, 1000 dataset = pd.Series(data=[random.randint(mn, mx) for _ in range(1000)], name='X') print("Характеристики полученных целочисленных данных :\n") print(f"Минимальное значение : ") print(f"Количество повторяющихся значений : ") print(f"Максимальное значение : ") print(f"Сумма чисел : ") # Две строки, два столбца. Текущая ячейка - 1 plt.subplot (2, 2, 1) plt.plot(list(range(1000)), dataset, alpha=0.8) plt.title ("Линейный график") # Две строки, два столбца. Текущая ячейка - 3 plt.subplot (2, 2, 3) plt.hist(dataset, alpha=0.8) #plot (xlist, ylist) plt.title ("Гистограмма значений") dataframe = pd.DataFrame(dataset) dataframe['X_по_возрастанию'] = dataframe.X.sort_values().values dataframe['X_по_убыванию'] = dataframe.X.sort_values(ascending=False).values dataframe.head() # Две строки, два столбца. Текущая ячейка - 2 plt.subplot (1, 2, 2) plt.plot (dataframe['X_по_возрастанию'], label="X по возрастанию") plt.plot (dataframe['X_по_убыванию'], label="X по убыванию") plt.title ("Два линейных графика") plt.show() 

Использование библиотеки Matplotlib. Как нарисовать несколько графиков в одном окне

Часто бывает удобно отобразить несколько независимых графиков в одном окне. Для этого предназначена функция subplot() из пакета matplotlib.pyplot.

У этой функции есть несколько вариантов ее использования. В этой статье мы рассмотрим два из них.

Функция subplot() ожидает три параметра:

  • количество строк в графике;
  • количество столбцов в графике;
  • номер ячейки, куда будут выводиться графики, после вызова этой функции. Ячейки нумеруются построчно, начиная с 1.

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

import matplotlib. pyplot as plt

import numpy as np

if __name__ == ‘__main__’ :
# Интервал изменения переменной по оси X
xmin = — 20.0
xmax = 20.0
count = 200

# Создадим список координат по оиси X на отрезке [xmin; xmax]
x = np. linspace ( xmin , xmax , count )

# Вычислим значение функции в заданных точках
y = np. sinc ( x / np. pi )

plt. figure ( figsize = ( 8 , 8 ) )

# . Две строки, три столбца.
# . Текущая ячейка — 1
plt. subplot ( 2 , 3 , 1 )
plt. plot ( x , y )
plt. title ( «1» )

# . Текущая ячейка — 2
plt. subplot ( 2 , 3 , 2 )
plt. plot ( x , y )
plt. title ( «2» )

# . Текущая ячейка — 3
plt. subplot ( 2 , 3 , 3 )
plt. plot ( x , y )
plt. title ( «3» )

# . Текущая ячейка — 4
plt. subplot ( 2 , 3 , 4 )
plt. plot ( x , y )
plt. title ( «4» )

# . Текущая ячейка — 5
plt. subplot ( 2 , 3 , 5 )
plt. plot ( x , y )
plt. title ( «5» )

# . Текущая ячейка — 6
plt. subplot ( 2 , 3 , 6 )
plt. plot ( x , y )
plt. title ( «6» )

# Покажем окно с нарисованным графиком
plt. show ( )

Все эти ячейки чисто условные, поэтому для каждого вызова subplot() разбиение главного окна может быть свое, что позволяет сделать, например, следующее расположение графиков (обратите внимание на нумерацию ячеек):

import matplotlib. pyplot as plt

import numpy as np

if __name__ == ‘__main__’ :
# Интервал изменения переменной по оси X
xmin = — 20.0
xmax = 20.0
count = 200

# Создадим список координат по оиси X на отрезке [xmin; xmax]
x = np. linspace ( xmin , xmax , count )

# Вычислим значение функции в заданных точках
y = np. sinc ( x / np. pi )

plt. figure ( figsize = ( 8 , 8 ) )

# . Две строки, три столбца.
# . Текущая ячейка — 1
plt. subplot ( 2 , 3 , 1 )
plt. plot ( x , y )
plt. title ( «1» )

# . Две строки, три столбца.
# . Текущая ячейка — 2
plt. subplot ( 2 , 3 , 2 )
plt. plot ( x , y )
plt. title ( «2» )

# . Две строки, три столбца.
# . Текущая ячейка — 4
plt. subplot ( 2 , 3 , 4 )
plt. plot ( x , y )
plt. title ( «4» )

# . Две строки, три столбца.
# . Текущая ячейка — 5
plt. subplot ( 2 , 3 , 5 )
plt. plot ( x , y )
plt. title ( «5» )

# . Одна строка, три столбца.
# . Текущая ячейка — 3
plt. subplot ( 1 , 3 , 3 )
plt. plot ( x , y )
plt. title ( «3» )

# Покажем окно с нарисованным графиком
plt. show ( )

У функции есть еще несколько необычный способ задания разбиения окна. В случае, если количество графиков не превышает 9, вместо перечисления трех чисел мы можем писать одно трехзначное целое число. То есть, вместо plt.subplot(1, 3, 3) мы можем написать plt.subplot(133). Поэтому предыдущий пример мы можем переписать в следующем виде, при этом внешний вид графика не изменится:

import matplotlib. pyplot as plt

import numpy as np

if __name__ == ‘__main__’ :
# Интервал изменения переменной по оси X
xmin = — 20.0
xmax = 20.0
count = 200

# Создадим список координат по оиси X на отрезке [xmin; xmax]
x = np. linspace ( xmin , xmax , count )

# Вычислим значение функции в заданных точках
y = np. sinc ( x / np. pi )

plt. figure ( figsize = ( 8 , 8 ) )

# . Две строки, три столбца.
# . Текущая ячейка — 1
plt. subplot ( 231 )
plt. plot ( x , y )
plt. title ( «1» )

# . Две строки, три столбца.
# . Текущая ячейка — 2
plt. subplot ( 232 )
plt. plot ( x , y )
plt. title ( «2» )

# . Две строки, три столбца.
# . Текущая ячейка — 4
plt. subplot ( 234 )
plt. plot ( x , y )
plt. title ( «4» )

# . Две строки, три столбца.
# . Текущая ячейка — 5
plt. subplot ( 235 )
plt. plot ( x , y )
plt. title ( «5» )

# . Одна строка, три столбца.
# . Текущая ячейка — 3
plt. subplot ( 133 )
plt. plot ( x , y )
plt. title ( «3» )

# Покажем окно с нарисованным графиком
plt. show ( )

У функции subplot() есть еще другие способы использования, которые описаны в статье Использование класса GridSpec для расположения графиков.

Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *