热图(Heatmap)绘制(matplotlib与seaborn)

热图是数据统计中经常使用的一种数据表示方法,它能够直观地反映数据特征,查看数据总体情况,在诸多领域具有广泛应用。

一:matplotlib绘制方法

1.基础绘制

热图用以表示的是矩阵数据,例如相关阵、协差阵等方阵,也可以不是方阵。所以在处理数据前,我们需要将数据转成二维数组形式(二维列表、二维np.array、np.mat、pd.DataFrame等都可以)。

import matplotlib.pyplot as plt
import numpy as np
data=[[1,0.5,0.7],[0.1,0.2,0.3]]
plt.imshow(data)
plt.show()

利用上述代码即可绘制基础的热图。

2.细节补充

(1)标题:plt.title('标题名',loc=,fontdict=fontdict,rotation=,x=,y=),绘制标题。

loc:'left'、'center'、'right',表示标题位置,默认为'center'。

fontdict:设置字体,详见(7)。

rotation:标题逆时针旋转角度,默认为0。

x,y:用于进一步控制标题在画布中的位置。

(2)x轴、y轴坐标

2.1:plt.xticks()与plt.yticks()。用于xy坐标的绘制,如标签位置、颜色等。

plt.xticks(ticks=,labels['label1','label2','label3'],color='red',rotation=45,veritalalignment=,horizontalalignment=,family=,style=,weight=,bbox=)

ticks:x轴各个标签位置,[0,1,2,...]。

