Как найти точку на графике питон

  • matplotlib.pyplot.plot and matplotlib.axes.Axes.plot plots y versus x as lines and/or markers.
  • ax.plot(105, 200) attempts to draw a line, but two points are required for a line
    • plt.plot([105, 110], [200, 210])
  • A third positional argument consists of line type, color, and/or marker
    • 'o' can be used to only draw a marker.
      • Specifying marker='o' does not work the same as the positional argument.
    • 'ro' specifies color and marker, respectively
    • '-o' or '-ro' will draw a line and marker if two or more x and y values are provided.
  • matplotlib.pyplot.scatter and matplotlib.axes.Axes.scatter can also be used to add single or multiple points
  • Tested in python 3.10, matplotlib 3.5.1, seaborn 0.11.2
import matplotlib.pyplot as plt

fig, ax = plt.subplots(3, 1, figsize=(8, 10), tight_layout=True)

# single point
ax[0].plot(105, 110, '-ro', label='line & marker - no line because only 1 point')
ax[0].plot(200, 210, 'go', label='marker only')  # use this to plot a single point
ax[0].plot(160, 160, label='no marker - default line - not displayed- like OP')
ax[0].set(title='Markers - 1 point')
ax[0].legend()

# two points
ax[1].plot([105, 110], [200, 210], '-ro', label='line & marker')
ax[1].plot([105, 110], [195, 205], 'go', label='marker only')
ax[1].plot([105, 110], [190, 200], label='no marker - default line')
ax[1].set(title='Line & Markers - 2 points')
ax[1].legend()

# scatter plot
ax[2].scatter(x=105, y=110, c='r', label='One Point')  # use this to plot a single point
ax[2].scatter(x=[80, 85, 90], y=[85, 90, 95], c='g', label='Multiple Points')
ax[2].set(title='Single or Multiple Points with using .scatter')
ax[2].legend()

enter image description here

Seaborn

  • seaborn is a high-level api for matplotlib, and offers additional options for plotting single points.
  • sns.lineplot and sns.scatterplot are axes-level plots.
    • sns.lineplot has keyword arguments, which are passed to matplotlib.axes.Axes.plot
    • sns.scatterplot has keyword arguments, which are passed to matplotlib.axes.Axes.scatter
  • sns.relplot is a figure-level plot, with a kind= parameter.
    • kind='line' passes to sns.lineplot
    • kind='scatter' passes to sns.scatterplot
  • x= and y= must be passed as a vector in the following cases.

axes-level plots

sns.lineplot(x=[1], y=[1], marker='o', markersize=10, color='r')
sns.scatterplot(x=[1], y=[1], s=100, color='r')

enter image description here

figure-level plots

sns.relplot(kind='line', x=[1], y=[1], marker='o', markersize=10, color='r')
sns.relplot(kind='scatter', x=[1], y=[1], s=100, color='r')

enter image description here

Модуль pyplot — это коллекция функций в стиле команд, которая позволяет использовать matplotlib почти так же, как MATLAB. Каждая функция pyplot работает с объектами Figure и позволяет их изменять. Например, есть функции для создания объекта Figure, для создания области построения, представления линии, добавления метки и так далее.

pyplot является зависимым от состояния (stateful). Он отслеживает статус объекта Figure и его области построения. Функции выполняются на текущем объекте.

Простой интерактивный график

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

Но сначала нужно импортировать пакет pyplot и обозначить его как plt.

import matplotlib.pyplot as plt

В Python конструкторы обычно не нужны. Все определяется неявно. Так, при импорте пакета уже создается экземпляр plt со всеми его графическими возможностями, который готов к работе. Нужно всего лишь использовать функцию plot() для передачи функций, по которым требуется построить график.

Поэтому достаточно передать значения, которые нужно представить в виде последовательности целых чисел.

plt.plot([1,2,3,4])
[]

В этом случае генерируется объект Line2D. Это линия, представляющая собой линейный тренд точек, нанесенных на график.

Теперь все настроено. Осталось лишь дать команду показать график с помощью функции show().

plt.show()

Результат должен соответствовать показанному на изображении. Он будет отображаться в окне, которое называется plotting window с панелью инструментов. Прямо как в MATLAB.

Простой интерактивный график

Окно графика

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

панель управления pyplot

Код в консоли IPython передается в консоль Python в виде набора команд:

import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.show()

Если же вы используете IPython QtConsole, то могли заметить, что после вызова plot() график сразу отображается без необходимости вызывать show().

Простой интерактивный график

Если функции plt.plot() передать только список или массив чисел, matplotlib предположит, что это последовательность значений y на графике и свяжет ее с последовательностью натуральных чисел x: 0, 1, 2, 3, ….

Обычно график представляет собой пару значений (x, y), поэтому, если нужно определить его правильно, требуется два массива: в первом будут значения для оси x, а втором — для y. Функция plot() принимает и третий аргумент, описывающий то, как нужно представить точку на графике.

Свойства графика

На последнем изображении точки были представлены синей линией. Если не указывать явно, то график возьмет настройку функции plt.plot() по умолчанию:

  • Размер осей соответствует диапазону введенных данных
  • У осей нет ни меток, ни заголовков
  • Легенды нет
  • Соединяющая точки линия синяя

Для получения настоящего графика, где каждая пара значений (x, y) будет представлена в виде красной точки, нужно поменять это представление.

Если вы работаете в IPython, закройте окно, чтобы вернуться в консоль для введения новых команд. Затем нужно будет вызывать функцию show(), чтобы увидеть внесенные изменения.

plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.show()

Если же вы используете Jupyter QtConsole, то для каждой введенной команды будет появляться новый график.

в будущем в примерах средой разработки будет выступать IPython QtConsole.

Можно определить диапазон для осей x и y, задав значения в список [xmin, xmax, ymin, ymax] и передав его в качестве аргумента в функцию axis().

в IPython QtConsole для создания графика иногда нужно ввести несколько строк команд. Чтобы график при этом не генерировался с каждым нажатием Enter (перевод на новую строку), необходимо нажимать Ctrl + Enter. А когда график будет готов, остается лишь нажать Enter дважды.

Можно задать несколько свойств. Одно из них — заголовок, который задается через функцию title().

plt.axis([0,5,0,20])
plt.title('My first plot')
plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.show()

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

Простой график с заголовком

matplotlib и NumPy

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

Таким образом можно прямо добавлять в качестве входящих данных массивы NumPy. Массив данных, обработанный pandas, может быть использован matplotlib без дальнейшей обработки.

В качестве примера рассмотрим, как перенести на один график три тренда. Возьмем функцию sin из модуля math. Последний сперва нужно импортировать. Для генерации точек по синусоиде нужно использовать библиотеку NumPy. Сгенерируем набор точек по оси x с помощью функции arrange(), а для оси y воспользуемся функцией map(). С ее помощью применим sin() ко всем элементам массива (без цикла for).

import math
import numpy as np
t = np.arange(0,2.5,0.1)
y1 = np.sin(math.pi*t)
y2 = np.sin(math.pi*t+math.pi/2)
y3 = np.sin(math.pi*t-math.pi/2)
plt.plot(t,y1,'b*',t,y2,'g^',t,y3,'ys')
plt.show()

как перенести на один график три тренда

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

plt.plot(t,y1,'b--',t,y2,'g',t,y3,'r-.')
plt.show()

если вы не пользуетесь IPython QtConsole со встроенной matplotlib или работаете с этим кодом в обычной сессии Python, используйте команду plt.show() в конце кода для получения объекта графика со следующего изображения.

https://pythonru.com/wp-content/uploads/2020/07/patterny-sostoyashie-iz-kombinacij-tochek-i-defisov.png

Использование kwargs

Объекты, которые создают график, имеют разные характеризующие их атрибуты. Все они являются значениями по умолчанию, но их можно настроить с помощью аргументов-ключевых слов — kwargs.

Эти ключевые слова передаются в качестве аргументов в функции. В документации по разным функциям библиотеки matplotlib они всегда упоминаются последними вместе с kwargs. Например, функция plot() описана следующим образом.

matplotlib.pyplot.plot(*args, **kwargs)

В качестве примера с помощью аргумента linewidth можно поменять толщину линии.

plt.plot([1,2,4,2,1,0,1,2,1,4], linewidth=2.0)
plt.show()

Изменение толщины линии графика

Работа с несколькими объектами Figure и осями

До сих пор во всех примерах команды pyplot были направлены на отображение в пределах одного объекта. Но matplotlib позволяет управлять несколькими Figure одновременно, а внутри одного объекта можно выводить подграфики.

Работая с pyplot, нужно помнить о концепции текущего объекта Figure и текущих осей (графика на объекте).

