python数据可视化Seaborn画热力图
作者:赵卓不凡 发布时间:2022-01-17 22:55:05
1.引言
热力图的想法很简单,用颜色替换数字。
现在,这种可视化风格已经从最初的颜色编码表格走了很长一段路。热力图被广泛用于地理空间数据。这种图通常用于描述变量的密度或强度,模式可视化、方差甚至异常可视化等。
鉴于热力图有如此多的应用,本文将介绍如何使用Seaborn
来创建热力图。
2. 栗子
首先我们导入Pandas
和Numpy
库,这两个库可以帮助我们进行数据预处理。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
import numpy as np
为了举例,我们采用的数据集是 80 种不同谷物的样本,我们来看看它们的成分。
数据集样例如下所示:
上图中,第一行为表头,接着对于每一行来说,第一列为谷物的名称,后面第4列到16列为每种谷物含有的13种主要组成成分的数值。
3. 数据预处理
解下来我们分析每种谷物13种不同成分之间的相关性,我们可以采用Pandas库中的coor()函数来计算相关性,
代码如下:
# read dataset
df = pd.read_csv('data/cereal.csv')
# get correlations
df_corr = df.corr() # 13X13
print(df_corr)
得到结果如下:
calories protein fat ... weight cups rating
calories 1.000000 0.019066 0.498610 ... 0.696091 0.087200 -0.689376
protein 0.019066 1.000000 0.208431 ... 0.216158 -0.244469 0.470618
fat 0.498610 0.208431 1.000000 ... 0.214625 -0.175892 -0.409284
sodium 0.300649 -0.054674 -0.005407 ... 0.308576 0.119665 -0.401295
fiber -0.293413 0.500330 0.016719 ... 0.247226 -0.513061 0.584160
carbo 0.250681 -0.130864 -0.318043 ... 0.135136 0.363932 0.052055
sugars 0.562340 -0.329142 0.270819 ... 0.450648 -0.032358 -0.759675
potass -0.066609 0.549407 0.193279 ... 0.416303 -0.495195 0.380165
vitamins 0.265356 0.007335 -0.031156 ... 0.320324 0.128405 -0.240544
shelf 0.097234 0.133865 0.263691 ... 0.190762 -0.335269 0.025159
weight 0.696091 0.216158 0.214625 ... 1.000000 -0.199583 -0.298124
cups 0.087200 -0.244469 -0.175892 ... -0.199583 1.000000 -0.203160
rating -0.689376 0.470618 -0.409284 ... -0.298124 -0.203160 1.000000[13 rows x 13 columns]
接着我们移除相关性不大的最后几个成分,代码如下:
# irrelevant fields
fields = ['rating', 'shelf', 'cups', 'weight']
# drop rows
df_corr.drop(fields, inplace=True) # 9X13
# drop cols
df_corr.drop(fields, axis=1, inplace=True) # 9X9
print(df_corr)
得到结果如下:
我们知道相关性矩阵是对称矩阵,矩阵中上三角和下三角的值是相同的,这带来了很大的重复。
4. 画热力图
非常幸运的是我们可以使用Mask矩阵来生成Seaborn
中的热力图,那么我们首先来生成Mask矩阵。
np.ones_like(df_corr, dtype=np.bool)
结果如下:
接着我们来得到上三角矩阵,在Numpy
中使用np.triu
函数可以返回上三角矩阵对应的Mask,
如下所示:
mask = np.triu(np.ones_like(df_corr, dtype=np.bool))
结果如下:
接下来我们画热力图,如下所示:
sb.heatmap(df_corr,mask=mask)
plt.show()
此时的运行结果如下:
5. 添加数值
观察上图,我们虽然使用Mask
生成了热力图,但是图像中还有两个空的单元格(红色圆圈所示)。
我们当然可以在绘制的时候将其进行过滤。即分别将和上述圆圈对应的mask
和df_corr
过滤掉,
代码如下:
# adjust mask and df
mask = mask[1:, :-1]
corr = df_corr.iloc[1:, :-1].copy()
同时我们可以设置heatmap
相应的参数,让其显示对应的数值,
完整代码如下:
def test2():
# read dataset
df = pd.read_csv('data/cereal.csv')
# get correlations
df_corr = df.corr() # 13X13
# irrelevant fields
fields = ['rating', 'shelf', 'cups', 'weight']
df_corr.drop(fields, inplace=True) # 9X13
# drop cols
df_corr.drop(fields, axis=1, inplace=True) # 9X9
mask = np.triu(np.ones_like(df_corr, dtype=np.bool))
# adjust mask and df
mask = mask[1:, :-1]
corr = df_corr.iloc[1:, :-1].copy()
# plot heatmap
sb.heatmap(corr, mask=mask, annot=True, fmt=".2f", cmap='Blues',
vmin=-1, vmax=1, cbar_kws={"shrink": .8})
# yticks
plt.yticks(rotation=0)
plt.show()
运行结果如下:
6. 调色板优化
接着我们继续优化可视化的效果,考虑到相关系数的范围为-1到1,所以颜色变化有两个方向。基于此,由中间向两侧发散的调色板相比连续的调色板视觉效果会更好。如下所示为发散的调色板示例:
在Seaborn库中存在生成发散调色板的函数 driverging_palette,
该函数用于构建colormaps
,每侧使用一种颜色,并在中心汇聚成另一种颜色。
这个函数的完整形式如下:
diverging_palette(h_neg, h_pos, s=75, l=50, sep=1,n=6, center=“light”, as_cmap=False)
该函数使用颜色表示形式为HUSL
,即hue
,Saturation
和Lightness
。这里我们查阅网站来选择我们接下来设置的调色板的颜色。
最后但是最最重要的一点,不要忘了在我们的图像上设置标题,使用title
函数即可。
完整代码如下:
def test3():
# read dataset
df = pd.read_csv('data/cereal.csv')
# get correlations
df_corr = df.corr() # 13X13
# irrelevant fields
fields = ['rating', 'shelf', 'cups', 'weight']
df_corr.drop(fields, inplace=True) # 9X13
# drop cols
df_corr.drop(fields, axis=1, inplace=True) # 9X9
fig, ax = plt.subplots(figsize=(12, 10))
# mask
mask = np.triu(np.ones_like(df_corr, dtype=np.bool))
# adjust mask and df
mask = mask[1:, :-1]
corr = df_corr.iloc[1:, :-1].copy()
# color map
cmap = sb.diverging_palette(0, 230, 90, 60, as_cmap=True)
# plot heatmap
sb.heatmap(corr, mask=mask, annot=True, fmt=".2f",
linewidths=5, cmap=cmap, vmin=-1, vmax=1,
cbar_kws={"shrink": .8}, square=True)
# ticks
yticks = [i.upper() for i in corr.index]
xticks = [i.upper() for i in corr.columns]
plt.yticks(plt.yticks()[0], labels=yticks, rotation=0)
plt.xticks(plt.xticks()[0], labels=xticks)
# title
title = 'CORRELATION MATRIX\nSAMPLED CEREALS COMPOSITION\n'
plt.title(title, loc='left', fontsize=18)
plt.show()
运行结果如下:
是不是看上去高大上了很多。人类果然还是视觉动物。
来源:https://blog.csdn.net/sgzqc/article/details/121877980?spm=1001.2014.3001.5502


