国外课栈 - 国外电子信息技术视角栈

透视Matplotlib核心功能和工具包 - Seaborn工具包

 二维码 6

关联知识

Seaborn是基于Matplotlib构建的功能强大的可视化工具。 它使多变量探索性数据分析更加容易和直观,并且增加了一些新类型的图,并且其背景样式和颜色图更加令人愉悦。 它具有许多内置的统计功能,使其成为统计数据分析的首选工具。 它还具有非常详细的在线文档,您可以在以下位置找到https://seaborn.pydata.org/index.html

我们将使用两个数据集来演示大多数海洋特征。 其中一个数据集“葡萄酒质量”,另一个是来自虚拟小吃店的小吃销售数据集。

关系图

小吃销售数据集

该数据集(在代码库中提供)包含有关给定日期,星期几,是否为周末以及当天是否促销的各种商品的销售信息。 我们拥有三年的数据:2015年,2016年和2017年。数据集的前五行如下所示:

图略

然后,我们将添加两个派生变量以帮助绘制所需的图形:month(1到12)和Quarter(1/4)。 添加这些变量后,前五行如下所示:

图略

以下代码块读取Excel文件并添加其他变量:

import pandas as pd
import numpy as np

snacks_sales = pd.read_csv(
'Snacks_Data.csv')
snacks_sales[
'Month'] = pd.DatetimeIndex(snacks_sales['Date']).month
Quarter_Mapping = {1:1, 2:1, 3:1, 4:2, 5:2, 6:2, 7:3, 8:3, 9:3, 10:4,
                   11:4, 12:4}
snacks_sales[
'Quarter'] = snacks_sales['Month'].map(Quarter_Mapping)

葡萄酒质量数据集

该数据集具有11个影响葡萄酒质量的属性。 质量等级从3到8不等,然后我们将3和4映射到Low,将5和6映射到Med,将7和8映射到high以创建一个新变量:质量。

数据集的前五行如下所示:

图略

我们还将为葡萄酒质量数据集计算相关矩阵,我们将在一些图中使用该矩阵。

以下是用于读取其他变量并将其添加到Wine Quality数据集的代码块:

import pandas as pd

# Read the data
from a csv file into pandas data frame
wine_quality = pd.read_csv(
'winequality.csv', delimiter=';')

# Map numeric Quality codes to
'Low', 'Med' and 'High' qualitative
  ratings
quality_map = {3:
'Low', 4: 'Low', 5:'Med', 6:'Med', 7:'High', 8:'High'}
wine_quality[
'Quality'] = wine_quality['quality'].map(quality_map)

# compute correlation matrix
corr = wine_quality.corr()

# Display the first 5 records
of wine_quality dataset, and unique
  values
of quality variable
wine_quality.head()
set(wine_quality.quality)

变量

除了将它们的关系绘制在二维图中的两个变量之外,seaborn还可以绘制三个附加变量对两个主要变量之间的关系的影响图。 这三个变量称为语义变量。 它们被称为色调,大小和样式,它们充当给定绘图功能的参数。

对于每个唯一的色调值,将有一个关系图。 同样,对于样式的每个唯一值,都会有一个关系图。 如果色调变量中有两个唯一值(例如,是和否),样式变量中有两个唯一值(例如,s和D标记),则将有2 * 2 = 4个关系图( 是&s,是&D,否&s,否&D组合)。 各种色调值以不同的颜色绘制,各种样式值以不同的线或标记样式绘制。

同样,大小变量会影响两个主要变量的绘制点的大小。 与Matplotlib散布函数不同,此处,大小可变范围分为多个容器,并将点分配给这些容器。 在Matplotlib散点函数中,每个点都分别映射为大小可变的不同值。

除了这三个语义变量外,seaborn还允许在row和col中添加另外两个变量,其中针对row / col变量的每个唯一值,将有一个图(轴),并将其布置在row / col中。 这些行和列变量称为构面变量,因为它们使我们能够了解其他构面对所绘制的两个主要变量的影响。