Дальше будет пример с двумя подграфиками на одном Figure. Функция subplot(), помимо разделения объекта на разные зоны для рисования, используется для фокусировки команды на конкретном подграфике.

Аргументы, переданные subplot(), задают режим разделения и определяют текущий подграфик. Этот график будет единственным, на который воздействуют команды. Аргумент функции subplot() состоит из трех целых чисел. Первое определяет количество частей, на которое нужно разбить объект по вертикали. Второе — горизонтальное разделение. А третье число указывает на текущий подграфик, для которого будут актуальны команды.

Дальше будут отображаться тренды синусоиды (синус и косинус), и лучше всего разделить полотно по вертикали на два горизонтальных подграфика. В график передают числа 211 и 212.

t = np.arange(0,5,0.1)
y1 = np.sin(2*np.pi*t)
y2 = np.sin(2*np.pi*t)
plt.subplot(211)
plt.plot(t,y1,'b-.')
plt.subplot(212)
plt.plot(t,y2,'r--')
plt.show()

два горизонтальных подграфика

Теперь — то же самое для двух вертикальных подграфиков. Передаем в качестве аргументов 121 и 122.

t = np.arange(0.,1.,0.05)
y1 = np.sin(2*np.pi*t)
y2 = np.cos(2*np.pi*t)
plt.subplot(121)
plt.plot(t,y1,'b-.')
plt.subplot(122)
plt.plot(t,y2,'r--')
plt.show()

два вертикальных подграфика

Добавление элементов на график

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

В этом разделе добавим на график текстовые блоки, легенду и так далее.

Добавление текста

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

количество команд для представления графика постоянно растет. Но их не нужно переписывать каждый раз. Достаточно использовать стрелки на клавиатуре, вызывая раннее введенные команды и редактируя их с помощью новых строк (в тексте они выделены жирным).

Теперь добавим две метки на график. Они будут описывать тип значений на каждой из осей.

plt.axis([0,5,0,20])
plt.title('My first plot')
plt.xlabel('Counting')
plt.ylabel('Square values')
plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.show()

График более информативен, если добавить метки оси

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

plt.axis([0,5,0,20])
plt.title('My first plot', fontsize=20, fontname='Times New Roman')
plt.xlabel('Counting', color='gray')
plt.ylabel('Square values',color='gray')
plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.show()

Текст можно форматировать

Но в matplotlib можно делать даже больше: pyplot позволяет добавлять текст в любом месте графика. Это делается с помощью специальной функции text().

text(x,y,s, fontdict=None, **kwargs)

Первые два аргумента — это координаты, в которых нужно разметить текст. s — это строка с текстом, а fontdict (опционально) — желаемый шрифт. Разрешается использовать и ключевые слова.

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

plt.axis([0,5,0,20])
plt.title('My first plot', fontsize=20, fontname='Times New Roman')
plt.xlabel('Counting', color='gray')
plt.ylabel('Square values',color='gray')
plt.text(1,1.5,'First')
plt.text(2,4.5,'Second')
plt.text(3,9.5,'Third')
plt.text(4,16.5,'Fourth')
plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.show()

Теперь у каждой точки есть своя метка.

Каждая точка графика подписана

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

Для этого их нужно заключить в два символа $. Интерпретатор распознает их как выражения LaTeX и конвертирует соответствующий график. Это могут быть математические выражения, формулы, математические символы или греческие буквы. Перед LaTeX нужно добавлять r, что означает сырой текст. Это позволит избежать появления исключающих последовательностей.

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

plt.axis([0,5,0,20])
plt.title('My first plot', fontsize=20, fontname='Times New Roman')
plt.xlabel('Counting', color='gray')
plt.ylabel('Square values',color='gray')
plt.text(1,1.5,'First')
plt.text(2,4.5,'Second')
plt.text(3,9.5,'Third')
plt.text(4,16.5,'Fourth')
plt.text(1.1,12,r'$y = x^2$', fontsize=20, bbox={'facecolor':'yellow','alpha':0.2})         
plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.show()

Использование LaTeX в графике

Добавление сетки

Также на график можно добавить сетку. Часто это необходимо, чтобы лучше понимать положение каждой точки на графике.

Это простая операция. Достаточно воспользоваться функцией grid(), передав в качестве аргумента True.

plt.axis([0,5,0,20])
plt.title('My first plot', fontsize=20, fontname='Times New Roman')
plt.xlabel('Counting', color='gray')
plt.ylabel('Square values',color='gray')
plt.text(1,1.5,'First')
plt.text(2,4.5,'Second')
plt.text(3,9.5,'Third')
plt.text(4,16.5,'Fourth')
plt.text(1.1,12,r'$y = x^2$', fontsize=20, bbox={'facecolor':'yellow','alpha':0.2})  
plt.grid(True)
plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.show()

Добавление сетки

Добавление легенды

Также на графике должна присутствовать легенда. pyplot предлагает функцию legend() для добавления этого элемента.

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

plt.axis([0,5,0,20])
plt.title('My first plot', fontsize=20, fontname='Times New Roman')
plt.xlabel('Counting', color='gray')
plt.ylabel('Square values',color='gray')
plt.text(1,1.5,'First')
plt.text(2,4.5,'Second')
plt.text(3,9.5,'Third')
plt.text(4,16.5,'Fourth')
plt.text(1.1,12,r'$y = x^2$', fontsize=20, bbox={'facecolor':'yellow','alpha':0.2})  
plt.grid(True)
plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.legend(['First series'])
plt.show()

Добавление легенды по умолчанию

По умолчанию легенда добавляется в правом верхнем углу. Чтобы поменять это поведение, нужно использовать несколько аргументов-ключевых слов. Так, для выбора положения достаточно передать аргумент loc со значением от 0 до 10. Каждая из цифр обозначает один из углов. Значение 1 — значение по умолчанию, то есть, верхний правый угол. В следующем примере переместим легенду в левый верхний угол, чтобы она не пересекалась с точками на графике.

Код положения Положение
0 лучшее
1 Верхний правый угол
2 Верхний левый угол
3 Нижний левый угол
4 Нижний правый угол
5 Справа
6 Слева по центру
7 Справа по центру
8 Снизу по центру
9 Сверху по центру
10 По центру

Тут важно сделать одну ремарку. Легенды используются для указания определения набора данных с помощью меток, ассоциированных с определенным цветом и/или маркером. До сих пор в примерах использовался лишь один набор данных, переданный с помощью одной функции plot(). Но куда чаще один график может использоваться для нескольких наборов данных. С точки зрения кода каждый такой набор будет характеризоваться вызовом одной функции plot(), а порядок их определения будет соответствовать порядку текстовых меток, переданных в качестве аргумента функции legend().

import matplotlib.pyplot as plt
plt.axis([0,5,0,20])
plt.title('My first plot', fontsize=20, fontname='Times New Roman')
plt.xlabel('Counting', color='gray')
plt.ylabel('Square values',color='gray')
plt.text(1,1.5,'First')
plt.text(2,4.5,'Second')
plt.text(3,9.5,'Third')
plt.text(4,16.5,'Fourth')
plt.text(1.1,12,r'$y = x^2$', fontsize=20, bbox={'facecolor':'yellow','alpha':0.2})  
plt.grid(True)
plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.plot([1,2,3,4],[0.8,3.5,8,15],'g^')
plt.plot([1,2,3,4],[0.5,2.5,4,12],'b*')
plt.legend(['First series','Second series','Third series'], loc=2)
plt.show()

Легенда необходима в каждом мультиграфике

Сохранение графиков

В этом разделе разберемся, как сохранять график разными способами. Если в будущем потребуется использовать график в разных Notebook или сессиях Python, то лучший способ — сохранять графики в виде кода Python. С другой стороны, если они нужны в отчетах или презентациях, то подойдет сохранение в виде изображения. Можно даже сохранить график в виде HTML-страницы, что пригодится при работе в интернете.

Сохранение кода

Как уже стало понятно, объем кода, отвечающего за представление одного графика, постоянно растет. Когда финальный результат удовлетворяет, его можно сохранить в файле .py, который затем вызывается в любой момент.

Также можно использовать команду %save [имя файла] [количество строк кода], чтобы явно указать, сколько строк нужно сохранить. Если весь код написан одним запросом, тогда нужно добавить лишь номер его строки. Если же использовалось несколько команд, например, от 10 до 20, то эти числа и нужно записать, разделив их дефисом (10-20).

В этом примере сохранить весь код, отвечающий за формирование графика, можно с помощью ввода со строки 171.

In [171]: import matplotlib.pyplot as plt

Такую команду потребуется ввести для сохранения в файл .py.

%save my_first_chart 171

После запуска команды файл my_first_chart.py окажется в рабочей директории.

