利用Pandas绘制相关矩阵

rjzwgtxy  于 2022-09-21  发布在  其他
关注(0)|答案(17)|浏览(226)

我有一个包含大量特征的数据集,因此分析相关矩阵变得非常困难。我想画一个相关矩阵,它是我们使用Pandas图书馆的dataframe.corr()函数得到的。Pandas图书馆有没有内置的函数来绘制这个矩阵?

juzqafwq

juzqafwq16#

Seborn的热图版本:

import seaborn as sns
corr = dataframe.corr()
sns.heatmap(corr, 
            xticklabels=corr.columns.values,
            yticklabels=corr.columns.values)
omjgkv6w

omjgkv6w17#

如果您的主要目标是可视化关联矩阵,而不是创建曲线图本身,那么方便的pandasstyling options是一个可行的内置解决方案:

import pandas as pd
import numpy as np

rs = np.random.RandomState(0)
df = pd.DataFrame(rs.rand(10, 10))
corr = df.corr()
corr.style.background_gradient(cmap='coolwarm')

# 'RdBu_r', 'BrBG_r', & PuOr_r are other good diverging colormaps

请注意,这需要位于支持呈现HTML的后端,例如JupyterLab Notebook。

造型

您可以轻松地限制数字精度:

corr.style.background_gradient(cmap='coolwarm').set_precision(2)

或者,如果您更喜欢不带注解的矩阵,则完全去掉数字:

corr.style.background_gradient(cmap='coolwarm').set_properties(**{'font-size': '0pt'})

样式文档还包括更高级样式的说明,例如如何更改鼠标指针悬停在其上的单元格的显示。

时间对比

在我的测试中,使用10x10矩阵的style.background_gradient()plt.matshow()快4倍,比sns.heatmap()快120倍。遗憾的是,plt.matshow()的可扩展性不如plt.matshow():100x100矩阵的速度与plt.matshow()相同,而1000x1000矩阵的plt.matshow()速度则快10倍。

节省时间

有几种可能的方法可以保存风格化的 Dataframe :

  • 通过追加render()方法返回HTML,然后将输出写入文件。
  • 通过追加to_excel()方法,以条件格式另存为.xslx文件。
  • Combine with imgkit to save a bitmap
  • 截屏(就像我在这里所做的那样)。

整矩阵归一化颜色(Pandas>=0.24)

通过设置axis=None,现在可以基于整个矩阵而不是按列或按行计算颜色:

corr.style.background_gradient(cmap='coolwarm', axis=None)

单角热图

由于很多人都在阅读这个答案,我想我应该加上一个提示,告诉你如何只显示相关性矩阵的一角。我觉得我自己读起来更容易,因为它去掉了多余的信息。


# Fill diagonal and upper half with NaNs

mask = np.zeros_like(corr, dtype=bool)
mask[np.triu_indices_from(mask)] = True
corr[mask] = np.nan
(corr
 .style
 .background_gradient(cmap='coolwarm', axis=None, vmin=-1, vmax=1)
 .highlight_null(null_color='#f1f1f1')  # Color NaNs grey
 .set_precision(2))

相关问题