这些附加变量可以映射到要分析数据的各个维度,或者要分析两个变量之间的关系。 在典型的销售分析场景中,两个主要变量可以是销售额(单位或美元)或时间(天,月或季度),维度可以是业务单位,产品线,地区。

关系绘图

关系图描述了两个连续变量之间的关系。 seaborn中有一个常见的API,relplot(),用于两种类型的图:线图和散点图。 但是,这两种类型中的每一种都有单独的函数:lineplot()和scatterplot()。 我们可以使用带有参数的relplot()来绘制折线图或散点图,也可以直接使用lineplot()和scatterplot()函数。

一对一和一对多关系的线图

在线图中,观测值连接到可以自定义样式的线。 x和y变量之间的关系可以是一对一的,有时也可以是一对多的。 在我们的零食销售数据集中,如果我们根据日期或期间绘制每个商品的销售量,则这是一对一的关系,因为每对日期/期间和销售量只有一个观察值。 但是,如果我们按月销售,则每个月有30个观察值(销售记录),这是一对多的关系。

Seaborn提供了多种选择来绘制这两种类型的关系。

导入所需包:

import matplotlib.pyplot as plt
import seaborn as sns

步骤细节:

  • 设置背景样式:

sns.set(style='darkgrid')

  • 用图的标题在period和smoothies销售之间绘制折线图:

sns.relplot(x='Period', y='Smoothies',
           
data=snacks_sales.query('Period < 300'), kind='line')
plt.
title('line plot', size=20, color='g')

  • 绘制period和smoothies销售之间的折线图,以星期几为色调:

day_order = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday',
             
'Saturday', 'Sunday']
sns.relplot(x=
'Period', y='Smoothies', hue='daywk',
            hue_order=day_order,
            data=snacks_sales.query(
'Period < 300'), kind='line')
plt.title(
'line plot with hue=daywk', size=20, color='g')

  • 以促销为色调在period和smoothies销售之间绘制折线图:

sns.relplot(x='Period', y='Smoothies', hue='Promotion', hue_order=
            [
'Yes', 'No'],
            data=snacks_sales.query(
'Period < 300'), kind='line')
plt.title(
'line plot with hue=Promotion', size=20, color='g')

  • 在“period”和“smoothies”销售之间绘制折线图,其中“促销”为色调,“周末”为样式:

sns.relplot(x='Period', y='Smoothies', hue='Promotion', hue_order=
            [
'Yes', 'No'], style='weekend',
            style_order=[
'Y', 'N'], kind='line',
            data=snacks_sales.query(
'Period < 300'))
plt.title(
'line plot with hue and style', size=20, color='g')

分解代码

  • sns.set(style='darkgrid')设置绘图的背景样式。 Seaborn提供了五种预定义样式:dark, darkgrid, white, whitegrid和 ticks。
  • sns.relplot(x='Period', y='Smoothies', data=snacks_sales.query('Period < 300'), kind='line')绘制由x和y指定的两个主要变量之间的关系:
  • period和smoothies是零食销售数据集中两个变量的名称
  • Snacks Sales 是输入数据集,由于查询整个数据集过于拥挤,query('Period <300')对数据集应用过滤器以仅绘制前300个观测值(行)
  • kind='line'表示绘制折线图。
  • 对于第二个绘图,我们将添加hue ='daywk'和hue_order = day_order
  • plt.title('line plot', size=20, color='g')以20点的大小绘制标题并以绿色绘制。
  • day_order = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] 指定在图表上绘制星期几的顺序。
  • hue ='daywk'表示绘制一周中每一天的period与smoothies销售量之间的关系,并且hue_order = day_order指定应按day_order列表中指定的顺序打印一周中的某天。
  • 对于第三个绘图,我们将更改hue ='Promotion'并将['Yes','No']映射为hue_order。
  • 对于第四个绘图,我们将添加style ='weekend'和style_order = ['Y','N']。

执行上述代码后,您应该在屏幕上看到以下图:

线图:

图略

色调为daywk的线图:

图略

色调为Promotion的线图:

图略

具有色调和样式的线图:

图略

其他

分类图

分布图

回归图

多图网格

矩阵图

...更多

阅读完整文档


文章分类: 编程碎语Matplotlib