Rukovodstvo
статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
Matplotlib: построение графиков из нескольких линий в одном и в разных масштабах
Введение Matplotlib — одна из наиболее широко используемых библиотек визуализации данных в Python. От простых до сложных визуализаций — это библиотека для большинства. В этом уроке мы рассмотрим, как построить несколько линейных графиков в Matplotlib — на одних и тех же осях или фигуре. Если вы хотите узнать больше о построении линейных графиков в целом, а также об их настройке, обязательно прочтите наше руководство по построению линейных графиков с помощью Matplotlib [/ matplotlib-line-plot-tutorial-and-examples /]. Pl
Время чтения: 6 мин.
Вступление
Matplotlib — одна из наиболее широко используемых библиотек визуализации данных в Python. От простых до сложных визуализаций — это библиотека для большинства.
В этом уроке мы рассмотрим, как построить несколько линейных графиков в Matplotlib — на одних и тех же Axes или Figure .
Если вы хотите узнать больше о построении линейных графиков в целом, а также об их настройке, обязательно прочтите наше руководство по построению линейных графиков с помощью Matplotlib .
Постройте многострочные графики в Matplotlib
В зависимости от стиля, который вы используете, ООП или стиля MATLAB, вы будете использовать либо plt , либо ax для построения графика с тем же подходом.
Чтобы построить несколько линейных графиков в Matplotlib, вы просто несколько раз вызываете plot() , которая применяет изменения к одному и тому же объекту Figure
Без установки каких-либо флагов настройки будет применяться палитра по умолчанию, рисуя оба линейных графика на одном и том же Figure и настраивая цвет, чтобы различать их:
Теперь давайте сгенерируем несколько случайных последовательностей с помощью Numpy и немного настроим линейные графики, установив для каждого определенный цвет и пометив их:
Нам не нужно передавать значения оси X на линейный график, и в этом случае будут применяться 0..n n , где n — последний элемент данных, которые вы строите. В нашем случае у нас есть две последовательности данных — line_1 и line_2 , которые будут нанесены на одну и ту же ось X.
Во время построения мы присвоили им цвета, используя color , и метки для легенды, используя аргумент label Это приводит к:
Постройте многолинейные графики с разными масштабами
Иногда у вас может быть два набора данных, подходящих для линейных графиков, но их значения значительно отличаются, что затрудняет сравнение обеих линий. Например, если в line_1 была экспоненциально возрастающая последовательность чисел, а в line_2 — линейно возрастающая последовательность — несомненно и достаточно быстро, в line_1 были бы значения настолько большие, чем в line_2 , что последняя исчезает из поля зрения.
Давайте использовать Numpy, чтобы создать экспоненциально возрастающую последовательность чисел и построить ее рядом с другой линией на тех же Axes , линейно:
Выполнение этого кода приводит к:
Экспоненциальный рост exponential_sequence выходит из-под контроля очень быстро, и похоже, что нет абсолютно никакой разницы в linear_sequence , поскольку она настолько мала по сравнению с экспоненциальным трендом другой последовательности.
Теперь давайте построим exponential_sequence в логарифмическом масштабе, что даст визуально прямую линию, поскольку масштаб Y будет экспоненциально увеличиваться. Если мы построим его в логарифмическом масштабе, а linear_sequence просто увеличится на ту же константу, у нас будет две перекрывающиеся линии, и мы сможем увидеть только одну, построенную после первой.
Давайте linear_sequence чтобы сделать его наблюдаемым, как только мы построим оба графика:
На этот раз нам придется использовать интерфейс ООП, поскольку мы создаем новый экземпляр Axes One Axes имеет один масштаб, поэтому мы создаем новый, в том же положении, что и первый, и устанавливаем его масштаб на логарифмический, и строим экспоненциальную последовательность.
Мы также изменили цвета меток галочки, чтобы они соответствовали цвету самих линейных графиков, иначе было бы трудно отличить, какая линия на каком масштабе.
Постройте графики с несколькими линиями с несколькими осями Y
Наконец, мы можем применить тот же масштаб (линейный, логарифмический и т. Д.), Но иметь разные значения по оси Y каждого линейного графика. Это достигается за счет того, что несколько осей Y на разных Axes находятся в одном и том же положении.
Например, linear_sequence не будет превышать 20 по оси Y, в то время как exponential_sequence будет увеличиваться до 20000. Мы можем построить их оба линейно , просто нанеся их на разные Axes в одной и той же позиции, каждый из которых автоматически установите отметки оси Y, чтобы они соответствовали вводимым нами данным:
Мы снова создали еще одну Axes в той же позиции, что и первая, поэтому мы можем рисовать в том же месте на Figure но разные Axes , что позволяет нам устанавливать значения для каждой оси Y индивидуально.
Без установки логарифмической шкалы Y на этот раз, оба графика будут построены линейно:
Заключение
В этом руководстве мы рассмотрели, как построить несколько линейных графиков на одной Figure или Axes в Matplotlib и Python. Мы рассмотрели, как построить график на одних и тех же Axes с одинаковым масштабом и осью Y, а также как построить график на одном Figure с разными и одинаковыми масштабами оси Y.
Если вас интересует визуализация данных и вы не знаете, с чего начать, обязательно ознакомьтесь с нашим комплектом книг по визуализации данных в Python <.ebook-link>:
Визуализация данных в Python
. <.col-md-8 .col-xs-12 .my-auto>Станьте опасными с визуализацией данных
✅ 30-дневная гарантия возврата денег без вопросов
✅ от начального до продвинутого
✅ Регулярно обновляется бесплатно (последнее обновление в апреле 2021 г.)
✅ Обновлено с бонусными ресурсами и руководствами . . .
Визуализация данных в Python с помощью Matplotlib и Pandas — это книга, предназначенная для абсолютных новичков в работе с Pandas и Matplotlib с базовыми знаниями Python и позволяющая им создать прочную основу для расширенной работы с этими библиотеками — от простых графиков до анимированных трехмерных графиков с интерактивными кнопки.
Он служит подробным руководством, которое научит вас всему, что вам нужно знать о Pandas и Matplotlib, в том числе о том, как создавать типы графиков, которые не встроены в саму библиотеку.
Книга «Визуализация данных в Python» , книга для начинающих и средних разработчиков Python, проведет вас через простые манипуляции с данными с помощью Pandas, охватит основные библиотеки построения графиков, такие как Matplotlib и Seaborn, и покажет, как использовать преимущества декларативных и экспериментальных библиотек, таких как Altair. В частности, на протяжении 11 глав эта книга охватывает 9 библиотек Python: Pandas, Matplotlib, Seaborn, Bokeh, Altair, Plotly, GGPlot, GeoPandas и VisPy.
Он служит уникальным практическим руководством по визуализации данных в виде множества инструментов, которые вы можете использовать в своей карьере.
Использование библиотеки 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.
Creating multiple subplots using plt.subplots #
pyplot.subplots creates a figure and a grid of subplots with a single call, while providing reasonable control over how the individual plots are created. For more advanced use cases you can use GridSpec for a more general subplot layout or Figure.add_subplot for adding subplots at arbitrary locations within the figure.
A figure with just one subplot#
subplots() without arguments returns a Figure and a single Axes .
This is actually the simplest and recommended way of creating a single Figure and Axes.
Stacking subplots in one direction#
The first two optional arguments of pyplot.subplots define the number of rows and columns of the subplot grid.
When stacking in one direction only, the returned axs is a 1D numpy array containing the list of created Axes.
If you are creating just a few Axes, it’s handy to unpack them immediately to dedicated variables for each Axes. That way, we can use ax1 instead of the more verbose axs[0] .
To obtain side-by-side subplots, pass parameters 1, 2 for one row and two columns.
Stacking subplots in two directions#
When stacking in two directions, the returned axs is a 2D NumPy array.
If you have to set parameters for each subplot it’s handy to iterate over all subplots in a 2D grid using for ax in axs.flat: .
You can use tuple-unpacking also in 2D to assign all subplots to dedicated variables:
Sharing axes#
By default, each Axes is scaled individually. Thus, if the ranges are different the tick values of the subplots do not align.
You can use sharex or sharey to align the horizontal or vertical axis.
Setting sharex or sharey to True enables global sharing across the whole grid, i.e. also the y-axes of vertically stacked subplots have the same scale when using sharey=True .
For subplots that are sharing axes one set of tick labels is enough. Tick labels of inner Axes are automatically removed by sharex and sharey. Still there remains an unused empty space between the subplots.
To precisely control the positioning of the subplots, one can explicitly create a GridSpec with Figure.add_gridspec , and then call its subplots method. For example, we can reduce the height between vertical subplots using add_gridspec(hspace=0) .
label_outer is a handy method to remove labels and ticks from subplots that are not at the edge of the grid.
Apart from True and False , both sharex and sharey accept the values ‘row’ and ‘col’ to share the values only per row or column.
If you want a more complex sharing structure, you can first create the grid of axes with no sharing, and then call axes.Axes.sharex or axes.Axes.sharey to add sharing info a posteriori.
Polar axes#
The parameter subplot_kw of pyplot.subplots controls the subplot properties (see also Figure.add_subplot ). In particular, this can be used to create a grid of polar Axes.
Total running time of the script: ( 0 minutes 7.774 seconds)