# %load my_first_chart.py
plt.axis([0,5,0,20])
plt.title('My first plot', fontsize=20, fontname='Times New Roman')
plt.xlabel('Counting', color='gray')
plt.ylabel('Square values',color='gray')
plt.text(1,1.5,'First')
plt.text(2,4.5,'Second')
plt.text(3,9.5,'Third')
plt.text(4,16.5,'Fourth')
plt.text(1.1,12,r'$y = x^2$', fontsize=20, bbox={'facecolor':'yellow','alpha':0.2})  
plt.grid(True)
plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.plot([1,2,3,4],[0.8,3.5,8,15],'g^')
plt.plot([1,2,3,4],[0.5,2.5,4,12],'b*')
plt.legend(['First series','Second series','Third series'], loc=2)
plt.show()

Позже, когда вы откроете сессию IPython, у вас уже будет готовый график и его можно редактировать с момента сохранения этой командой:

ipython qtconsole --matplotlib inline -m my_first_chart.py

Либо его можно загрузить заново в один запрос в QtConsole с помощью команды %load.

%load my_first_chart.py

Или запустить в уже активной сессии с помощью %run.

%run my_first_chart.py

в определенных случаях последняя команда будет работать только после ввода двух предыдущих.

Сохранение сессии в HTML-файл

С помощью IPython QtConsole вы можете конвертировать весь код и графику, представленные в текущей сессии, в одну HTML-страницу. Просто выберите File → Save to HTML/XHTML в верхнем меню.

Будет предложено сохранить сессию в одном из двух форматов: HTML и XHTML. Разница между ними заключается в типе сжатия изображения. Если выбрать HTML, то все картинки конвертируются в PNG. В случае с XHTML будет выбран формат SVG.

В этом примере сохраним сессию в формате HTML в файле my_session.html.

Дальше программа спросит, сохранить ли изображения во внешней директории или прямо в тексте. В первом случае все картинки будут храниться в папке my_session_files, а во втором — будут встроены в HTML-код.

Сохранение графика в виде изображения

График можно сохранить и виде файла-изображения, забыв обо всем написанном коде. Для этого используется функция savefig(). В аргументы нужно передать желаемое название будущего файла. Также важно, чтобы эта команда шла в конце, после всех остальных (иначе сохранится пустой PNG-файл).

plt.axis([0,5,0,20])
plt.title('My first plot', fontsize=20, fontname='Times New Roman')
plt.xlabel('Counting', color='gray')
plt.ylabel('Square values',color='gray')
plt.text(1,1.5,'First')
plt.text(2,4.5,'Second')
plt.text(3,9.5,'Third')
plt.text(4,16.5,'Fourth')
plt.text(1.1,12,r'$y = x^2$', fontsize=20, bbox={'facecolor':'yellow','alpha':0.2})  
plt.grid(True)
plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.plot([1,2,3,4],[0.8,3.5,8,15],'g^')
plt.plot([1,2,3,4],[0.5,2.5,4,12],'b*')
plt.legend(['First series','Second series','Third series'], loc=2)
plt.savefig('my_chart.png')

Файл появится в рабочей директории. Он будет называться my_chart.png и включать изображение графика.

Обработка значений дат

Одна из основных проблем при анализе данных — обработка значений дат. Отображение даты по оси (обычно это ось x) часто становится проблемой.

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

import datetime
import numpy as np
import matplotlib.pyplot as plt

events = [datetime.date(2015,1,23), 
          datetime.date(2015,1,28),
          datetime.date(2015,2,3),
          datetime.date(2015,2,21),
          datetime.date(2015,3,15),
          datetime.date(2015,3,24),
          datetime.date(2015,4,8),
          datetime.date(2015,4,24)]
readings = [12,22,25,20,18,15,17,14]
plt.plot(events,readings)
plt.show()

отображение значений даты и времени может быть проблематичным

Автоматическая расстановка отметок в этом случае — настоящая катастрофа. Даты сложно читать, ведь между ними нет интервалов, и они наслаиваются друг на друга.

Для управления датами нужно определить временную шкалу. Сперва необходимо импортировать matplotlib.dates — модуль, предназначенный для работы с этим типом дат. Затем указываются шкалы для дней и месяцев с помощью MonthLocator() и DayLocator(). В этом случае форматирование играет важную роль, и чтобы не получить наслоение текста, нужно ограничить количество отметок, оставив только год-месяц. Такой формат передается в качестве аргумента функции DateFormatter().

Когда шкалы определены (один — для дней, второй — для месяцев) можно определить два вида пометок на оси x с помощью set_major_locator() и set_minor_locator() для объекта xaxis. Для определения формата текста отметок месяцев используется set_major_formatter.

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

import matplotlib.dates as mdates

months = mdates.MonthLocator()
days = mdates.DayLocator()
timeFmt = mdates.DateFormatter('%Y-%m')
events = [datetime.date(2015,1,23), 
          datetime.date(2015,1,28),
          datetime.date(2015,2,3),
          datetime.date(2015,2,21),
          datetime.date(2015,3,15),
          datetime.date(2015,3,24),
          datetime.date(2015,4,8),
          datetime.date(2015,4,24)]
readings = [12,22,25,20,18,15,17,14]
fig, ax = plt.subplots()
plt.plot(events, readings)
ax.xaxis.set_major_locator(months)
ax.xaxis.set_major_formatter(timeFmt)
ax.xaxis.set_minor_locator(days)
plt.show()

