提问者:小点点

利用熊猫绘制相关矩阵


我有一个具有大量特征的数据集,因此分析相关矩阵变得非常困难。我想绘制一个相关矩阵,我们使用熊猫库中的dataframe. corr()函数获得。熊猫库提供了任何内置函数来绘制这个矩阵吗?


共3个答案

匿名用户

您可以使用matplotlib中的pyplot. matshow()

import matplotlib.pyplot as plt

plt.matshow(dataframe.corr())
plt.show()

编辑:

评论中有一个关于如何更改轴刻度标签的请求。这是一个豪华版本,它绘制在更大的图形尺寸上,具有与数据框匹配的轴标签,以及解释色阶的色标图例。

我包括如何调整标签的大小和旋转,我正在使用一个图形比率,使彩色条和主图形的高度相同。

编辑2:由于df. corr()方法忽略非数字列,因此在定义x和y标签时应使用.select_dtypes(['number']),以避免不必要的标签偏移(包含在下面的代码中)。

f = plt.figure(figsize=(19, 15))
plt.matshow(df.corr(), fignum=f.number)
plt.xticks(range(df.select_dtypes(['number']).shape[1]), df.select_dtypes(['number']).columns, fontsize=14, rotation=45)
plt.yticks(range(df.select_dtypes(['number']).shape[1]), df.select_dtypes(['number']).columns, fontsize=14)
cb = plt.colorbar()
cb.ax.tick_params(labelsize=14)
plt.title('Correlation Matrix', fontsize=16);

匿名用户

如果您的主要目标是可视化相关矩阵,而不是创建绘图本身,方便的熊猫样式选项是一个可行的内置解决方案:

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

请注意,这需要在支持呈现超文本标记语言的后端,例如JupyterLab Notebook。

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

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

或者如果您更喜欢没有注释的矩阵,则完全去掉数字:

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

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

在我的测试中,style.background_gradient()plt. matshow()快4倍,比10x10矩阵的sns.heatmap()快120倍。不幸的是,它的缩放速度不如plt.matshow():对于100x100矩阵,两者花费的时间大致相同,而plt.matshow()对于1000x1000矩阵快10倍。

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

  • 返回超文本标记语言,附加del()方法,然后将输出写入文件。
  • 通过附加to_excel()方法,保存为带有条件格式的. xslx文件。
  • 与imgkit结合保存位图
  • 截图(就像我在这里做的那样)。

通过设置轴=无,现在可以根据整个矩阵而不是每列或每行计算颜色:

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(color='#f1f1f1')  # Color NaNs grey
 .format(precision=2))

匿名用户

海洋热图版本:

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