猜你喜欢
- 一、Pycharm 是什么?PyCharm是一种PythonIDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。二
- 前言在目标检测中,数据集常常使用labelimg标注,会生成xml文件。本文旨在根据xml标注文件来裁剪目标,以达到去除背景信息的目的。xm
- 迭代是 Python 中的基本操作。我们可以迭代列表、字符串和所有其他结构。Asyncio 允许我们开发异步迭代器。我们可以通过定义一个实现
- 前段时间用C语言做了个字符版的推箱子,着实是比较简陋。正好最近用到了Python,然后想着用Python做一个图形界面的推箱子。这回可没有C
- mysql group by having 实例注意:使用group by的时候,SELECT子句中的列名必须为分组列。 如下实例必须包括n
- 很多DBA目前还停留在Oracle 9i或者10g,究其原因有可能是Oracle 11g的价格问题。本文将为大家讲解在Windows 7下安
- 一般打印就用window.print();就OK了 但是一般都是选择性打印所以会调用方法: function preview() { bdh
- 一、在linux下 删除这些目录是很简单的,命令如下 find . -type d -name ".svn"|xargs
- 以下来自Stack Overflow从上面我们可以很清晰的看出应该如何使用matplotlib的figure方法。补充知识:matplotl
- 前言前几天去我姐家里蹭饭吃,发现我姐家里的小外甥女儿已经上小学了,正在疯狂赶作业,加减乘除还有很多题目都经常出错。我姐说老师每天给他们布置了
- 本文实例为大家分享了JavaScript实现简易轮播图效果的具体代码,供大家参考,具体内容如下全部代码:<!DOCTYPE html&
- 一、同步原理基于Mysql的binlog日志订阅:binlog日志是Mysql用来记录数据实时的变化Mysql数据同步到ES中分为两种,分别
- np.where共两种用法:第一种np.where(condition, x, y),即condition为条件,当满足条件输出为x,不满足
- 前言Typora是一款非常使用的笔记工具,对于程序员非常友好,在2021年11月23日,Typora 正式发布 1.0 版本,进入了付费时代
- 之前一直使用QtCreator,在设计界面时非常方便,python早就集成了Qt模块,在python中以pyQt的包存在,目前常用的是pyQ
- 滚动图片可以说是做网站经常会遇到的,特别是做企业网站,最常用的像产品展示,图片展示等,滚动的好处是吸引眼球,让人一下就注意到。之前本站发了一
- 百度AI提供了一天50000次的免费文字识别额度,可以愉快的免费使用!下面直接上方法:首先在百度AI创建一个应用,按照下图创建即可,创建后会
- 前言MySQL提供了众多功能强大、方便易用的函数。使用这些函数可以极大地提高用户对数据库的管理效率。MySQL中的函数包括数学函数、字符串函
- “占位图形”顾名思义是在准备好将最终图形添加到 Web 页之前使用的临时图形。使用它可以在没有理想的图形的情况下先行制作Web页面——在需要
- 例如:select (a+b) as c from 表 类型也一致都是varchar型的,可就是显示不正确。 直到concat() MySQ