【画图】Python绘制热力图方法以及保存不全问题(seaborn.heatmap)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章