labels:各个标签文本,['label1',label2'...]。

color:字体颜色。

rotation:字逆时针旋转角度。

verticalalignment:'center','top','bottom','baseline',标签垂直对齐方式。

horizontalalignment:'center','right','left,标签水平对齐方式。(这两种对齐方式可以使图更加整洁,避免标签参差不齐)。

family:设置字体。

style:字体风格。

weight:字体粗细。

bbox:字体边框,如{'facecolor':'red','alpha':0.5}。

2.2:plt.tick_params(axis=,which=,width=,length=,color=,direction=,bottom=,top=,left=,right=,pad=,labelsize=,lanbelbottom=,labeltop=,labelleft=,labelright=)。修改

axis:'x'、'y'、'both',表示设置哪一坐标轴,默认both。

which:'major'、'minor'、'both',代表设置主刻度线、副刻度线和同时设置,默认为:'major'。

width,length:刻度线长度与宽度。

color:刻度线颜色。

direction:'in'、'out’、'inout',表示刻度线在绘图区内、外或同时显示。

bottom,top,left,right:True、False,表示绘图区4个边框线上刻度线是否显示。默认bottom,left为True,其余False。

pad:刻度线与标签之间距离。(可用于防止标签与绘图区重叠)

labelsize:标签字体大小。

labelcolor:标签字体颜色(同2.1中参数color,若2.1中设置color,此处不必设置)。

labelbottom,labeltop,labelleft,labelright:True、False,表示绘图区4个边框上标签是否显示。

(3)数值与颜色对应规则(热图标尺):plt.colorbar(pad=,location='',orientation=,ticks=,extend=,shrink=,label='标题',format=)

pad:标尺与图之间距离。

location:'left','right','bottom','top',标尺的位置。

orientation:'horizontal','vertical',标尺方向。

ticks:列表,如[0,1,2,3..],显示列表中的刻度。

extend:'max','min','both',展示标尺尖角。

shrink:值为0~1,标尺长度。

label:给标尺一个标签。

format:标尺上刻度格式,如’%.2f'表示保留两位小数。

(4)色块数值显示:plt.text()。由于该函数只能逐个色块添数值标签,所以需要用循环嵌套方法实现。

for i in range(2):
    for j in range(3):
        plt.text(j,i,data[i,j],ha='center',va='center',ha='center',color='white')

在plt.text()中,第一个参数表示x坐标,第二个表示y坐标,第三个为数值标签,ha表示标签水平位置,可以为'left'、'center'、'right',va表示竖直方向位置,可以为 'top'、 'bottom'、'center'、 'baseline',、center_baseline'。va、ha默认为'center'。color:字体颜色。

(5)热图样式:plt.imshow(data,cmap='coolwarm',origin='upper',aspect='auto')

cmap:表示热图颜色风格,其样式众多,详解附录。

origin:热图(0,0)点位置,可以为‘upper'、’lower'。

aspect:图像长宽比,可以为int或float等数值,auto表示自动匹配。

(6)x轴、y轴标题:plt.xlabel('x title',fontdict=fontdict,rotation=0,loc='center',x=0,y=0)与plt.ylabel('y title',fontdict=fontdict,rotation=0,loc='center',x=0,y=1)

fontdict:设置字体,详解(7)。

rotation:标题旋转。

loc表示标题的位置,xlabel中loc为'left'、'center'、'right',ylable中:'bottom'、'center'、'top'。

x,y可以进一步控制标题的位置。

(7)标题字体设置:font={style:'  ',family:'  ',weight:",size: ,color:'  '}

style:字体风格

family:字体样式。

weight:字体粗细,可以为数,也可以用'bond'表示粗体。

size:字体大小。

color:字体颜色。

设置好font后,将其传递给plt.title()、plt.xlabel()等函数中的参数fontdict即可。

(8)画布规格:plt.figure(figsize=,dip=)与plt.gcf().subplots_adjust(left=,right=,bottom=,top=)

figsize:画布大小,(x,y)。

dip:图片放大后失真度,一般为300~400。

left,right,bottom,top:画布边界,避免部分图像无法在画布中显示。left,bottom为下界,一般在0附近,right,top为上界,一般接近1。

3.举例

兔兔以dry bean dataset 数据集为例,作相关阵热图。

data=pd.DataFrame(pd.read_csv('Dry_Bean_Dataset.csv')) #获取数据
data=data.corr() #计算相关阵
labelx=data.columns #变量名
labely=data.columns
n=len(labelx) #变量个数
titlefont={'style':None,'family':'fantasy','weight':1,'size':15,'color':'black'} #设置标题字体
labelfont={'style':None,'family':None,'weight':None,'size':12,'color':'red'} #xy标题字体
plt.figure(figsize=(6,6),dpi=100) #图像大小
plt.gcf().subplots_adjust(left=0.25,right=0.95,bottom=0.19,top=0.8) #设置图像边界
plt.imshow(data,cmap='rainbow',origin='lower',aspect=1) #热图样式

plt.title('Dry Bean Dataset correlation',fontdict=titlefont,loc='center',y=1.11,rotation=0) #标题
plt.xlabel('$Dry \ bean \ variate$',fontdict=labelfont,loc='center',rotation=0)
plt.ylabel('$Dry \ bean \ variate$',fontdict=labelfont,loc='center',rotation=90)

plt.xticks(ticks=np.arange(n),labels=labelx,rotation=45,color='green',horizontalalignment='right')
plt.yticks(ticks=np.arange(n),labels=labely,rotation=0,color='blue',verticalalignment='bottom')
plt.tick_params(axis='both',which='minor',width=2,length=3,color='blue',pad=20,labelsize=9,
                direction='out')
plt.colorbar(pad=0.09,orientation='vertical',ticks=None,label=None,
             extend='max',shrink=0.8,location='right') #热力标尺
plt.tight_layout()
plt.show()

二:seaborn绘制方法

1.基础绘制

与matplotlib相比,seaborn绘制热图简便许多,很多在matplotlib中逐步实现的过程在seaborn中可以直接实现,但是有些功能也需要借助matplotlib,所以实际应用时可以将二者结合起来。

import seaborn as sns
import matplotlib.pyplot as plt
data=[[1,2,3],[4,5,6]]
sns.heatmap(data)
plt.show()

2.细节补充

(1)sns.heatmap(data=,cmap=,annot=,cbar=,fmt=,linewidth=,linecolor=,xlabelticks=,ylabelticks=,vmax=,vmin=,annot_kws=cbar_kws=,mask=,center= )

cmap:热图颜色风格,与matplotlib中cmap相同,详解附录。

annot:True,False,是否显示数值注释,默认为False。

cbar:True,False 是否显示标尺,默认为True。

linewidth:每个小方格之间的间距。

linecolor:分割线的颜色。

xlabelticks,ylabelticks:热图标签,['label1',label2',....],若data为pd.DataFrame且设置好columns与index,则直接显示标签,可以不用此参数。

vmax,vmin:标尺中最大值与最小值显示值。

annot_kws:{'color':'  ','size':  ,'family':'  ','style':'  ','weight':  ,......},单元格数值标签属性。与matplotlib中字体设置的各个参数、值是一致的,这里以字典形式输入。

cbar_kws:{'orientation':'  ','shrink': '  ' ,'extend:'  ','location':'  ',......}标尺设置。与matplotlib中colorcar()中的各个参数、值是一致的,在这里以字典的形式输入。

mask:True,False,或布尔矩阵mask(与热图数据维数相同,值为Ture,False或0,1等数字的二维数组)。默认为False,Ture则不显示数据。对于矩阵mask,若对应位置为False,则显示该数据。

center:将数据设置为均值数据,调整生成图像颜色的整体深浅。

3.举例

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
data=pd.DataFrame(pd.read_csv('Dry_Bean_Dataset.csv'))
data=data.corr()
plt.title('Dry bean dataset',rotation=0)
mask=np.ones((16,16))
for i in range(16):
    for j in range(i+1):
        mask[i,j]=0
sns.heatmap(data=data,cmap='YlGnBu',annot=True,linewidth=0.9,linecolor='white',
            cbar=True,vmax=None,vmin=None,center=0,square=True,
            mask=mask,robust=True,
            annot_kws={'color':'white','size':1,'family':None,'style':None,'weight':10},
            cbar_kws={'orientation':'vertical','shrink':1,'extend':'max','location':'right'})
plt.show()

附录:

1.cmap参数值(热图颜色风格)

'Accent', 'Accent_r', 'Blues', 'Blues_r', 'BrBG', 'BrBG_r', 'BuGn', 'BuGn_r', 'BuPu', 'BuPu_r', 'CMRmap','CMRmap_r', 'Dark2', 'Dark2_r', 'GnBu', 'GnBu_r', 'Greens', 'Greens_r', 'Greys', 'Greys_r', 'OrRd', 'OrRd_r', 'Oranges', 'Oranges_r','PRGn', 'PRGn_r', 'Paired', 'Paired_r', 'Pastel1', 'Pastel1_r', 'Pastel2', 'Pastel2_r', 'PiYG', 'PiYG_r', 'PuBu', 'PuBuGn', 'PuBuGn_r','PuBu_r', 'PuOr', 'PuOr_r', 'PuRd', 'PuRd_r', 'Purples', 'Purples_r', 'RdBu', 'RdBu_r', 'RdGy', 'RdGy_r', 'RdPu', 'RdPu_r','RdYlBu', 'RdYlBu_r', 'RdYlGn', 'RdYlGn_r', 'Reds', 'Reds_r', 'Set1', 'Set1_r', 'Set2', 'Set2_r', 'Set3', 'Set3_r', 'Spectral','Spectral_r', 'Wistia', 'Wistia_r', 'YlGn', 'YlGnBu', 'YlGnBu_r', 'YlGn_r', 'YlOrBr', 'YlOrBr_r', 'YlOrRd', 'YlOrRd_r', 'afmhot','afmhot_r', 'autumn', 'autumn_r', 'binary', 'binary_r', 'bone', 'bone_r', 'brg', 'brg_r', 'bwr', 'bwr_r', 'cividis', 'cividis_r','cool', 'cool_r', 'coolwarm', 'coolwarm_r', 'copper', 'copper_r', 'cubehelix', 'cubehelix_r', 'flag', 'flag_r', 'gist_earth', 'gist_earth_r','gist_gray', 'gist_gray_r', 'gist_heat', 'gist_heat_r', 'gist_ncar', 'gist_ncar_r', 'gist_rainbow', 'gist_rainbow_r', 'gist_stern','gist_stern_r', 'gist_yarg', 'gist_yarg_r', 'gnuplot', 'gnuplot2', 'gnuplot2_r', 'gnuplot_r', 'gray', 'gray_r', 'hot','hot_r', 'hsv', 'hsv_r', 'inferno', 'inferno_r', 'jet', 'jet_r', 'magma', 'magma_r', 'nipy_spectral', 'nipy_spectral_r', 'ocean','ocean_r', 'pink', 'pink_r', 'plasma', 'plasma_r', 'prism', 'prism_r', 'rainbow', 'rainbow_r', 'seismic', 'seismic_r', 'spring', 'spring_r', 'summer', 'summer_r', 'tab10', 'tab10_r', 'tab20', 'tab20_r', 'tab20b', 'tab20b_r', 'tab20c', 'tab20c_r', 'terrain', 'terrain_r', 'turbo', 'turbo_r', 'twilight', 'twilight_r', 'twilight_shifted','twilight_shifted_r', 'viridis', 'viridis_r', 'winter', 'winter_r',......

2.字体family

'Times New Roman','serif','fantasy','sans-serif','cursive','monospace',......

3.字体style

'normal','italic','oblique',......

4.color

'red','blue','green',......

猜你喜欢

转载自blog.csdn.net/weixin_60737527/article/details/126048311