用pandas绘制相关矩阵

2024-03-28 14:32:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 数据函数dataframepandas图书馆绘制矩阵特征
3条回答

如果您的主要目标是可视化相关矩阵,而不是创建一个图本身,那么方便的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' are other good diverging colormaps

enter image description here

注意,这需要在支持呈现HTML的后端,比如JupyterLab笔记本。(深色背景上的自动亮文本来自现有的PR,而不是最新发布的版本,pandas0.23)。


造型

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

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

enter image description here

或者,如果您更喜欢不带注释的矩阵,请完全去掉这些数字:

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

enter image description here

样式文档还包括更高级样式的说明,例如如何更改鼠标指针悬停在其上的单元格的显示。要保存输出,可以通过附加render()方法返回HTML,然后将其写入文件(或者只为不太正式的目的截图)。


时间比较

在我的测试中,style.background_gradient()plt.matshow()快4倍,比sns.heatmap()快120倍,矩阵为10x10。不幸的是,它的伸缩性不如plt.matshow()好:对于100x100矩阵,这两种方法花费的时间差不多,而对于1000x1000矩阵,plt.matshow()则要快10倍。


保存

有几种可能的方法可以保存样式化的数据帧:

  • 通过附加render()方法返回HTML,然后将输出写入文件。
  • 通过附加to_excel()方法,保存为具有条件格式的.xslx文件。
  • Combine with imgkit to save a bitmap
  • 截图(不太正式)。

熊猫更新>;=0.24

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

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

enter image description here

尝试此函数,它还显示相关矩阵的变量名:

def plot_corr(df,size=10):
    '''Function plots a graphical correlation matrix for each pair of columns in the dataframe.

    Input:
        df: pandas DataFrame
        size: vertical and horizontal size of the plot'''

    corr = df.corr()
    fig, ax = plt.subplots(figsize=(size, size))
    ax.matshow(corr)
    plt.xticks(range(len(corr.columns)), corr.columns);
    plt.yticks(range(len(corr.columns)), corr.columns);

可以使用matplotlib中的^{}

import matplotlib.pyplot as plt

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

编辑:

在评论中有一个关于如何更改轴刻度标签的请求。这是一个豪华版,绘制在一个更大的数字大小,有轴标签,以匹配数据帧,和一个颜色条图例,以解释颜色比例。

我将介绍如何调整标签的大小和旋转,并使用一个数字比例,使颜色栏和主图形的高度相同。

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

correlation plot example

相关问题 更多 >