0 前言
鉴于Matlab画图已经被封,自此画图战线全部转移到Python上来,这篇博客描述了Python画热力图的方法以及我踩到的坑。
1 程序
1.1 导入包
这里使用seaborn的heatmap函数绘制
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
1.2 载入CSV文件
这里替换自己要画的矩阵,选择好index_col。及矩阵的每一行每一列是什么,要考虑好。
df_2 = pd.read_csv('HeatMap.csv',index_col='Model')
1.3 绘制热力图
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
p1 = sns.heatmap(df_2,annot=True,ax=ax)
ax.set_title('Heat Map')
ax.set_xlabel('')
ax.set_ylabel('')
1.4 保存
先获取活动图,再用savefig保存
s1 = p1.get_figure()
s1.savefig('HeatMap.jpg',dpi=300,bbox_inches='tight')
2 踩到的坑
2.1 CSV文件格式问题
首先是CSV文件编码,最好不要直接把excel重命名成csv,而是另存为csv,因为excel的编码方式与CSV不同,如果直接重命名可能导致read_csv函数爆编码错误。
CSV文件内容问题,尤其是矩阵各行各列的标题,可以不保留标题,后续再使用函数添加,也可以在CSV文件中定义好,读取的时候选择好index_col。
2.2 画图问题
变量ax的目的是确定好坐标轴,使用sns.heatmap指定好坐标轴,各参数的作用再后文参考文献中。
2.3 保存图像不完整问题
我遇到了保存图像不完整的问题,一开始以为是版本问题,后来发现,直接在jupyter notebook中显示时一切正常,但是保存后发现左边不完整,才知道是保存的问题。
s1.savefig('HeatMap.jpg',dpi=300,bbox_inches='tight')
在这里指定 bbox_inches='tight’后,Bug修复,一切结束。
3 参考
关于seaborn.heatmap函数的详细解读
参考:
[1]、函数解读:看这里
[2]、保存不完整,看这里
seaborn.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)
(1)热力图输入数据参数:
data:矩阵数据集,可以是numpy的数组(array),也可以是pandas的DataFrame。如果是DataFrame,则df的index/column信息会分别对应到heatmap的columns和rows,即pt.index是热力图的行标,pt.columns是热力图的列标
(2)热力图矩阵块颜色参数: vmax,vmin:分别是热力图的颜色取值最大和最小范围,默认是根据data数据表里的取值确定
cmap:从数字到色彩空间的映射,取值是matplotlib包里的colormap名称或颜色对象,或者表示颜色的列表;改参数默认值:根据center参数设定
center:数据表取值有差异时,设置热力图的色彩中心对齐值;通过设置center值,可以调整生成的图像颜色的整体深浅;设置center数据时,如果有数据溢出,则手动设置的vmax、vmin会自动改变
robust:默认取值False;如果是False,且没设定vmin和vmax的值,热力图的颜色映射范围根据具有鲁棒性的分位数设定,而不是用极值设定
(3)热力图矩阵块注释参数:
annot(annotate的缩写):默认取值False;如果是True,在热力图每个方格写入数据;如果是矩阵,在热力图每个方格写入该矩阵对应位置数据
fmt:字符串格式代码,矩阵上标识数字的数据格式,比如保留小数点后几位数字
annot_kws:默认取值False;如果是True,设置热力图矩阵上数字的大小颜色字体,matplotlib包text类下的字体设置;官方文档:
(4)热力图矩阵块之间间隔及间隔线参数: linewidths:定义热力图里“表示两两特征关系的矩阵小块”之间的间隔大小
linecolor:切分热力图上每个矩阵小块的线的颜色,默认值是’white’
(5)热力图颜色刻度条参数: cbar:是否在热力图侧边绘制颜色刻度条,默认值是True
cbar_kws:热力图侧边绘制颜色刻度条时,相关字体设置,默认值是None
cbar_ax:热力图侧边绘制颜色刻度条时,刻度条位置设置,默认值是None
(6)square:设置热力图矩阵小块形状,默认值是False xticklabels,
yticklabels:xticklabels控制每列标签名的输出;yticklabels控制每行标签名的输出。默认值是auto。如果是True,则以DataFrame的列名作为标签名。如果是False,则不添加行标签名。如果是列表,则标签名改为列表中给的内容。如果是整数K,则在图上每隔K个标签进行一次标注。
如果是auto,则自动选择标签的标注间距,将标签名不重叠的部分(或全部)输出
mask:控制某个矩阵块是否显示出来。默认值是None。如果是布尔型的DataFrame,则将DataFrame里True的位置用白色覆盖掉
ax:设置作图的坐标轴,一般画多个子图时需要修改不同的子图的该值
**kwargs:All other keyword arguments are passed to ax.pcolormesh