如何利用Seaborn绘制热力图?

如何利用Seaborn绘制热力图?

这是本学期在大数据哲学与社会科学实验室做的第八次分享了。

第一次分享的是:

第二次分享的是:

第三次分享的是:

第四次分享的是:

第五次分享的是:

第六次分享的是:

第七次分享的是:

本次分享的是“如何利用Seaborn绘制热力图?”

1. Seaborn简介

Seaborn是在matplotlib的基础上进行了更高级的API封装,使得作图更加容易,不需要经过大量的调整就能使你的图变得精致。

Seaborn官网:

https://seaborn.pydata.org/

Seaborn安装:

pip install seaborn

Seaborn升级:

pip install --upgrade seaborn

显示Seaborn信息:

pip show Seaborn
Name: seaborn
Version: 0.11.1
Summary: seaborn: statistical data visualization
Home-page: https://seaborn.pydata.org
Author: Michael Waskom
Author-email: mwaskom@nyu.edu
License: BSD (3-clause)
Location: c:\programdata\anaconda3\lib\site-packages
Requires: numpy, scipy, matplotlib, pandas
Required-by:
(base) PS D:\Users\Administrator>

2. 利用Seaborn绘制热力图

热力图 就是用颜色深浅来表示数值大小的图像。

在实际中常用于展示列联表的数据分布,以及展示一组变量的相关系数矩阵,通过热力图我们可以非常直观地感受到数值大小的差异状况。

heatmap的API如下所示:

def heatmap(
    data, *,
    vmin=None, vmax=None, cmap=None, center=None, robust=False,
    annot=None, fmt=".2g", annot_kws=None,
    linewidths=0, linecolor="white",
    cbar=True, cbar_kws=None, cbar_ax=None,
    square=False, xticklabels="auto", yticklabels="auto",
    mask=None, ax=None,
    **kwargs
):

2.1 展示列联表

列联表是根据多个类别变量来对观测值进行计数的表。该表的行和列对应于这些类别变量。

本案例采用的数据集是Seaborn中内置的flights航班数据集,dataframe中的数据代表了1949年-1960年每个月的航班乘客数量。

year   1949  1950  1951  1952  1953  1954  1955  1956  1957  1958  1959  1960
month                                                                        
Jan     112   115   145   171   196   204   242   284   315   340   360   417
Feb     118   126   150   180   196   188   233   277   301   318   342   391
Mar     132   141   178   193   236   235   267   317   356   362   406   419
Apr     129   135   163   181   235   227   269   313   348   348   396   461
May     121   125   172   183   229   234   270   318   355   363   420   472
Jun     135   149   178   218   243   264   315   374   422   435   472   535
Jul     148   170   199   230   264   302   364   413   465   491   548   622
Aug     148   170   199   242   272   293   347   405   467   505   559   606
Sep     136   158   184   209   237   259   312   355   404   404   463   508
Oct     119   133   162   191   211   229   274   306   347   359   407   461
Nov     104   114   146   172   180   203   237   271   305   310   362   390
Dec     118   140   166   194   201   229   278   306   336   337   405   432

Seaborn的数据集合:

https://github.com/mwaskom/seaborn-data

import seaborn as sns
import matplotlib.pyplot as plt

data = sns.load_dataset('flights'). \
    pivot(index='month', columns='year', values='passengers')
sns.heatmap(data=data)
plt.show()

热力图的右侧是 颜色带,上面代表了数值到颜色的映射,数值由小到大对应色彩由暗到亮。

从上面的heatmap,我们可以得到两层信息,一是随着时间的推移,飞机的乘客数量是在逐步增多的,二是航班的乘坐旺季在七月和八月份。下面就具体的参数进行演示。

cmap:设置颜色带的色系

有关色带的配置见图文:如何利用colormap让你的图表与众不同?

import seaborn as sns
import matplotlib.pyplot as plt

data = sns.load_dataset('flights'). \
    pivot(index='month', columns='year', values='passengers')
