python科研作图系列-01热力图相关性分析

参考

数据样本和分析结果

本学渣补充数学知识点:
1 Pearson Correlation(皮尔逊相关系数),详见

这里我自己先创建一个表格,
在这里插入图片描述

重点关注A和B,因为我输入的时候是线性相关的,
CDE 三个栏完全随机,
F 和 G 有一定相关性,但是不如A和B那么明显,
H,I,J 也是乱输入的完全随机。

给出两个代码结果,分别是
给出显著性和不给出显著性的运行结果:
运行一下看看:
不给出显著性的结果:
在这里插入图片描述
给出显著性的结果:
在这里插入图片描述
两个图对比发现图二多了一些星星
代表相关性等级,F和G 的相关性没有A和B高,这和我之前预想的结果一样。

代码的讲解

下面用到的基础知识和函数参数补充:

  • pandas——相关系数函数corr(),可选参数(不加默认第一个)代表不同的相关性系数。
    本例代码中用法按默认来的, df_coor=df.corr()返回值是一个相关系数的矩阵
    API详见
  • 相关系数的数学公式补充
  • plt.figure()参数 说明
  • 注意 重点: plt.gca() 获取当前坐标轴,目的是为了便于下一步的移动,效果如下图,感觉秀婷学姐的图可以用这个函数画,具体怎么移动的代码,详见知乎大佬,我下个代码专门琢磨一下帮秀婷学姐搞一搞
    在这里插入图片描述
  • np.zeros_like(),返回一个和传入的矩阵 形状一样,但是值全为0的矩阵,详见
  • np.triu_indices_from(mask):返回方阵的上三角矩阵的索引,API详见具体用法
  • np.flipud() 用于翻转列表,将矩阵进行上下翻转,详见
  • np.rot90()将矩阵img逆时针旋转90°
  • sns.heatmap()这里的参数除了data以外,其他的都有默认值,所以首先会用基础的,知道怎么传递data是第一步。详见
  • 补充一个sns.heatmap()函数用到的参数mask:用于突出显示某些数据,详见
  • ax1.tick_params()参数,both 是指对横轴和纵轴都操作,后面的参数是长度,其余参数详见

mask那一坨代码完成了两件事:
1 去重
2 去掉一半的矩阵,如果不去掉的效果类似这样
在这里插入图片描述
或者这样
在这里插入图片描述
去掉一半显得更加简洁明了

附代码和运行结果

代码:


import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import pearsonr
import matplotlib as mpl

def cm2inch(x,y):
    return x/2.54,y/2.54

size1 = 10.5
#这块设置字体的,人家设置的本来已经很漂亮了,暂时不关注
mpl.rcParams.update(
{
'text.usetex': False,
'font.family': 'stixgeneral',
'mathtext.fontset': 'stix',
"font.family":'serif',
"font.size": size1,
"font.serif": ['Times New Roman'],
}
)
fontdict = {'weight': 'bold','size':size1,'family':'SimHei'}

#这个地方,放你的Excel文件路径
fp = r'E:\data\test.xlsx'
#这个地方放你的表格里面sheet名称,默认是‘sheet1’,一般不用修改
df = pd.read_excel(fp,sheet_name='Sheet1',header = 0)
#这个函数可选参数为你要使用的相关系数,返回一个含有相关系数的矩阵
df_coor=df.corr()
#指定画图的尺寸,详见博客
fig = plt.figure(figsize=(cm2inch(16,12)))
#plt.gca( )中完成,gca就是get current axes的意思
#先获取当前轴,便于下一步移动,作出你想要的效果。
ax1 = plt.gca()

#构造mask,去除重复数据显示
#返回一个类似形状的元素全为0的矩阵,详见博客
mask = np.zeros_like(df_coor)
print('step1')
print(mask)
#把这个全0元素矩阵的上三角部分赋值为1(也就是true)
mask[np.triu_indices_from(mask)] = True
#用一个mask2 来接收  这个 上三角元素都为1的矩阵
print('step2')
print(mask)
mask2 = mask
# 从这开始 我也看不懂了 每一步都知道啥意思,但是连起来就不知道了
#但是不影响,每次运行完 我加一个print语句输出这个mask是啥,这样就清晰了
mask = (np.flipud(mask)-1)*(-1)
print('step3')
print(mask)
mask = np.rot90(mask,k = -1)
print('step4-------')
print(mask)

im1 = sns.heatmap(df_coor,annot=True,cmap="RdBu"
, mask=mask#构造mask,去除重复数据显示
,vmax=1,vmin=-1
, fmt='.2f',ax = ax1)

ax1.tick_params(axis = 'both', length=0)
#此处填写保存文件的路径
plt.savefig(r'E:\data\r_demo.png',dpi=600)
plt.show()

运行结果:

step1
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
step2
[[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [0. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [0. 0. 1. 1. 1. 1. 1. 1. 1. 1.]
 [0. 0. 0. 1. 1. 1. 1. 1. 1. 1.]
 [0. 0. 0. 0. 1. 1. 1. 1. 1. 1.]
 [0. 0. 0. 0. 0. 1. 1. 1. 1. 1.]
 [0. 0. 0. 0. 0. 0. 1. 1. 1. 1.]
 [0. 0. 0. 0. 0. 0. 0. 1. 1. 1.]
 [0. 0. 0. 0. 0. 0. 0. 0. 1. 1.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]]
step3
[[ 1.  1.  1.  1.  1.  1.  1.  1.  1. -0.]
 [ 1.  1.  1.  1.  1.  1.  1.  1. -0. -0.]
 [ 1.  1.  1.  1.  1.  1.  1. -0. -0. -0.]
 [ 1.  1.  1.  1.  1.  1. -0. -0. -0. -0.]
 [ 1.  1.  1.  1.  1. -0. -0. -0. -0. -0.]
 [ 1.  1.  1.  1. -0. -0. -0. -0. -0. -0.]
 [ 1.  1.  1. -0. -0. -0. -0. -0. -0. -0.]
 [ 1.  1. -0. -0. -0. -0. -0. -0. -0. -0.]
 [ 1. -0. -0. -0. -0. -0. -0. -0. -0. -0.]
 [-0. -0. -0. -0. -0. -0. -0. -0. -0. -0.]]
step4-------
[[-0.  1.  1.  1.  1.  1.  1.  1.  1.  1.]
 [-0. -0.  1.  1.  1.  1.  1.  1.  1.  1.]
 [-0. -0. -0.  1.  1.  1.  1.  1.  1.  1.]
 [-0. -0. -0. -0.  1.  1.  1.  1.  1.  1.]
 [-0. -0. -0. -0. -0.  1.  1.  1.  1.  1.]
 [-0. -0. -0. -0. -0. -0.  1.  1.  1.  1.]
 [-0. -0. -0. -0. -0. -0. -0.  1.  1.  1.]
 [-0. -0. -0. -0. -0. -0. -0. -0.  1.  1.]
 [-0. -0. -0. -0. -0. -0. -0. -0. -0.  1.]
 [-0. -0. -0. -0. -0. -0. -0. -0. -0. -0.]]

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方-教育技术博主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值