отображение значений даты более читабельно

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    Prerequisites: Matplotlib

    Matplotlib and its constituents support a lot of functionality. One such functionality is that we can draw a line or a point on an image using Matplotlib in python.

    Approach

    • Import modules
    • Read the image
    • Plot the line or point on the image
    • Display the plot/image.

    Image Used:

    Implementation using the above approach on the given image is provided below:

    Example 1 : Drawing a point on the image.

    Attribute used: marker

    It is used to define what marker type should the point be displayed in.

    Python3

    from matplotlib import image

    from matplotlib import pyplot as plt

    data = image.imread('sunset-1404452-640x480.jpg')

    plt.plot(200, 350, marker='v', color="white")

    plt.imshow(data)

    plt.show()

    Output:

    Example 2 : Draw a line on the image

    To draw a line we will give the co-ordinates of two points in the plot function.

    Attribute used: linewidth

    Used to specify the width of the line.

    Python3

    from matplotlib import image

    from matplotlib import pyplot as plt

    data = image.imread('sunset-1404452-640x480.jpg')

    x = [200, 500]

    y = [300, 100]

    plt.plot(x, y, color="white", linewidth=3)

    plt.imshow(data)

    plt.show()

    Output: 

    Example 3 : Draw two intersecting lines crossing each other to make X.

    Python3

    from matplotlib import image

    from matplotlib import pyplot as plt

    data = image.imread('sunset-1404452-640x480.jpg')

    x1 = [100, 500]

    y1 = [400, 100]

    x2 = [150, 450]

    y2 = [100, 400]

    plt.plot(x1, y1, x2, y2, color="white", linewidth=3)

    plt.axis('off')

    plt.imshow(data)

    plt.show()

    Output : 

    Last Updated :
    17 Dec, 2020

    Like Article

    Save Article

    In this Python tutorial, we will discuss a scatter plot with a marker using matplotlib in python. And we will also cover the following topics:

    • Matplotlib scatter marker
    • Matplotlib scatter marker how to plot
    • Matplotlib scatter marker example
    • Matplotlib scatter marker multiple plot
    • Matplotlib scatter marker color
    • Matplotlib scatter marker different color for each marker
    • Matplotlib scatter maker size
    • Matplotlib scatter marker different size for each marker
    • Matplotlib scatter marker style
    • Matplotlib scatter marker different style for each marker
    • Matplotlib scatter marker colormap
    • Matplotlib scatter marker outline
    • Matplotlib scatter marker text
    • Matplotlib scatter marker color by value or category
    • Matplotlib scatter marker transparent
    • Matplotlib provides a pyplot module for data visualization.
    • Under the pyplot module, we have a scatter() function to plot a scatter graph.
    • Basically, the scatter() method draws one dot for each observation.
    • In matplotlib, plotted points are known as “markers“.
    • So that’s why it is called as scatter marker.

    Matplotlib scatter marker how to plot

    • scatter() method is used to draw a scatter plot.
    • It takes the data in the form of arrays.
    • It takes values in two arrays of the same length one for the x-axis and the other for the y-axis.

    The following steps are used to create a matplotlib scatter marker which is outlined below:

    • Defining Libraries: Import the important libraries which are required for the creation of the scatter marker ( For visualization: pyplot from matplotlib, For data creation and manipulation: NumPy).
    • Define X and Y: Define the data values on X-axis and Y-axis. It takes data values in the form of an array. Both the are must be of the same size.
    • Plot a scatter: By using the scatter() method we can plot a graph.
    • Display: At last display the plot by using the show() function.

    The syntax to create a matplotlib scatter marker chart is as below:

    matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, ....)

    The above-used parameters are outlined as below:

    • x: specify data position on the x-axis.
    • y: specify data position on the y-axis.
    • s: specify the marker size.
    • c: specify the color of dots.
    • marker: specify the kind of marker.

    Matplotlib scatter marker example

    In the above sections, we discussed what a scatter marker graph exactly means. And we have also discussed what are the various steps used to create or plot a matplotlib scatter marker. Now, let’s see how to plot a scatter marker using matplotlib.

    Let’s understand the concept with the help of an example as below:

    # Import Libraries
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Define Data
    
    x = np.array([5,7,8,7,2])
    y = np.array([99,103,87,94,78])
    
    # Plot a scatter marker
    
    plt.scatter(x, y)
    
    # Display a graph
    
    plt.show()
    • In the above, example we import the matplotlib.pyplot and numpy library.
    • Then we define the X-axis and Y-axis points in the array form.
    • plt.scatter() method is used to draw a points for each data points.
    • Then we finally use the method plt.show() to display the plotted graph.
    Matplotlib scatter marker example
    Matplotlib scatter marker

    Read: How to install matplotlib python

    Matplotlib scatter marker multiple plot

    What happens if we want to draw multiple scatter markers plot in the same figure.

    Let’s understand the concept with the help of an example:

    # Import Libraries
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Plot data 
    
    x = np.array([5,7,8,7])
    y = np.array([78,77,85,86])
    plt.scatter(x, y)
    
    # Plot data
    
    x = np.array([4,7,14,12])
    y = np.array([100,105,84,105])
    plt.scatter(x, y)
    
    # Display Graph
    
    plt.show()
    • In the above example, we conclude that when we plot two different data, the plots were plotted with two different colors.
    • By default scatter markers are of blue and orange color.
    Matplotlib scatter marker multiple plot in the same figure
    plt.scatter()

    Matplotlib scatter marker color

    We can set the color of our choice for each scatter’s plot.

    The syntax to change the color is as given below:

    matplotlib.pyplot.scatter(x, y, color=None)

    The parameter of the given syntax is outlined below:

    • x: specify data position on the x-axis.
    • y: specify data position on the y-axis.
    • color: To set the color of your choice. Shorthand for color is ‘c‘.

    Result: All the markers are of the same color.

    Let’s understand the concept with the help of an example:

    # Import Libraries
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Define Data
    
    x = np.array([5,7,8,7,2])
    y = np.array([99,103,87,94,78])
    
    # Plot a scatter marker
    
    plt.scatter(x, y, color='red')
    
                           #OR
    
    plt.scatter(x, y, c='cyan')
    
    
    # Display a graph
    
    plt.show()
    • In the above, example we import the matplotlib.pyplot and numpy library.
    • Then we define the X-axis and Y-axis points in the array form.
    • plt.scatter() method is used to draw points for each data point and we pass an argument color to set the color of the plot.
    • Then we finally use the method plt.show() to display the plotted graph.
    Matplotlib scatter marker color
    plt.scatter() “Output of case1”
    Matplotlib scatter marker having color
    plt.scatter() “Output of case2”

    Read: Matplotlib plot a line

    Matplotlib scatter marker different color for each marker

    • If we want to set a different color for each dot or marker we have to define an array consist of colors as values.
    • Both the array must be of the same size i.e the color one’s or values one’s.

    The syntax for setting different colors for each marker is given below:

    matplotlib.pyplot.scatter(x,y,c=None)

    The parameter of the given syntax is outlined below:

    • x: specifies the position of data on the x-axis.
    • y: specifies the position of data on the y-axis.
    • c: To set the different colors for each dot.

    Result: All the markers are of different colors.

    Note: For setting different colors for each dot pass ‘c‘ as an argument or color argument.

    Let’s understand the concept with the help of an example:

    # Import Libraries
    
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Define Data
    
    x = np.array([5, 7, 8, 7, 2, 6, 12, 3, 5, 63, 22, 69])
    y = np.array([10, 15, 12, 11, 63, 45, 56, 36, 56, 99, 21, 23])
    colors_set = np.array(["orange","purple","beige","brown","gray","cyan","magenta","red","green","blue","yellow","pink"])
    
    # Plot a scatter marker
    
    plt.scatter(x, y, c=colors_set)
    
    # Display a graph
    
    plt.show()
    • In the above, example we import the matplotlib.pyplot and numpy library. Then we define the X-axis and Y-axis points in the array form.
    • plt.scatter() method is used to draw points for each data point and we pass an argument ‘c’ to set the different color for each dot. Then we finally use the method plt.show() to display the plotted graph
    Matplotlib scatter marker different color for each dot or marker, Matplotlib scatter color by value
    plt.scatter()

    Read: Python plot multiple lines using Matplotlib

    Matplotlib scatter marker size

    If we want to set the size of the marker according to our choice. We have to pass the argument ‘s‘.

    We can easily increase or decrease the size of the marker according to needs.

    The syntax to change the size of the marker is given below:

    matplotlib.pyplot.scatter(x, y, s=None)

    The parameter of the given syntax is outlined below:

    • x: specifies the position of data on the x-axis.
    • y: specifies the position of data on the y-axis.
    • s: To set the size of the marker.

    Result: All the markers are of the same size.

    Let’s understand the concept with the help of an example given below:

    # Import Libraries
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Define Data
    
    
    x = np.array([99,86,88,111,103,87,94,78,77,85,86])
    y = np.array([20,50,200,500,1000,60,90,10,300,600,800])
    
    # Define scatter() function
    
    plt.scatter(x, y, s=115)
    
    # Display the graph
    
    plt.show()
    • In the above, example we import the matplotlib.pyplot and numpy library.
    • Then we define the X-axis and Y-axis points in the array form.
    • plt.scatter() method is used to draw points for each data point and we pass an argument ‘s’ to set the size of the marker.
    • Then we finally use the method plt.show() to display the plotted graph.
    Matplotlib scatter marker size
    Matplotlib scatter marker size

    Read: What is matplotlib inline

    Matplotlib scatter marker different sizes for each marker

    When we want to modify the size of each marker. We have to pass the argument ‘s‘ to the method.

    This function increase or decrease the size of each marker.

    The syntax for the setting the size of each marker is given below:

    matplotlib.pyplot.scatter(x, y, s=None)

    The parameter of the given syntax is outlined below:

    • x: specifies the position of data on the x-axis.
    • y: specifies the position of data on the y-axis.
    • s: To set thediiferent sizes for each marker. The default size is rcParams[‘lines.markersize’]**2

    Result: Each marker is of a different size.

    Let’s understand the concept with the help of an example given below:

    # Import Libraries
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Define Data
    
    x = np.array([99,86,88,111,103,87,94,78,77,85,86])
    y = np.array([20,50,200,500,1000,60,90,10,300,600,800])
    
    # Define scatter() function
    
    sizes = (np.random.sample(size=x.size) * 75) ** 2
    plt.scatter(x, y, s=sizes)
    
    # Display the graph
    
    plt.show()
    • In the above, example we import the matplotlib.pyplot and numpy library.
    • Then we define the x-axis and y-axis points in the array form.
    • plt.scatter() method is used to draw a marker for each data point. To change the size of each marker we have to pass the argument ‘s’ to the function.
    • Then, we finally use the method plt.show() to display the plotted graph.
    Matplotlib scatter marker different sizes for each marker
    plt.scatter()

    Read: Matplotlib plot bar chart

    Mtplotlib scatter marker style

    The programmer can customize the style or shape of the marker. Matplotlib provides the feature to change the marker style.

    By using the parameter ‘marker‘, we can change the style or shape of the markers whenever we want.

    Some common types of marker style:

    Marker Description
    ‘.’ Point
    ‘o’ Circle
    ‘+’ Plus
    ‘>’ Triangle Right
    ‘<‘ Triangle Left
    ‘s’ Square
    ‘x’ X
    Different Markers

    The syntax to change the style of the marker is given below:

    matplotlib.pyplot.scatter(x, y, marker=None)

    The parameter of the given syntax is outlined below:

    • x: specifies the position of data on the x-axis.
    • y: specifies the position of data on the y-axis.
    • marker: To set the diiferent style of the marker. By default the style is Circle.

    Result: Markers of different styles.

    Let’s discuss the above concept with the help of an example:

    # Import Libraries
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Define Data
    
    x = np.array([99,86,88,111,103,87,94,78,77,85,86])
    y = np.array([20,50,200,500,1000,60,90,10,300,600,800])
    
    # Define scatter() function
    
    
    plt.scatter(x, y, marker='>', s = 65)
    
                         #OR
    
    plt.scatter(x, y, marker='s', s = 165)
    
    
    # Display the graph
    
    plt.show()
    • In the above example, we import the matplotlib.pyplot and numpy library.
    • Then we define the x-axis and y-axis points in the form of an array.
    • plt.scatter() method is used to draw markers for each data point and we pass the parameter ‘marker’ to set the style of the marker.
    • Then we finally use the method plt.show() to display the plotted graph.
    Mtplotlib scatter marker style
    plt.scatter() “Output of Case1”
    Mtplotlib scatter marker having style
    plt.scatter() “Output of Case2”

    Read: Matplotlib subplot tutorial

    Matplotlib scatter marker different style for each marker

    To differentiate between different groups of data, we have to use different styles of markers. There is no way to define multiple marker styles in a single call to scatter() method.

    So, to use different markers styles for different groups’ data we have to scatter() method each time.

    The syntax to change the style of each marker:

    matplotlib.pyplot.scatter(x, y, marker=None) // Call each time

    The parameter of the given syntax is outlined below:

    • x: specifies the position of data on the x-axis.
    • y: specifies the position of data on the y-axis.
    • marker: To set the diiferent style of the each marker. Call the function every time.

    Result: Return marker with a different style to easily distinguish between different groups of data.

    Let’s understand the concept with the help of an example:

    # Import Libraries
    
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Define Data
    
    x = np.array([10, 20, 30, 15, 25, 13, 8, 2])
    y1 = np.array([1, 6, 8, 12, 25, 15, 10, 7.5])
    y2= np.array([6.5, 3.2, 16, 15, 19, 23, 18.6, 29])
    
    # Define scatter() function
    
    plt.scatter(x, y1, marker='s', s = 265)
    plt.scatter(x, y2, marker='d', s = 265)
    
    # Display the graph
    
    plt.show()
    • In the above example, we import the matplotlib.pyplot and numpy library.
    • Then we dine the x-axis and y-axis points in the form of an array.
    • plt.scatter() method is used to draw markers for each data point and we pass the parameter ‘marker’ to set the style of the marker. To set each marker of a different style you have to call the scatter() method each time.
    • Then we finally use the method plt.show() to display the plotted graph.
    Matplotlib scatter marker different style for each marker
    plt.scatter()

    Read: Matplotlib subplots_adjust

    Matplotlib scatter marker colormap

    Sometimes, we have to plot the data which depends upon some other data. In such cases, we use color maps.

    If you want to include a colormap strip in the graph area use the function plt.colorbar()

    The syntax for this is given below:

    matplotlib.pyplot.scatter(x, y, c=None, cmap=None) 
    matplotlib.pyplot.colorbar()

    The parameter of the given syntax is outlined below:

    • x: specifies the position of data on the x-axis.
    • y: specifies the position of data on the y-axis.
    • c: specifies the array of colors. It ranges from 0 to 100.
    • cmap: specifies the colour map.

    Let’s understand the concept with the help of an example:

    # Import Libraries
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Define Data
    
    x = np.array([99,86,88,111,103,87,94,78,77,85,86,23,15])
    y = np.array([20,50,200,500,1000,60,90,10,300,600,800,65,12])
    colors = np.array([0, 10, 20, 30, 40, 45, 50, 55, 60, 70, 80, 90, 100])
    
    # Define scatter() function
    
    
    plt.scatter(x, y, c=colors, cmap= 'PiYG')
    
                       #Or
    
    
    plt.scatter(x, y, c=colors, cmap= 'Dark2')
    
    plt.colorbar()
    
    
    # Display the graph
    
    plt.show()
    • In the above example, we import the matplotlib.pyplot and numpy library.
    • Then we dine the x-axis and y-axis points in the form of an array.
    • plt.scatter() method is used to draw markers for each data point and we pass the parameter ‘cmap’ to set the color map.
    • plt.colorbar() method is used to show the color strip in the plot.
    • Then we finally use the method plt.show() to display the plotted graph.
    Matplotlib scatter marker colormap
    plt.scatter() “Output of case1”
    Matplotlib scatter marker having colormap
    plt.colorbar() “Output of case2”

    Read: Matplotlib log log plot

    Matplotlib scatter marker outline

    We can change the outline of each marker by changing its edge colors. Basically, it creates the outline around the markers with a specific color.

    The syntax for this is given below:

    matplotlib.pyplot.scatter(x, y, c=None, s=None, edgecolors=None, cmap=None)

    The parameter of the given syntax is outlined below:

    • x: specifies the position of data on the x-axis.
    • y: specifies the position of data on the y-axis.
    • c: specifies the array of colors. It ranges from 0 to 100.
    • s: specifies the size of the marker
    • edgecolors: to set the edge color of the marker
    • cmap: specifies the colour map.

    Let’s understand the concept with the help of an example:

    # Import Libraries
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Define Data
    
    x = np.array([99,86,88,111,103,87,94,78,77,85,86,23,15])
    y = np.array([20,50,200,500,1000,60,90,10,300,600,800,65,12])
    colors = np.array([0, 10, 20, 30, 40, 45, 50, 55, 60, 70, 80, 90, 100])
    
    # Define scatter() function
    
    plt.scatter(x, y, c=colors, edgecolors= 'k', s= 120, cmap= 'Dark2')
    plt.colorbar()
    
    
    # Display the graph
    
    plt.show()
    • In the above example, we import the matplotlib.pyplot and numpy library.
    • Then we dine the x-axis and y-axis points in the form of an array.
    • plt.scatter() method is used to draw markers for each data point and we pass the parameter ‘edgecolors’ to set the color of markers edges. Here we set edhe color to black.
    • plt.colorbar() method is used to show the color strip in the plot.
    • Then we finally use the method plt.show() to display the plotted graph.
    Matplotlib scatter marker outline
    plt.scatter()

    Read: Matplotlib plot_date

    Matplotlib scatter marker text

    When we want to place a text next to the scatter in matplotlib this process is known as Annotation.

    There are two types of Annotation depends upon the number of scatter points we want to annotate.

    Types of Annotation are as follow:

    • Single point Annotation
    • Multiple point Annotation

    Matplotlib scatter marker text – single point annotation

    In single-point annotation, we can place text at a specific point.

    When can use plt.text() method to mention the text.

    The syntax for single point annotation is given below:

    matplotlib.plot.text(x, y, s)

    The parameter of the given syntax is outlined below:

    • x: specifies x-axis point to place the text.
    • y: specifies y-axis point to place the text.
    • s: specifies the text.

    Let’s understand the concept with the help of an example:

    # Import Libraries
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Define Data
    
    
    x = np.array([99,86,88,111,103,87,94,78,77,85,86])
    y = np.array([20,50,200,500,1000,60,90,10,300,600,800])
    
    # Define scatter() function
    
    plt.scatter(x, y)
    
    # Annotate the point
    
    plt.text(99,20, 'Point 1')
    
    # Display the graph
    
    plt.show()
    • In the above example, we import the matplotlib.pyplot and numpy library.
    • Then we dine the x-axis and y-axis points in the form of an array.
    • plt.scatter() method is used to draw markers for each data point.
    • plt.text() method is used to annotate the single point.
    • Then we finally use the method plt.show() to display the plotted graph.
    Matplotlib scatter marker text
    plt.text()

    Matplotlib scatter marker text – all points annotation

    If we want to annotate all points in the scatter plot, we have annotate() method in matplotlib.

    The syntax for this is given below:

    matplotlib.pyplot.annotate(text, (xy))

    The parameter of the given syntax is outlined below:

    • text: specifies the text for annotation.
    • xy: specifies points to be annotated.

    Let’s understand the concept with the help of an example:

    # Import Libraries
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Define Data
    
    x = [x for x in range(5)]
    y = np.array([20,50,200,500,1000])
    text = ["first", "second", "third", "fourth", "fifth"]
    
    # Define scatter() function
    
    plt.scatter(x, y)
    
    # Annotate the point
    
    for i in range(len(x)):
        plt.annotate(text[i], (x[i], y[i] + 0.2))
    
    # Display the graph
    
    plt.show()
    • In the above example, we import the matplotlib.pyplot and numpy library.
    • Then we dine the x-axis and y-axis points in the form of an array.
    • plt.scatter() method is used to draw markers for each data point.
    • plt.annotate() method is used to annotate the single point.
    • Then we finally use the method plt.show() to display the plotted graph.
    Matplotlib scatter marker having text
    plt.annotate()

    Read: Matplotlib dashed line

    Matplotlib scatter marker color by value or category

    In this section, we are going to learn how to color the data points or scatter markers by value or category.

    For grouping use ‘groupby‘ clause.

    Let’s understand the concept with the help of an example:

    # Import Libraries
    
    import pandas as pd
    import matplotlib.pyplot as plt
    
    #create DataFrame
    
    df = pd.DataFrame({'x': [10, 12, 13, 14, 19, 23, 25, 30],
                       'y': [5, 7, 7, 9, 12, 9, 9, 4],
                       'z': ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C']})
    
    #view DataFrame
    
    df
    
    #groupby category
    
    groups = df.groupby('z')
    for name, group in groups:
        plt.scatter(group.x, group.y, label=name)
    
    # Display the graph
    
    plt.legend()
    plt.show()
    • In the above example, we import the matplotlib.pyplot and pandas library.
    • Then we create a data frame and define the x-axis and y-axis points in the form of an array.
    • plt.scatter() method is used to draw markers for each data point.
    • groupby clause for dividing into groups
    • Then we finally use the method plt.show() to display the plotted graph.

    Read: Matplotlib plot error bars

    Matplotlib scatter marker transparent

    When we want to check the density of data plotted and due to lots of overlapping we are not able to see, at that time we need transparency.

    The alpha argument is used to make the scatter marker transparent.

    alpha parameter removes the outlines of the scatter.

    The syntax for transparency is given below:

    matplotlib.pyplot.scatter(x, y, alpha=None)

    The parameter of the given syntax is outlined below:

    • x: specifies the data point on the x-axis.
    • y: specifies the data point on the y-axis.
    • alpha: set the transparency value. By default value is 1 i.e. no transparency.

    Let’s understand the concept with the help of an example:

    # Import Libraries
    
    import matplotlib.pyplot as plt
    import numpy as np
    
    # Define Data
    
    
    x = np.array([99,86,88,111,103,87,94,78,77,85,86])
    y = np.array([20,50,200,500,1000,60,90,10,300,600,800])
    
    # Define scatter() function
    
    sizes = (np.random.sample(size=x.size) * 75) ** 2
    plt.scatter(x, y, s=sizes, alpha=0.3, c='red')
    
    # Display the graph
    
    plt.show()
    • In the above example, we import the matplotlib.pyplot and pandas library.
    • Then we dine the x-axis and y-axis points in the form of an array.
    • plt.scatter() method is used to draw markers for each data poit and pass the argument ‘alpha‘ to set the transparency. We set alpha =0.3
    • Then we finally use the method plt.show() to display the plotted graph.
    Matplotlib scatter marker transparent
    plt.scatter()

    Also, take a look at some more articles:

    • Matplotlib save as png
    • Draw vertical line matplotlib
    • Put legend outside plot matplotlib

    In this Python tutorial, we have discussed the “Matplotlib scatter marker” and we have also covered some examples related to it. There are the following topics that we have discussed in this tutorial.

    • Matplotlib scatter marker
    • Matplotlib scatter marker how to plot
    • Matplotlib scatter marker example
    • Matplotlib scatter marker multiple plot
    • Matplotlib scatter marker color
    • Matplotlib scatter marker different color for each marker
    • Matplotlib scatter maker size
    • Matplotlib scatter marker different size for each marker
    • Matplotlib scatter marker style
    • Matplotlib scatter marker different style for each marker
    • Matplotlib scatter marker colormap
    • Matplotlib scatter marker outline
    • Matplotlib scatter marker text
    • Matplotlib scatter marker color by value or category
    • Matplotlib scatter marker transparent

    Bijay Kumar MVP

    Python is one of the most popular languages in the United States of America. I have been working with Python for a long time and I have expertise in working with various libraries on Tkinter, Pandas, NumPy, Turtle, Django, Matplotlib, Tensorflow, Scipy, Scikit-Learn, etc… I have experience in working with various clients in countries like United States, Canada, United Kingdom, Australia, New Zealand, etc. Check out my profile.

    Watch Now This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Using plt.scatter() to Visualize Data in Python

    An important part of working with data is being able to visualize it. Python has several third-party modules you can use for data visualization. One of the most popular modules is Matplotlib and its submodule pyplot, often referred to using the alias plt. Matplotlib provides a very versatile tool called plt.scatter() that allows you to create both basic and more complex scatter plots.

    Below, you’ll walk through several examples that will show you how to use the function effectively.

    In this tutorial you’ll learn how to:

    • Create a scatter plot using plt.scatter()
    • Use the required and optional input parameters
    • Customize scatter plots for basic and more advanced plots
    • Represent more than two dimensions on a scatter plot

    To get the most out of this tutorial, you should be familiar with the fundamentals of Python programming and the basics of NumPy and its ndarray object. You don’t need to be familiar with Matplotlib to follow this tutorial, but if you’d like to learn more about the module, then check out Python Plotting With Matplotlib (Guide).

    Creating Scatter Plots

    A scatter plot is a visual representation of how two variables relate to each other. You can use scatter plots to explore the relationship between two variables, for example by looking for any correlation between them.

    In this section of the tutorial, you’ll become familiar with creating basic scatter plots using Matplotlib. In later sections, you’ll learn how to further customize your plots to represent more complex data using more than two dimensions.

    Getting Started With plt.scatter()

    Before you can start working with plt.scatter() , you’ll need to install Matplotlib. You can do so using Python’s standard package manger, pip, by running the following command in the console :

    $ python -m pip install matplotlib
    

    Now that you have Matplotlib installed, consider the following use case. A café sells six different types of bottled orange drinks. The owner wants to understand the relationship between the price of the drinks and how many of each one he sells, so he keeps track of how many of each drink he sells every day. You can visualize this relationship as follows:

    import matplotlib.pyplot as plt
    
    price = [2.50, 1.23, 4.02, 3.25, 5.00, 4.40]
    sales_per_day = [34, 62, 49, 22, 13, 19]
    
    plt.scatter(price, sales_per_day)
    plt.show()
    

    In this Python script, you import the pyplot submodule from Matplotlib using the alias plt. This alias is generally used by convention to shorten the module and submodule names. You then create lists with the price and average sales per day for each of the six orange drinks sold.

    Finally, you create the scatter plot by using plt.scatter() with the two variables you wish to compare as input arguments. As you’re using a Python script, you also need to explicitly display the figure by using plt.show().

    When you’re using an interactive environment, such as a console or a Jupyter Notebook, you don’t need to call plt.show(). In this tutorial, all the examples will be in the form of scripts and will include the call to plt.show().

    Here’s the output from this code:

    Scatter Plot Part 1

    This plot shows that, in general, the more expensive a drink is, the fewer items are sold. However, the drink that costs $4.02 is an outlier, which may show that it’s a particularly popular product. When using scatter plots in this way, close inspection can help you explore the relationship between variables. You can then carry out further analysis, whether it’s using linear regression or other techniques.

    Comparing plt.scatter() and plt.plot()

    You can also produce the scatter plot shown above using another function within matplotlib.pyplot. Matplotlib’s plt.plot() is a general-purpose plotting function that will allow you to create various different line or marker plots.

    You can achieve the same scatter plot as the one you obtained in the section above with the following call to plt.plot(), using the same data:

    plt.plot(price, sales_per_day, "o")
    plt.show()
    

    In this case, you had to include the marker "o" as a third argument, as otherwise plt.plot() would plot a line graph. The plot you created with this code is identical to the plot you created earlier with plt.scatter().

    In some instances, for the basic scatter plot you’re plotting in this example, using plt.plot() may be preferable. You can compare the efficiency of the two functions using the timeit module:

    import timeit
    import matplotlib.pyplot as plt
    
    price = [2.50, 1.23, 4.02, 3.25, 5.00, 4.40]
    sales_per_day = [34, 62, 49, 22, 13, 19]
    
    print(
        "plt.scatter()",
        timeit.timeit(
            "plt.scatter(price, sales_per_day)",
            number=1000,
            globals=globals(),
        ),
    )
    print(
        "plt.plot()",
        timeit.timeit(
            "plt.plot(price, sales_per_day, 'o')",
            number=1000,
            globals=globals(),
        ),
    )
    

    The performance will vary on different computers, but when you run this code, you’ll find that plt.plot() is significantly more efficient than plt.scatter(). When running the example above on my system, plt.plot() was over seven times faster.

    If you can create scatter plots using plt.plot(), and it’s also much faster, why should you ever use plt.scatter()? You’ll find the answer in the rest of this tutorial. Most of the customizations and advanced uses you’ll learn about in this tutorial are only possible when using plt.scatter(). Here’s a rule of thumb you can use:

    • If you need a basic scatter plot, use plt.plot(), especially if you want to prioritize performance.
    • If you want to customize your scatter plot by using more advanced plotting features, use plt.scatter().

    In the next section, you’ll start exploring more advanced uses of plt.scatter().

    Customizing Markers in Scatter Plots

    You can visualize more than two variables on a two-dimensional scatter plot by customizing the markers. There are four main features of the markers used in a scatter plot that you can customize with plt.scatter():

    1. Size
    2. Color
    3. Shape
    4. Transparency

    In this section of the tutorial, you’ll learn how to modify all these properties.

    Changing the Size

    Let’s return to the café owner you met earlier in this tutorial. The different orange drinks he sells come from different suppliers and have different profit margins. You can show this additional information in the scatter plot by adjusting the size of the marker. The profit margin is given as a percentage in this example:

    import matplotlib.pyplot as plt
    import numpy as np
    
    price = np.asarray([2.50, 1.23, 4.02, 3.25, 5.00, 4.40])
    sales_per_day = np.asarray([34, 62, 49, 22, 13, 19])
    profit_margin = np.asarray([20, 35, 40, 20, 27.5, 15])
    
    plt.scatter(x=price, y=sales_per_day, s=profit_margin * 10)
    plt.show()
    

    You can notice a few changes from the first example. Instead of lists, you’re now using NumPy arrays. You can use any array-like data structure for the data, and NumPy arrays are commonly used in these types of applications since they enable element-wise operations that are performed efficiently. The NumPy module is a dependency of Matplotlib, which is why you don’t need to install it manually.

    You’ve also used named parameters as input arguments in the function call. The parameters x and y are required, but all other parameters are optional.

    The parameter s denotes the size of the marker. In this example, you use the profit margin as a variable to determine the size of the marker and multiply it by 10 to display the size difference more clearly.

    You can see the scatter plot created by this code below:

    Scatter Plot Part 2

    The size of the marker indicates the profit margin for each product. The two orange drinks that sell most are also the ones that have the highest profit margin. This is good news for the café owner!

    Changing the Color

    Many of the customers of the café like to read the labels carefully, especially to find out the sugar content of the drinks they’re buying. The café owner wants to emphasize his selection of healthy foods in his next marketing campaign, so he categorizes the drinks based on their sugar content and uses a traffic light system to indicate low, medium, or high sugar content for the drinks.

    You can add color to the markers in the scatter plot to show the sugar content of each drink:

    # ...
    
    low = (0, 1, 0)
    medium = (1, 1, 0)
    high = (1, 0, 0)
    
    sugar_content = [low, high, medium, medium, high, low]
    
    plt.scatter(
        x=price,
        y=sales_per_day,
        s=profit_margin * 10,
        c=sugar_content,
    )
    plt.show()
    

    You define the variables low, medium, and high to be tuples, each containing three values that represent the red, green, and blue color components, in that order. These are RGB color values. The tuples for low, medium, and high represent green, yellow, and red, respectively.

    You then defined the variable sugar_content to classify each drink. You use the optional parameter c in the function call to define the color of each marker. Here’s the scatter plot produced by this code:

    Scatter Plot Part 3

    The café owner has already decided to remove the most expensive drink from the menu as this doesn’t sell well and has a high sugar content. Should he also stop stocking the cheapest of the drinks to boost the health credentials of the business, even though it sells well and has a good profit margin?

    Changing the Shape

    The café owner has found this exercise very useful, and he wants to investigate another product. In addition to the orange drinks, you’ll now also plot similar data for the range of cereal bars available in the café:

    import matplotlib.pyplot as plt
    import numpy as np
    
    low = (0, 1, 0)
    medium = (1, 1, 0)
    high = (1, 0, 0)
    
    price_orange = np.asarray([2.50, 1.23, 4.02, 3.25, 5.00, 4.40])
    sales_per_day_orange = np.asarray([34, 62, 49, 22, 13, 19])
    profit_margin_orange = np.asarray([20, 35, 40, 20, 27.5, 15])
    sugar_content_orange = [low, high, medium, medium, high, low]
    
    price_cereal = np.asarray([1.50, 2.50, 1.15, 1.95])
    sales_per_day_cereal = np.asarray([67, 34, 36, 12])
    profit_margin_cereal = np.asarray([20, 42.5, 33.3, 18])
    sugar_content_cereal = [low, high, medium, low]
    
    plt.scatter(
        x=price_orange,
        y=sales_per_day_orange,
        s=profit_margin_orange * 10,
        c=sugar_content_orange,
    )
    plt.scatter(
        x=price_cereal,
        y=sales_per_day_cereal,
        s=profit_margin_cereal * 10,
        c=sugar_content_cereal,
    )
    plt.show()
    

    In this code, you refactor the variable names to take into account that you now have data for two different products. You then plot both scatter plots in a single figure. This gives the following output:

    Scatter Plot Part 4

    Unfortunately, you can no longer figure out which data points belong to the orange drinks and which to the cereal bars. You can change the shape of the marker for one of the scatter plots:

    import matplotlib.pyplot as plt
    import numpy as np
    
    low = (0, 1, 0)
    medium = (1, 1, 0)
    high = (1, 0, 0)
    
    price_orange = np.asarray([2.50, 1.23, 4.02, 3.25, 5.00, 4.40])
    sales_per_day_orange = np.asarray([34, 62, 49, 22, 13, 19])
    profit_margin_orange = np.asarray([20, 35, 40, 20, 27.5, 15])
    sugar_content_orange = [low, high, medium, medium, high, low]
    
    price_cereal = np.asarray([1.50, 2.50, 1.15, 1.95])
    sales_per_day_cereal = np.asarray([67, 34, 36, 12])
    profit_margin_cereal = np.asarray([20, 42.5, 33.3, 18])
    sugar_content_cereal = [low, high, medium, low]
    
    plt.scatter(
        x=price_orange,
        y=sales_per_day_orange,
        s=profit_margin_orange * 10,
        c=sugar_content_orange,
    )
    plt.scatter(
        x=price_cereal,
        y=sales_per_day_cereal,
        s=profit_margin_cereal * 10,
        c=sugar_content_cereal,
        marker="d",
    )
    plt.show()
    

    You keep the default marker shape for the orange drink data. The default marker is "o", which represents a dot. For the cereal bar data, you set the marker shape to "d", which represents a diamond marker. You can find the list of all markers you can use in the documentation page on markers. Here are the two scatter plots superimposed on the same figure:

    Scatter Plot Part 5

    You can now distinguish the data points for the orange drinks from those for the cereal bars. But there is one problem with the last plot you created that you’ll explore in the next section.

    Changing the Transparency

    One of the data points for the orange drinks has disappeared. There should be six orange drinks, but only five round markers can be seen in the figure. One of the cereal bar data points is hiding an orange drink data point.

    You can fix this visualization problem by making the data points partially transparent using the alpha value:

    # ...
    
    plt.scatter(
        x=price_orange,
        y=sales_per_day_orange,
        s=profit_margin_orange * 10,
        c=sugar_content_orange,
        alpha=0.5,
    )
    plt.scatter(
        x=price_cereal,
        y=sales_per_day_cereal,
        s=profit_margin_cereal * 10,
        c=sugar_content_cereal,
        marker="d",
        alpha=0.5,
    )
    
    plt.title("Sales vs Prices for Orange Drinks and Cereal Bars")
    plt.legend(["Orange Drinks", "Cereal Bars"])
    plt.xlabel("Price (Currency Unit)")
    plt.ylabel("Average weekly sales")
    plt.text(
        3.2,
        55,
        "Size of marker = profit marginn" "Color of marker = sugar content",
    )
    
    plt.show()
    

    You’ve set the alpha value of both sets of markers to 0.5, which means they’re semitransparent. You can now see all the data points in this plot, including those that coincide:

    Scatter Plot Part 6

    You’ve also added a title and other labels to the plot to complete the figure with more information about what’s being displayed.

    Customizing the Colormap and Style

    In the scatter plots you’ve created so far, you’ve used three colors to represent low, medium, or high sugar content for the drinks and cereal bars. You’ll now change this so that the color directly represents the actual sugar content of the items.

    You first need to refactor the variables sugar_content_orange and sugar_content_cereal so that they represent the sugar content value rather than just the RGB color values:

    sugar_content_orange = [15, 35, 22, 27, 38, 14]
    sugar_content_cereal = [21, 49, 29, 24]
    

    These are now lists containing the percentage of the daily recommended amount of sugar in each item. The rest of the code remains the same, but you can now choose the colormap to use. This maps values to colors:

    # ...
    
    plt.scatter(
        x=price_orange,
        y=sales_per_day_orange,
        s=profit_margin_orange * 10,
        c=sugar_content_orange,
        cmap="jet",
        alpha=0.5,
    )
    plt.scatter(
        x=price_cereal,
        y=sales_per_day_cereal,
        s=profit_margin_cereal * 10,
        c=sugar_content_cereal,
        cmap="jet",
        marker="d",
        alpha=0.5,
    )
    
    plt.title("Sales vs Prices for Orange Drinks and Cereal Bars")
    plt.legend(["Orange Drinks", "Cereal Bars"])
    plt.xlabel("Price (Currency Unit)")
    plt.ylabel("Average weekly sales")
    plt.text(
        2.7,
        55,
        "Size of marker = profit marginn" "Color of marker = sugar content",
    )
    plt.colorbar()
    
    plt.show()
    

    The color of the markers is now based on a continuous scale, and you’ve also displayed the colorbar that acts as a legend for the color of the markers. Here’s the resulting scatter plot:

    Scatter Plot Part 7

    All the plots you’ve plotted so far have been displayed in the native Matplotlib style. You can change this style by using one of several options. You can display the available styles using the following command:

    >>>

    >>> plt.style.available
    [
        "Solarize_Light2",
        "_classic_test_patch",
        "bmh",
        "classic",
        "dark_background",
        "fast",
        "fivethirtyeight",
        "ggplot",
        "grayscale",
        "seaborn",
        "seaborn-bright",
        "seaborn-colorblind",
        "seaborn-dark",
        "seaborn-dark-palette",
        "seaborn-darkgrid",
        "seaborn-deep",
        "seaborn-muted",
        "seaborn-notebook",
        "seaborn-paper",
        "seaborn-pastel",
        "seaborn-poster",
        "seaborn-talk",
        "seaborn-ticks",
        "seaborn-white",
        "seaborn-whitegrid",
        "tableau-colorblind10",
    ]
    

    You can now change the plot style when using Matplotlib by using the following function call before calling plt.scatter():

    import matplotlib.pyplot as plt
    import numpy as np
    
    plt.style.use("seaborn")
    
    # ...
    

    This changes the style to that of Seaborn, another third-party visualization package. You can see the different style by plotting the final scatter plot you displayed above using the Seaborn style:

    Scatter Plot using seaborn style in matplotlib

    You can read more about customizing plots in Matplotlib, and there are also further tutorials on the Matplotlib documentation pages.

    Using plt.scatter() to create scatter plots enables you to display more than two variables. Here are the variables being represented in this example:

    Variable Represented by
    Price X-axis
    Average number sold Y-axis
    Profit margin Marker size
    Product type Marker shape
    Sugar content Marker color

    The ability to represent more than two variables makes plt.scatter() a very powerful and versatile tool.

    Exploring plt.scatter() Further

    plt.scatter() offers even more flexibility in customizing scatter plots. In this section, you’ll explore how to mask data using NumPy arrays and scatter plots through an example. In this example, you’ll generate random data points and then separate them into two distinct regions within the same scatter plot.

    A commuter who’s keen on collecting data has collated the arrival times for buses at her local bus stop over a six-month period. The timetabled arrival times are at 15 minutes and 45 minutes past the hour, but she noticed that the true arrival times follow a normal distribution around these times:

    Scatter Plot Part 8

    This plot shows the relative likelihood of a bus arriving at each minute within an hour. This probability distribution can be represented using NumPy and np.linspace():

    import matplotlib.pyplot as plt
    import numpy as np
    
    mean = 15, 45
    sd = 5, 7
    
    x = np.linspace(0, 59, 60)  # Represents each minute within the hour
    first_distribution = np.exp(-0.5 * ((x - mean[0]) / sd[0]) ** 2)
    second_distribution = 0.9 * np.exp(-0.5 * ((x - mean[1]) / sd[1]) ** 2)
    y = first_distribution + second_distribution
    y = y / max(y)
    
    plt.plot(x, y)
    plt.ylabel("Relative probability of bus arrivals")
    plt.xlabel("Minutes past the hour")
    plt.show()
    

    You’ve created two normal distributions centered on 15 and 45 minutes past the hour and summed them. You set the most likely arrival time to a value of 1 by dividing by the maximum value.

    You can now simulate bus arrival times using this distribution. To do this, you can create random times and random relative probabilities using the built-in random module. In the code below, you will also use list comprehensions:

    import random
    import matplotlib.pyplot as plt
    import numpy as np
    
    n_buses = 40
    bus_times = np.asarray([random.randint(0, 59) for _ in range(n_buses)])
    bus_likelihood = np.asarray([random.random() for _ in range(n_buses)])
    
    plt.scatter(x=bus_times, y=bus_likelihood)
    plt.title("Randomly chosen bus arrival times and relative probabilities")
    plt.ylabel("Relative probability of bus arrivals")
    plt.xlabel("Minutes past the hour")
    plt.show()
    

    You’ve simulated 40 bus arrivals, which you can visualize with the following scatter plot:

    Scatter Plot Part 9

    Your plot will look different since the data you’re generating is random. However, not all of these points are likely to be close to the reality that the commuter observed from the data she gathered and analyzed. You can plot the distribution she obtained from the data with the simulated bus arrivals:

    import random
    import matplotlib.pyplot as plt
    import numpy as np
    
    mean = 15, 45
    sd = 5, 7
    
    x = np.linspace(0, 59, 60)
    first_distribution = np.exp(-0.5 * ((x - mean[0]) / sd[0]) ** 2)
    second_distribution = 0.9 * np.exp(-0.5 * ((x - mean[1]) / sd[1]) ** 2)
    y = first_distribution + second_distribution
    y = y / max(y)
    
    n_buses = 40
    bus_times = np.asarray([random.randint(0, 59) for _ in range(n_buses)])
    bus_likelihood = np.asarray([random.random() for _ in range(n_buses)])
    
    plt.scatter(x=bus_times, y=bus_likelihood)
    plt.plot(x, y)
    plt.title("Randomly chosen bus arrival times and relative probabilities")
    plt.ylabel("Relative probability of bus arrivals")
    plt.xlabel("Minutes past the hour")
    plt.show()
    

    This gives the following output:

    Scatter Plot Part 10

    To keep the simulation realistic, you need to make sure that the random bus arrivals match the data and the distribution obtained from those data. You can filter the randomly generated points by keeping only the ones that fall within the probability distribution. You can achieve this by creating a mask for the scatter plot:

    # ...
    
    in_region = bus_likelihood < y[bus_times]
    out_region = bus_likelihood >= y[bus_times]
    
    plt.scatter(
        x=bus_times[in_region],
        y=bus_likelihood[in_region],
        color="green",
    )
    plt.scatter(
        x=bus_times[out_region],
        y=bus_likelihood[out_region],
        color="red",
        marker="x",
    )
    
    plt.plot(x, y)
    plt.title("Randomly chosen bus arrival times and relative probabilities")
    plt.ylabel("Relative probability of bus arrivals")
    plt.xlabel("Minutes past the hour")
    plt.show()
    

    The variables in_region and out_region are NumPy arrays containing Boolean values based on whether the randomly generated likelihoods fall above or below the distribution y. You then plot two separate scatter plots, one with the points that fall within the distribution and another for the points that fall outside the distribution. The data points that fall above the distribution are not representative of the real data:

    Scatter Plot Part 11

    You’ve segmented the data points from the original scatter plot based on whether they fall within the distribution and used a different color and marker to identify the two sets of data.

    Reviewing the Key Input Parameters

    You’ve learned about the main input parameters to create scatter plots in the sections above. Here’s a brief summary of key points to remember about the main input parameters:

    Parameter Description
    x and y These parameters represent the two main variables and can be any array-like data types, such as lists or NumPy arrays. These are required parameters.
    s This parameter defines the size of the marker. It can be a float if all the markers have the same size or an array-like data structure if the markers have different sizes.
    c This parameter represents the color of the markers. It will typically be either an array of colors, such as RGB values, or a sequence of values that will be mapped onto a colormap using the parameter cmap.
    marker This parameter is used to customize the shape of the marker.
    cmap If a sequence of values is used for the parameter c, then this parameter can be used to select the mapping between values and colors, typically by using one of the standard colormaps or a custom colormap.
    alpha This parameter is a float that can take any value between 0 and 1 and represents the transparency of the markers, where 1 represents an opaque marker.

    These are not the only input parameters available with plt.scatter(). You can access the full list of input parameters from the documentation.

    Conclusion

    Now that you know how to create and customize scatter plots using plt.scatter(), you’re ready to start practicing with your own datasets and examples. This versatile function gives you the ability to explore your data and present your findings in a clear way.

    In this tutorial you’ve learned how to:

    • Create a scatter plot using plt.scatter()
    • Use the required and optional input parameters
    • Customize scatter plots for basic and more advanced plots
    • Represent more than two dimensions with plt.scatter()

    You can get the most out of visualization using plt.scatter() by learning more about all the features in Matplotlib and dealing with data using NumPy.

    Watch Now This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Using plt.scatter() to Visualize Data in Python

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