sns.heatmap(data=data, cmap='RdBu_r')
plt.show()

annot:是否显示数值注释

数值注释默认显示的是科学记数法的数值,我们得把数值进行格式化,这就用到了下面的参数。

fmt:format的缩写,设置数值的格式化形式

import seaborn as sns
import matplotlib.pyplot as plt

data = sns.load_dataset('flights'). \
    pivot(index='month', columns='year', values='passengers')
sns.heatmap(data=data, cmap='RdBu_r', annot=True, fmt='d')
plt.show()

linewidths:控制每个小方格之间的间距

import seaborn as sns
import matplotlib.pyplot as plt

data = sns.load_dataset('flights'). \
    pivot(index='month', columns='year', values='passengers')
sns.heatmap(data=data, cmap='RdBu_r', annot=True,
            fmt='d', linewidths=0.3)
plt.show()

linecolor:控制分割线的颜色

import seaborn as sns
import matplotlib.pyplot as plt

data = sns.load_dataset('flights'). \
    pivot(index='month', columns='year', values='passengers')
sns.heatmap(data=data, cmap='RdBu_r', annot=True,
            fmt='d', linewidths=0.3, linecolor='gray')
plt.show()

cbar_kws:关于颜色带的设置

import seaborn as sns
import matplotlib.pyplot as plt

data = sns.load_dataset('flights'). \
    pivot(index='month', columns='year', values='passengers')
sns.heatmap(data=data, cmap='RdBu_r', annot=True,
            fmt='d', linewidths=0.3, linecolor='gray',
            cbar_kws={'orientation': 'horizontal'})
plt.show()

2.2 展示相关系数矩阵

所用数据集mtcars.csv记录了32种不同品牌的轿车的11个属性。

数据来源:

https://gist.github.com/seankross/a412dfbd88b3db70b74b

皮尔逊相关系数(Pearson Correlation)是衡量向量相似度的一种方式。

这个系数在-1~1之间波动,0表示完全无关,1表示完全正相关,-1表示完全负相关。

p e a r s o n = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) ∑ i = 1 n ( x i − x ˉ ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 pearson = \frac{\sum_{i=1}^{n}(x_i-\bar{x})(y_i-\bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i-\bar{x})^2}\sqrt{\sum_{i=1}^{n}(y_i-\bar{y})^2}} pearson=i=1n(xixˉ)2 i=1n(yiyˉ)2 i=1n(xixˉ)(yiyˉ)

对相关的通俗理解可以看图文:内积与相关

上面数据计算出来的相关系数矩阵如下:

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

