画图笔记第三篇,主要记录了热图和聚类热图的绘制方法,同样使用Iris数据集作为示例。
Seaborn 中文文档:https://seaborn.apachecn.org/#/README
seaborn + matplotlib 画图(一): 小提琴图,箱型图
seaborn + matplotlib 画图(二): 柱状图,散点图
seaborn + matplotlib 画图(三): 热图
1. 导入所需包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
2. 载入Iris数据
df = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None)
df.columns = ['sepal_length','sepal_width','petal_length','petal_width','class']
print(df.shape)
print(df.head())
print(df['class'].value_counts())
-----outputs-----
(150, 5)
sepal_length sepal_width petal_length petal_width class
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosa
Iris-virginica 50
Iris-setosa 50
Iris-versicolor 50
Name: class, dtype: int64
3. heatmap热图
取前5行前4列绘制热图:
sns.heatmap(df.iloc[:5,:4], #传入数据
cmap='Blues', #设置colormap
linewidths=1, #线宽
linecolor='k', #线颜色
square=True, #是否为方形
vmin=0, vmax=6, #设置color bar的范围
annot=df.iloc[:5,:4].values, fmt='') #添加文字标注
plt.yticks(ticks=[0.5,1.5,2.5,3.5,4.5], #设置y轴刻度
labels=df['id'][:5], #'id'列是第一篇笔记中加入的
rotation=0,
fontsize=12)
plt.xticks(ticks=[0.5,1.5,2.5,3.5], #设置x轴刻度
labels=['Sepal length','Sepal width','Petal length','Petal width'],
rotation=60,
rotation_mode='anchor',
va='center', ha='right',
fontsize=12)
plt.ylabel('Ylabel',fontsize=18)
plt.xlabel('Xlabel',fontsize=18)
ax = plt.gca()
ax.xaxis.set_label_coords(0.5, 1.15) #设置xlabel的位置
# ax.yaxis.set_label_coords(-0.1, 0.5) #设置ylabel位置
plt.show()
heatmap
4. clustermap聚类热图
聚类热图可以对行和列进行聚类:
row_color_list = [pal[i] for i in df['class']]
g = sns.clustermap(df.iloc[:,0:4], #传入数据
cmap='viridis', #color map
row_colors = row_color_list, #设置每行的颜色
z_score=1, #z_score: 0对行z-score,1对列z-score
center=0,vmin=-3, vmax=3, #设置color bar的范围以及中心值
xticklabels=True, yticklabels=False, #是否显示x/y轴刻度标签
col_cluster=True, row_cluster=True, #是否对列/行聚类
method='average',metric='euclidean', #聚类算法
cbar_pos=(1.03, 0.75, 0.05, 0.2), #前两位是color bar左下角的坐标,后两位分别是宽和长
tree_kws={'linewidths':0.5}, # 树的线宽
dendrogram_ratio=(0.1,0.1), # 树的高度(row,col)
colors_ratio=0.02) # 行/列color标签的高度(row,col)
pal = {'Iris-setosa':'lightcoral','Iris-versicolor':'navajowhite','Iris-virginica':'cornflowerblue'}
for iris,color in pal.items(): #自定义图注
g.ax_row_dendrogram.bar(0,0, color=color, label=iris, linewidth=3)
g.ax_row_dendrogram.legend(loc='center left', bbox_to_anchor=(10.5,0.5), ncol=1, frameon=False,fontsize=12)
g.ax_heatmap.set_xticklabels(g.ax_heatmap.get_xmajorticklabels(), #可以传入列表作为x轴刻度标签
fontsize = 15) #设置x轴刻度字体大小
plt.show()
clustermap
网友评论