Визуализация данных в Python с помощью plt.scatter() — Real Python Посмотрите его вместе с письменным руководством, чтобы углубить свое понимание: Использование plt.scatter() для визуализации данных в Python
Важной частью работы с данными является возможность их
визуализации. В Python есть несколько сторонних модулей, которые вы можете использовать для визуализации данных. Одним из самых популярных модулей является Matplotlib и его подмодуль pyplot , часто называемый псевдонимом plt . Matplotlib предоставляет очень универсальный инструмент под названием plt.scatter() , который позволяет создавать как базовые, так и более сложные точечные диаграммы.
Ниже вы ознакомитесь с несколькими примерами, которые покажут вам, как эффективно использовать эту функцию.
В этом уроке вы узнаете, как:
Создать точечную диаграмму , используя plt.scatter()
Используйте обязательные и дополнительные входные параметры
Настройка точечных диаграмм для базовых и более сложных графиков
Представление более чем двух измерений на точечной диаграмме
Чтобы получить максимальную отдачу от этого руководства, вы должны быть знакомы с основами программирования Python и основами NumPy и его объекта ndarray . Вам не нужно быть знакомым с Matplotlib, чтобы следовать этому руководству, но если вы хотите узнать больше о модуле, ознакомьтесь с Python Plotting With Matplotlib (Руководство).
Бесплатный бонус: Нажмите здесь, чтобы получить доступ к бесплатному руководству по ресурсам NumPy, в котором вы найдете лучшие учебные пособия, видео и книги для улучшения ваших навыков работы с NumPy.
Создание точечных диаграмм
Точечная диаграмма — это визуальное представление того, как две переменные связаны друг с другом. Вы можете использовать точечные диаграммы, чтобы исследовать взаимосвязь между двумя переменными, например, ища любую корреляцию между ними.
В этом разделе руководства вы познакомитесь с созданием базовых диаграмм рассеивания с помощью Matplotlib. В последующих разделах вы узнаете, как дополнительно настраивать графики для представления более сложных данных с использованием более двух измерений.
Удалить рекламу
Начало работы с
plt.scatter()
Прежде чем вы сможете начать работать с plt.scatter() , вам необходимо установить Matplotlib. Вы можете сделать это, используя стандартный диспетчер пакетов Python, pip , выполнив в консоли следующую команду:
$ python -m pip установить matplotlib
Теперь, когда вы установили Matplotlib, рассмотрите следующий вариант использования. Кафе продает шесть различных видов апельсиновых напитков в бутылках. Владелец хочет понять взаимосвязь между ценой напитков и количеством каждого из них, которое он продает, поэтому он отслеживает, сколько каждого напитка он продает каждый день. Вы можете визуализировать эту связь следующим образом:
В этом скрипте Python вы импортируете подмодуль pyplot из Matplotlib, используя псевдоним plt . Этот псевдоним обычно используется по соглашению для сокращения имен модулей и подмодулей. Затем вы создаете списки с ценой и средними продажами в день для каждого из шести проданных апельсиновых напитков.
Наконец, вы создаете точечную диаграмму, используя
plt.scatter() с двумя переменными, которые вы хотите сравнить, в качестве входных аргументов. Поскольку вы используете сценарий Python, вам также необходимо явно отобразить фигуру с помощью plt.show() .
Когда вы используете интерактивную среду, такую как консоль или Jupyter Notebook, вам не нужно вызывать plt.show() . В этом уроке все примеры будут в виде скриптов и будут включать вызов plt.show() .
Вот результат этого кода:
Этот график показывает, что, как правило, чем дороже напиток, тем меньше товаров продается. Однако напиток, который стоит 4,02 доллара, является исключением, что может свидетельствовать о том, что это особенно популярный продукт. При таком использовании точечных диаграмм тщательная проверка может помочь вам изучить взаимосвязь между переменными. Затем вы можете провести дальнейший анализ, используя линейную регрессию или другие методы.
Сравнение
plt.scatter() и plt.plot()
Вы также можете создать диаграмму рассеяния, показанную выше, с помощью другой функции в matplotlib.pyplot . Matplotlib plt.plot() — это функция построения графиков общего назначения, которая позволит вам создавать различные линейные или маркерные графики.
Вы можете получить тот же точечный график, который вы получили в разделе выше, с помощью следующего вызова plt.plot() , используя те же данные:
plt.plot(цена, продажи_за_день, "o")
plt.show()
В этом случае вы должны были включить маркер "o" в качестве третьего аргумента, иначе plt.plot() построит линейный график. График, который вы создали с помощью этого кода, идентичен графику, который вы создали ранее с помощью plt.scatter() .
В некоторых случаях для базовой диаграммы рассеивания, которую вы строите в этом примере, может быть предпочтительнее использовать
plt. plot() . Вы можете сравнить эффективность двух функций, используя модуль timeit :
Производительность будет разной на разных компьютерах, но когда вы запустите этот код, вы обнаружите, что plt.plot() значительно эффективнее, чем plt.scatter() . При выполнении приведенного выше примера в моей системе plt.plot() работало более чем в семь раз быстрее.
Если вы можете создавать точечные диаграммы с помощью plt.plot() , и это намного быстрее, зачем вам вообще использовать plt. scatter() ? Вы найдете ответ в оставшейся части этого руководства. Большинство настроек и расширенных возможностей, о которых вы узнаете в этом руководстве, возможны только при использовании plt.scatter() . Вот эмпирическое правило, которое вы можете использовать:
Если вам нужен простой точечный график, используйте plt.plot() , особенно если вы хотите отдать приоритет производительности.
Если вы хотите настроить точечную диаграмму, используя более продвинутые функции построения графиков, используйте
plt.scatter() .
В следующем разделе вы начнете изучать более сложные варианты использования plt.scatter() .
Удаление рекламы
Настройка маркеров на точечных диаграммах
Вы можете визуализировать более двух переменных на двумерной диаграмме рассеяния, настроив маркеры. Существует четыре основных свойства маркеров, используемых в точечной диаграмме, которые можно настроить с помощью plt. scatter() :
.
Размер
Цвет
Форма
Прозрачность
В этом разделе руководства вы узнаете, как изменить все эти свойства.
Изменение размера
Вернемся к владельцу кафе, которого вы встретили ранее в этом уроке. Различные апельсиновые напитки, которые он продает, поступают от разных поставщиков и имеют разную норму прибыли. Вы можете отобразить эту дополнительную информацию на точечной диаграмме, отрегулировав размер маркера. Маржа прибыли указана в процентах в этом примере:
Вы можете заметить несколько изменений по сравнению с первым примером. Вместо списков теперь вы используете массивы NumPy. Для данных можно использовать любую структуру данных, подобную массиву, и массивы NumPy обычно используются в приложениях такого типа, поскольку они позволяют поэлементных операций которые выполняются эффективно. Модуль NumPy зависит от Matplotlib, поэтому вам не нужно устанавливать его вручную.
Вы также использовали именованных параметров в качестве входных аргументов в вызове функции. Параметры x и y являются обязательными, но все остальные параметры являются необязательными.
Параметр s обозначает размер маркера. В этом примере вы используете размер прибыли в качестве переменной для определения размера маркера и умножаете его на 9.0007 10
для более четкого отображения разницы в размерах.
Вы можете увидеть точечную диаграмму, созданную этим кодом ниже:
Размер маркера указывает размер прибыли для каждого продукта. Два апельсиновых напитка, которые продаются больше всего, также приносят наибольшую прибыль. Хорошая новость для владельца кафе!
Изменение цвета
Многие посетители кафе любят внимательно читать этикетки, особенно чтобы узнать содержание сахара в напитках, которые они покупают. Владелец кафе хочет подчеркнуть свой выбор здоровых продуктов в своей следующей маркетинговой кампании, поэтому он классифицирует напитки на основе содержания в них сахара и использует систему светофора, чтобы указать низкое, среднее или высокое содержание сахара в напитках.
Вы можете раскрасить маркеры на точечной диаграмме, чтобы показать содержание сахара в каждом напитке:
Вы определяете переменные low , medium и high как кортежи, каждый из которых содержит три значения, представляющие компоненты красного, зеленого и синего цветов в указанном порядке. Это значения цвета RGB. Кортежи для низкий , средний и высокий представляют зеленый, желтый и красный соответственно.
Затем вы определили переменную sweet_content для классификации каждого напитка. Вы используете необязательный параметр c в вызове функции, чтобы определить цвет каждого маркера. Вот точечная диаграмма, созданная этим кодом:
.
Владелец кафе уже решил убрать из меню самый дорогой напиток, так как он плохо продается и содержит большое количество сахара. Должен ли он также прекратить закупать самые дешевые напитки, чтобы повысить репутацию бизнеса в отношении здоровья, даже несмотря на то, что они хорошо продаются и приносят хорошую прибыль?
Удалить рекламу
Изменение формы
Владелец кафе нашел это упражнение очень полезным и хочет исследовать другой продукт. В дополнение к апельсиновым напиткам вы теперь также нанесете аналогичные данные для ассортимента зерновых батончиков, доступных в кафе:
В этом коде вы реорганизуете имена переменных, чтобы учесть, что теперь у вас есть данные для двух разных продуктов. Затем вы строите оба графика рассеяния на одном рисунке. Это дает следующий вывод:
К сожалению, вы больше не можете понять, какие точки данных относятся к апельсиновым напиткам, а какие к зерновым батончикам. Вы можете изменить форму маркера для одной из точечных диаграмм:
Вы сохраняете форму маркера по умолчанию для данных апельсинового напитка. Маркером по умолчанию является "o" , что представляет собой точку. Для данных зернового батончика вы устанавливаете форму маркера на "d" , что представляет собой ромбовидный маркер. Вы можете найти список всех маркеров, которые вы можете использовать на странице документации по маркерам. Вот два графика рассеяния, наложенные на одну и ту же цифру:
.
Теперь вы можете отличить точки данных для апельсиновых напитков от точек данных для зерновых батончиков. Но есть одна проблема с последним созданным вами графиком, которую вы исследуете в следующем разделе.
Изменение прозрачности
Исчезла одна из точек данных апельсиновых напитков. Оранжевых напитков должно быть шесть, но на рисунке видно только пять круглых маркеров. Одна из точек данных зернового батончика скрывает точку данных апельсинового напитка.
Вы можете решить эту проблему визуализации, сделав точки данных частично прозрачными, используя альфа-значение:
# ...
plt.scatter(
х=цена_оранжевый,
y=продажи_за_день_оранжевый,
s=profit_margin_orange * 10,
c=sugar_content_orange,
альфа=0,5,
)
plt.scatter(
х = цена_зерновых,
y=продажи_за_день_зерновых,
s=прибыль_прибыль_зерновые * 10,
c=сахар_содержание_хлопья,
маркер = "д",
альфа=0,5,
)
plt.title("Продажи и цены на апельсиновые напитки и зерновые батончики")
plt.legend(["Апельсиновые напитки", "Злаковые батончики"])
plt.xlabel("Цена (денежная единица)")
plt.ylabel("Средние продажи за неделю")
пл.текст(
3.2,
55,
"Размер маркера = размер прибыли\n" "Цвет маркера = содержание сахара",
)
plt.show()
Вы установили значение alpha обоих наборов маркеров на 0,5 , что означает, что они полупрозрачны. Теперь вы можете увидеть все точки данных на этом графике, включая совпадающие:
Вы также добавили заголовок и другие метки к графику, чтобы дополнить рисунок дополнительной информацией о том, что отображается.
Настройка цветовой карты и стиля
На созданных вами диаграммах рассеяния вы использовали три цвета для обозначения низкого, среднего и высокого содержания сахара в напитках и зерновых батончиках. Теперь вы измените это, чтобы цвет напрямую отображал фактическое содержание сахара в продуктах.
Сначала необходимо реорганизовать переменные Sugar_content_orange и Sugar_content_cereal , чтобы они представляли значение содержания сахара, а не только значения цвета RGB:
Теперь это списки, содержащие процент рекомендуемого ежедневного количества сахара в каждом продукте. Остальной код остается прежним, но теперь вы можете выбрать цветовую карту для использования. Это сопоставляет значения цветам:
# ...
plt.scatter(
х=цена_оранжевый,
y=продажи_за_день_оранжевый,
s=profit_margin_orange * 10,
c=sugar_content_orange,
смап = "струя",
альфа=0,5,
)
plt.scatter(
х = цена_зерновых,
y=продажи_за_день_зерновых,
s=прибыль_прибыль_зерновые * 10,
c=сахар_содержание_хлопья,
смап = "струя",
маркер = "д",
альфа=0,5,
)
plt.title("Продажи и цены на апельсиновые напитки и зерновые батончики")
plt.legend(["Апельсиновые напитки", "Злаковые батончики"])
plt.xlabel("Цена (денежная единица)")
plt.ylabel("Средние продажи за неделю")
пл.текст(
2,7,
55,
"Размер маркера = размер прибыли\n" "Цвет маркера = содержание сахара",
)
plt.colorbar()
plt.show()
Цвет маркеров теперь основан на непрерывной шкале, и вы также отобразили цветовую полосу , которая действует как легенда для цвета маркеров. Вот результирующая диаграмма рассеяния:
Все графики, которые вы построили до сих пор, были отображены в собственном стиле Matplotlib. Вы можете изменить этот стиль, используя один из нескольких вариантов. Вы можете отобразить доступные стили с помощью следующей команды:
Теперь вы можете изменить стиль графика при использовании Matplotlib, используя следующий вызов функции перед вызовом plt.scatter() :
импортировать matplotlib.pyplot как plt
импортировать numpy как np
plt. style.use («морской рожденный»)
# ...
Это меняет стиль на стиль Seaborn, еще одного стороннего пакета визуализации. Вы можете увидеть другой стиль, построив окончательный график рассеяния, показанный выше, с использованием стиля Seaborn:
Вы можете узнать больше о настройке графиков в Matplotlib, а также есть дополнительные руководства на страницах документации Matplotlib.
Использование plt.scatter() для создания точечных диаграмм позволяет отображать более двух переменных. Вот переменные, представленные в этом примере:
Переменная
Представлен
Цена
Ось X
Среднее количество проданных
Ось Y
Маржа прибыли
Размер маркера
Тип продукта
Форма маркера
Содержание сахара
Цвет маркера
Возможность представления более двух переменных делает plt. scatter() очень мощным и универсальным инструментом.
Удалить рекламу
Изучение
plt.scatter () Далее
plt.scatter() предлагает еще большую гибкость в настройке точечных диаграмм. В этом разделе вы узнаете, как маскировать данные с помощью массивов NumPy и точечных диаграмм на примере. В этом примере вы сгенерируете случайные точки данных, а затем разделите их на две отдельные области на одном графике рассеяния.
Жительница пригородной зоны, увлекающаяся сбором данных, сопоставила время прибытия автобусов на своей местной автобусной остановке за шестимесячный период. Время прибытия по расписанию составляет 15 минут 45 минут первого часа, но она заметила, что истинное время прибытия следует нормальному распределению вокруг этого времени:
Этот график показывает относительную вероятность прибытия автобуса каждую минуту в течение часа. Это распределение вероятностей может быть представлено с помощью NumPy и np. linspace() :
импортировать matplotlib.pyplot как plt
импортировать numpy как np
среднее = 15, 45
сд = 5, 7
x = np.linspace(0, 59, 60) # Представляет каждую минуту в течение часа
first_distribution = np.exp(-0,5 * ((x - среднее [0]) / sd[0]) ** 2)
second_distribution = 0,9 * np.exp (-0,5 * ((x - среднее [1]) / sd [1]) ** 2)
y = первое_распределение + второе_распределение
у = у / макс (у)
plt.plot(x, y)
plt.ylabel("Относительная вероятность прибытия автобуса")
plt.xlabel("Минуты после часа")
plt.show()
Вы создали два нормальных распределения с центром в 15 и 45 минут после часа и просуммировали их. Вы устанавливаете наиболее вероятное время прибытия на значение 1 путем деления на максимальное значение.
Теперь вы можете смоделировать время прибытия автобуса, используя это распределение. Для этого можно создавать случайные времена и случайные относительные вероятности с помощью встроенного модуля random . В приведенном ниже коде вы также будете использовать списки:
случайный импорт
импортировать matplotlib.pyplot как plt
импортировать numpy как np
n_автобусов = 40
bus_times = np.asarray([random.randint(0, 59) для _ в диапазоне (n_buses)])
bus_likelihood = np.asarray([random.random() for _ in range(n_buses)])
plt.scatter(x=автобус_время, y=автобус_вероятность)
plt.title("Случайно выбранное время прибытия автобуса и относительная вероятность")
plt.ylabel("Относительная вероятность прибытия автобуса")
plt.xlabel("Минуты после часа")
plt.show()
Вы смоделировали 40 прибывающих автобусов, которые можно визуализировать с помощью следующей диаграммы рассеяния:
Ваш график будет выглядеть по-другому, поскольку данные, которые вы генерируете, случайны. Однако не все из этих моментов, вероятно, будут близки к реальности, которую пассажирка наблюдала на основе собранных и проанализированных ею данных. Вы можете построить распределение, которое она получила из данных смоделированных прибытий автобусов:
случайный импорт
импортировать matplotlib. pyplot как plt
импортировать numpy как np
среднее = 15, 45
сд = 5, 7
х = np.linspace (0, 59, 60)
first_distribution = np.exp(-0,5 * ((x - среднее [0]) / sd[0]) ** 2)
second_distribution = 0,9 * np.exp (-0,5 * ((x - среднее [1]) / sd [1]) ** 2)
y = первое_распределение + второе_распределение
у = у / макс (у)
n_автобусов = 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=автобус_время, y=автобус_вероятность)
plt.plot(x, y)
plt.title("Случайно выбранное время прибытия автобуса и относительная вероятность")
plt.ylabel("Относительная вероятность прибытия автобуса")
plt.xlabel("Минуты после часа")
plt.show()
Это дает следующий вывод:
Чтобы моделирование было реалистичным, необходимо убедиться, что случайные прибытия автобусов соответствуют данным и распределению, полученному из этих данных. Вы можете отфильтровать случайно сгенерированные точки, оставив только те, которые попадают в распределение вероятностей. Вы можете добиться этого, создав маску для точечной диаграммы:
# ...
in_region = автобус_вероятность < y[автобус_время]
out_region = автобус_вероятность >= y[автобус_время]
plt.scatter(
x=автобусное_время[в_регионе],
y=автобус_вероятность[в_регионе],
цвет = "зеленый",
)
plt.scatter(
x=bus_time[out_region],
y=автобус_вероятность[out_region],
цвет = "красный",
маркер = "х",
)
plt.plot(x, y)
plt.title("Случайно выбранное время прибытия автобуса и относительная вероятность")
plt.ylabel("Относительная вероятность прибытия автобуса")
plt.xlabel("Минуты после часа")
plt.show()
Переменные in_region и out_region представляют собой массивы NumPy, содержащие логические значения в зависимости от того, находятся ли случайно сгенерированные вероятности выше или ниже распределения y . Затем вы строите два отдельных графика рассеяния, один с точками, попадающими в распределение, а другой — с точками, не входящими в распределение. Точки данных, которые находятся выше распределения, не являются репрезентативными для реальных данных:
Вы сегментировали точки данных из исходной диаграммы рассеяния на основе того, попадают ли они в распределение, и использовали другой цвет и маркер для идентификации двух наборов данных.
Удаление рекламы
Просмотр основных входных параметров
Вы узнали об основных входных параметрах для создания точечных диаграмм в разделах выше. Вот краткое изложение ключевых моментов, которые следует помнить об основных входных параметрах:
Параметр
Описание
х и у
Эти параметры представляют две основные переменные и могут быть любыми типами данных, подобными массивам, такими как списки или массивы NumPy. Это обязательные параметры.
с
Этот параметр определяет размер маркера. Это может быть число с плавающей запятой, если все маркеры имеют одинаковый размер, или структура данных, подобная массиву, если маркеры имеют разные размеры.
с
Этот параметр представляет цвет маркеров. Обычно это будет либо массив цветов, например значения RGB, либо последовательность значений, которые будут отображены на карту цветов с помощью параметра cmap .
маркер
Этот параметр используется для настройки формы маркера.
смап
Если для параметра c используется последовательность значений, то этот параметр можно использовать для выбора сопоставления между значениями и цветами, обычно с использованием одной из стандартных карт цветов или пользовательской карты цветов.
альфа
Этот параметр представляет собой число с плавающей запятой, которое может принимать любое значение от 9 до0007 0 и 1 и представляет прозрачность маркеров, где 1 представляет непрозрачный маркер.
Это не единственные входные параметры, доступные с plt.scatter() . Вы можете получить доступ к полному списку входных параметров из документации.
Заключение
Теперь, когда вы знаете, как создавать и настраивать точечные диаграммы с помощью plt.scatter() , вы готовы начать практиковаться с собственными наборами данных и примерами. Эта универсальная функция дает вам возможность исследовать ваши данные и представлять результаты в ясной форме.
В этом уроке вы узнали, как:
Создайте график рассеяния , используя plt.scatter ()
Используйте обязательные и дополнительные входные параметры
Настройка точечных диаграмм для базовых и более сложных графиков
Представление более чем двух измерений с plt.scatter()
Вы можете получить максимальную отдачу от визуализации, используя plt.