关系(二)利用python绘制热图
热图 (Heatmap)简介
热图适用于显示多个变量之间的差异,通过颜色判断彼此之间是否存在相关性。
快速绘制
-
基于seaborn
import seaborn as sns import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl# 自定义数据 df = pd.DataFrame(np.random.random((5,5)), columns=["a","b","c","d","e"])# 利用seaborn的heatmap函数创建 sns.heatmap(df)plt.show()
定制多样化的热图
自定义热图一般是结合使用场景对相关参数进行修改,并辅以其他的绘图知识。参数信息可以通过官网进行查看,其他的绘图知识则更多来源于实战经验,大家不妨将接下来的绘图作为一种学习经验,以便于日后总结。
seaborn主要利用heatmap
绘制热图,可以通过seaborn.heatmap了解更多用法
-
不同输入格式的热图
import matplotlib.pyplot as plt import numpy as np import seaborn as sns import pandas as pd np.random.seed(0)sns.set(font='SimHei', font_scale=0.8, style="white") # 解决Seaborn中文显示问题# 初始化 fig = plt.figure(figsize=(12,8))# 宽型:是一个矩阵,其中每一行都是一个个体,每一列都是一个观察值。即热图的每个方块代表一个单元格 df = pd.DataFrame(np.random.random((6,5)), columns=["a","b","c","d","e"])ax = plt.subplot2grid((2, 2), (0, 0), colspan=1) sns.heatmap(df) ax.set_title('宽型')# 方型:相关矩阵热图 df = pd.DataFrame(np.random.random((100,5)), columns=["a","b","c","d","e"]) corr_matrix=df.corr() # 计算相关矩阵ax = plt.subplot2grid((2, 2), (0, 1), colspan=1) sns.heatmap(corr_matrix) ax.set_title('方型')# 方型:对角矩阵 df = pd.DataFrame(np.random.random((100,5)), columns=["a","b","c","d","e"]) corr_matrix=df.corr() # 计算相关矩阵 mask = np.zeros_like(corr_matrix) mask[np.triu_indices_from(mask)] = True # 生成上三角蒙版ax = plt.subplot2grid((2, 2), (1, 0), colspan=1) sns.heatmap(corr_matrix, mask=mask, square=True) ax.set_title('方型-对角矩阵')# 长型:每一行代表一个观测结果,输入三个变量(x,y,z) people = np.repeat(("A","B","C","D","E"),5) feature = list(range(1,6))*5 value = np.random.random(25) df = pd.DataFrame({'feature': feature, 'people': people, 'value': value }) # 数据透视 df_wide = df.pivot_table( index='people', columns='feature', values='value') ax = plt.subplot2grid((2, 2), (1, 1), colspan=1) sns.heatmap(df_wide) ax.set_title('长型')fig.tight_layout() # 自动调整间距 plt.show()
-
自定热图
import matplotlib.pyplot as plt import numpy as np import seaborn as sns import pandas as pd np.random.seed(0)sns.set(font='SimHei', font_scale=0.8, style="white") # 解决Seaborn中文显示问题# 自定义数据 df = pd.DataFrame(np.random.random((10,10)), columns=["a","b","c","d","e","f","g","h","i","j"])# 初始化 fig = plt.figure(figsize=(9,8))# 显示值标签 ax = plt.subplot2grid((3, 2), (0, 0), colspan=1) sns.heatmap(df, annot=True, annot_kws={"size": 7}) ax.set_title('显示值标签')# 自定义网格线 ax = plt.subplot2grid((3, 2), (0, 1), colspan=1) sns.heatmap(df, linewidths=2, linecolor='yellow') ax.set_title('自定义网格线')# 移除x、y或者颜色bar ax = plt.subplot2grid((3, 2), (1, 0), colspan=1) sns.heatmap(df, yticklabels=False, cbar=False) ax.set_title('移除部分轴元素')# 减少标签数量 ax = plt.subplot2grid((3, 2), (1, 1), colspan=1) sns.heatmap(df, xticklabels=4) ax.set_title('减少标签数量')# 指定中心值 ax = plt.subplot2grid((3, 2), (2, 0), colspan=1) sns.heatmap(df, center=1) ax.set_title('指定中心值')# 指定颜色 ax = plt.subplot2grid((3, 2), (2, 1), colspan=1) sns.heatmap(df, cmap="YlGnBu") ax.set_title('指定颜色')fig.tight_layout() # 自动调整间距 plt.show()
-
数据标准化
import matplotlib.pyplot as plt import numpy as np import seaborn as sns import pandas as pd np.random.seed(0)sns.set(font='SimHei', font_scale=0.8, style="white") # 解决Seaborn中文显示问题# 自定义数据 df = pd.DataFrame(np.random.randn(10,10) * 4 + 3) # 列含异常值与标准化 df_col = df.copy() df_col[1]=df_col[1]+40 # 构造异常数据点 df_norm_col=(df_col-df_col.mean())/df_col.std() # 按列标准化 # 行含异常值与标准化 df_row = df.copy() df_row.iloc[2]=df_row.iloc[2]+40 # 构造异常数据点 df_norm_row = df_row.apply(lambda x: (x-x.mean())/x.std(), axis = 1) # 按行标准化# 初始化 fig = plt.figure(figsize=(12,8))# 列含异常数据 ax = plt.subplot2grid((2, 2), (0, 0), colspan=1) sns.heatmap(df_col, cmap='viridis') ax.set_title('列含异常数据')# 按列标准化 ax = plt.subplot2grid((2, 2), (0, 1), colspan=1) sns.heatmap(df_norm_col, cmap='viridis') ax.set_title('按列标准化')# 行含异常数据 ax = plt.subplot2grid((2, 2), (1, 0), colspan=1) sns.heatmap(df_row, cmap='viridis') ax.set_title('行含异常数据')# 按行标准化 ax = plt.subplot2grid((2, 2), (1, 1), colspan=1) sns.heatmap(df_norm_col, cmap='viridis') ax.set_title('按行标准化')fig.tight_layout() # 自动调整间距 plt.show()
-
引申-聚类热图
可以通过seaborn.clustermap了解更多用法
import matplotlib.pyplot as plt import numpy as np import seaborn as sns import pandas as pd# 导入数据 df = pd.read_csv('https://raw.githubusercontent.com/holtzy/The-Python-Graph-Gallery/master/static/data/mtcars.csv') df = df.set_index('model')# 基本聚类热图 g = sns.clustermap(df, standard_scale=1) # 标准化处理plt.show()
总结
以上通过seaborn的heatmap
快速绘制热图,并通过修改参数或者辅以其他绘图知识自定义各种各样的热图来适应相关使用场景。
共勉~