# 确保正常显示中文+负号
plt.rcParams['font.sans-serif'] = ['Simhei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(12, 10), dpi=70)

df = pd.read_csv('.\data\mtcars.csv')
pd.set_option('display.max_columns', None)

name = ["汽车名称", "英里/加仑", "气缸数量", "排量", "总马力",
        "驱动轴比", "重量", "1/4英里所用时间", "引擎",
        "变速器", "前进档数", "化油器数量"]
df.columns = name
mat = df.corr(method='pearson')
sns.heatmap(data=mat, cmap='RdYlGn', annot=True)

plt.title('mtcars数据集的相关性矩阵', fontsize=22)
plt.xticks(fontsize=12  # 字体大小
           , rotation=45  # 字体是否进行旋转
           , horizontalalignment='right'  # 刻度的相对位置
           )
plt.yticks(fontsize=12)
plt.show()

2.3 成对分析图

成对分析图 是以图像形式分析多个变量之间相关性的图像,是相关矩阵图的具体化。

我们可以使用散点图或者带最佳拟合线的散点图来描述变量两两之间的关系。但当我们有着探索多个特征两两之间关系的需求时,一一绘制图像的效率比较低下,因此我们就可以使用成对分析图。它是一种类关系矩阵的绘图方式,一次性绘制出所有特征之间的相关图像。

def pairplot(
    data, *,
    hue=None, hue_order=None, palette=None,
    vars=None, x_vars=None, y_vars=None,
    kind="scatter", diag_kind="auto", markers=None,
    height=2.5, aspect=1, corner=False, dropna=False,
    plot_kws=None, diag_kws=None, grid_kws=None, size=None,
):

本案例采用的数据集是Seaborn中内置的iris鸢尾花数据集。

数据集内包含 3 类共 150 条记录,每类各 50 个数据,每条记录都有 4 项特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度,可以通过这4个特征预测鸢尾花卉属于山鸢尾(iris-setosa),杂色鸢尾(iris-versicolour),维吉尼亚鸢尾(iris-virginica)中的哪一品种。

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_style('white', {'font.sans-serif': ['simhei', 'Arial']})
data = sns.load_dataset('iris')
data.columns = ["花萼长", "花萼宽", "花瓣长", "花瓣宽", "种类"]
kind_dict = {
    "setosa": "山鸢尾",
    "versicolor": "杂色鸢尾",
    "virginica": "维吉尼亚鸢尾"
}
data["种类"] = data["种类"].map(kind_dict)
sns.pairplot(data=data)
plt.show()

可以看到对角线上是各个属性的直方图(分布图),而非对角线上是两个不同属性之间的相关图,从图中我们发现,花瓣的长度和宽度之间以及萼片的长短和花瓣的长、宽之间具有比较明显的相关关系。

  • kind:用于控制非对角线上的图的类型,可选"scatter"(散点图)与"reg"(回归图)
  • diag_kind:控制对角线上的图的类型,可选"hist"(直方图)与"kde"(核密度估计图)
sns.pairplot(data=data, kind='reg', diag_kind='kde')
plt.show()

kind 参数设置为 “reg” 会为非对角线上的散点图拟合出一条回归直线,更直观地显示变量之间的关系。

那对于不同种类的花,其花萼和花瓣有什么比较鲜明的特征吗?我们通过hue参数把不同种类的花区分开,进行进一步分析。

hue:按照某个字段进行分类

sns.pairplot(data=data, hue='种类')
plt.show()

我们可以从经过hue分类后的pairplot中发现,不论是从对角线上的分布图还是从分类后的散点图,都可以看出对于不同种类的花,其萼片长、花瓣长、花瓣宽的分布差异较大,换句话说,这些属性是可以帮助我们去识别不同种类的花的。

比如,对于萼片、花瓣长度较短,花瓣宽度较窄的花,那么它大概率是山鸢尾。

当然,可以通过 palette 参数来调出自己想要的颜色

palette:控制色调

sns.pairplot(data, hue='种类', palette="husl")
plt.show()

markers:控制散点的样式

sns.pairplot(data, hue='种类', markers=["*", "s", "D"])
plt.show()

当我们想单独研究某两个(或多个)变量的关系时,我们只需要通过vars参数指定你想研究的变量

vars,x_vars,y_vars:选择数据中的特定字段,以list形式传入

#单独用vars参数选择"花萼长 "和"花瓣长"两种属性
sns.pairplot(data, hue='种类', vars=["花萼长", "花瓣长"])
plt.show()

# 用x_vars和 y_vars参数指定
# 需要注意的是,x_vars和y_vars要同时指定
sns.pairplot(data, x_vars=["花萼长", "花瓣宽"], y_vars=["花萼宽", "花瓣长"])
plt.show()

更多的样式可以通过plot_kwsdiag_kws来进行控制

plot_kws:用于控制非对角线上的图的样式

diag_kws:用于控制对角线上图的样式

sns.pairplot(data, diag_kind="kde", markers="s",
             plot_kws=dict(s=50, edgecolor="w", color="g", alpha=.5),
             diag_kws=dict(shade=True, color="r"))
plt.show()

参考图文:

  • https://www.jianshu.com/p/6e18d21a4cad
  • https://zhuanlan.zhihu.com/p/96040773
  • https://zhuanlan.zhihu.com/p/98729226
  • 11
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青少年编程备考

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值