如何将它们保留在sns.heatmap的对角线上?

时间:2019-03-01 16:12:10

标签: python python-3.x matplotlib seaborn correlation

我想用sns.heatmap绘制相关矩阵并有一些问题。这是我的代码:

plt.figure(figsize=(8,8)) mask =np.zeros_like(data.corr()) mask[np.triu_indices_from(mask)] = True sns.heatmap(data.corr(), mask=mask, linewidth=1, annot=True, fmt=".2f",cmap='coolwarm',vmin=-1, vmax=1) plt.show()

这就是我得到的:  [相关矩阵] [1]   [1]:https://i.stack.imgur.com/DX2oN.png \

现在我有一些问题:

1)我该如何将它们放在对角线上?

2)如何更改x轴的位置?

3)我希望颜色栏从1到-1,但是代码不起作用

我希望有人能提供帮助。

Thx

2 个答案:

答案 0 :(得分:1)

我认为您必须检查data.corr(),因为您的代码正确并且可以诊断(请参阅下文)。一个问题是:您使用np.triu,但显示的图片显示np.tirl

这是我测试过的代码-对角线在这里:

N = 5
A = np.arange(N*N).reshape(N,N)

B = np.tril(A)

mask =np.zeros_like(A)
mask[np.triu_indices_from(mask)] = True

print('A'); print(A); print()
print('tril(A)'); print(B); print()
print('mask'); print(mask); print()

给予

A
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]

tril(A)
[[ 0  0  0  0  0]
 [ 5  6  0  0  0]
 [10 11 12  0  0]
 [15 16 17 18  0]
 [20 21 22 23 24]]

mask
[[1 1 1 1 1]
 [0 1 1 1 1]
 [0 0 1 1 1]
 [0 0 0 1 1]
 [0 0 0 0 1]]

修改:补充

您可以重新调整蒙版,例如

C = A *mask
D = np.where(C > 1, 1,C)
print('D'); print(D)

给予

D
[[0 1 1 1 1]
 [0 1 1 1 1]
 [0 0 1 1 1]
 [0 0 0 1 1]
 [0 0 0 0 1]]

D的对角线的第一个元素现在为零,因为A的对角线的第一个元素也为零。

编辑:补充2

F = np.tril(A,-1)
E = np.eye(N)
G = E + F

print('F'); print(F); print()
print('E'); print(E); print()
print('G'); print(G); print()

给予

F
[[ 0  0  0  0  0]
 [ 5  0  0  0  0]
 [10 11  0  0  0]
 [15 16 17  0  0]
 [20 21 22 23  0]]

E
[[1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]]

G
[[ 1.  0.  0.  0.  0.]
 [ 5.  1.  0.  0.  0.]
 [10. 11.  1.  0.  0.]
 [15. 16. 17.  1.  0.]
 [20. 21. 22. 23.  1.]]

答案 1 :(得分:0)

x轴位置的更改

由于我对Seaborn没有任何经验,因此我将使用matplotlib绘制热图(here an example),然后使用matplotlib的twinx()twiny()将轴放置在您想要的位置拥有它(here an example)。

(我想也可以用seaborn来完成-我只是不知道)