Python 用pandas绘制相关矩阵

Python 用pandas绘制相关矩阵,python,pandas,matplotlib,data-visualization,information-visualization,Python,Pandas,Matplotlib,Data Visualization,Information Visualization,我有一个具有大量特征的数据集,因此分析相关矩阵变得非常困难。我想绘制一个相关矩阵,我们使用pandas库中的dataframe.corr()函数得到它。pandas库是否提供了任何内置函数来绘制此矩阵?您可以从matplotlib使用: import matplotlib.pyplot as plt plt.matshow(dataframe.corr()) plt.show() 编辑: 在评论中,有一个关于如何更改轴刻度标签的请求。这是一个豪华版,绘制在更大的图形尺寸上,具有轴标签以匹配

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

您可以从
matplotlib
使用:

import matplotlib.pyplot as plt

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

编辑:

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

我包括了如何调整标签的大小和旋转,我使用了一个图形比率,使颜色条和主图形显示出相同的高度


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


尝试此功能,它还显示相关矩阵的变量名称:

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);

Seaborn的热图版本:

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

您可以通过从seaborn绘制热图或从pandas绘制散射矩阵来观察要素之间的关系

散射矩阵:

pd.scatter_matrix(dataframe, alpha = 0.3, figsize = (14,8), diagonal = 'kde');
如果你想可视化每个特征的偏斜度,也可以使用seaborn Pairplot

sns.pairplot(dataframe)
Sns热图:

import seaborn as sns

f, ax = pl.subplots(figsize=(10, 8))
corr = dataframe.corr()
sns.heatmap(corr, mask=np.zeros_like(corr, dtype=np.bool), cmap=sns.diverging_palette(220, 10, as_cmap=True),
            square=True, ax=ax)
输出将是特征的相关图。i、 e.参见下面的示例

食品杂货和洗涤剂之间的相关性很高。同样地:

具有高相关性的PDO产品:
  • 食品杂货和洗涤剂 具有中等相关性的产品:
  • 牛奶和食品杂货
  • 牛奶和洗涤剂用纸
  • 相关性低的产品:
  • 牛奶和熟食
  • 冷冻的和新鲜的
  • 冷冻和熟食 从pairplot:您可以从pairplot或散布矩阵中观察相同的关系集。但是从这些我们可以说数据是否正态分布


    注:以上是从数据中提取的相同图表,用于绘制热图。

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

    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
    

    请注意,这需要位于支持呈现HTML的后端,例如JupyterLab笔记本。(深色背景上的自动浅色文本来自现有PR,而不是最新发布的版本,
    pandas
    0.23)


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

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

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

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

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


    时间比较 在我的测试中,
    style.background\u gradient()
    plt.matshow()快4倍,比
    sns.heatmap()快120倍,矩阵为10x10。不幸的是,它的伸缩性不如
    plt.matshow()
    :对于100x100矩阵而言,这两种方法所需的时间大致相同,而对于1000x1000矩阵而言,
    plt.matshow()
    要快10倍


    拯救 保存样式化数据框有几种可能的方法:

    • 通过附加
      render()
      方法返回HTML,然后将输出写入文件
    • 通过将
      附加到_excel()
      方法,将其另存为具有条件格式的
      .xslx
      文件
    • 拍摄一张屏幕截图(用于不太正式的目的)

    熊猫更新>=0.24 通过设置
    axis=None
    ,现在可以基于整个矩阵而不是每列或每行计算颜色:

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

    您可以使用matplotlib中的imshow()方法

    import pandas as pd
    import matplotlib.pyplot as plt
    plt.style.use('ggplot')
    
    plt.imshow(X.corr(), cmap=plt.cm.Reds, interpolation='nearest')
    plt.colorbar()
    tick_marks = [i for i in range(len(X.columns))]
    plt.xticks(tick_marks, X.columns, rotation='vertical')
    plt.yticks(tick_marks, X.columns)
    plt.show()
    

    如果您的数据帧是
    df
    ,您可以简单地使用:

    import matplotlib.pyplot as plt
    import seaborn as sns
    
    plt.figure(figsize=(15, 10))
    sns.heatmap(df.corr(), annot=True)
    

    statmodels图形还提供了相关矩阵的良好视图

    import statsmodels.api as sm
    import matplotlib.pyplot as plt
    
    corr = dataframe.corr()
    sm.graphics.plot_corr(corr, xnames=list(corr.columns))
    plt.show()
    

    为完整起见,我所知道的2019年末最简单的解决方案,如果使用:


    与其他方法一样,使用pairplot也很好,它将为所有情况提供散点图-

    import pandas as pd
    import numpy as np
    import seaborn as sns
    rs = np.random.RandomState(0)
    df = pd.DataFrame(rs.rand(10, 10))
    sns.pairplot(df)
    

    形成相关矩阵,在我的例子中,zdf是我需要执行相关矩阵的数据帧

    corrMatrix =zdf.corr()
    corrMatrix.to_csv('sm_zscaled_correlation_matrix.csv');
    html = corrMatrix.style.background_gradient(cmap='RdBu').set_precision(2).render()
    
    # Writing the output to a html file.
    with open('test.html', 'w') as f:
       print('<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-widthinitial-scale=1.0"><title>Document</title></head><style>table{word-break: break-all;}</style><body>' + html+'</body></html>', file=f)
    
    corrMatrix=zdf.corr()
    corrMatrix.to_csv('sm_zscaled_correlation_matrix.csv');
    html=corrMatrix.style.background\u gradient(cmap='RdBu')。set\u precision(2.render())
    #将输出写入html文件。
    将open('test.html','w')作为f:
    打印('Documenttable{word break:break all;}'+html+'',file=f)
    

    然后我们可以截图。或者将html转换为图像文件。

    惊讶地发现,没有人提到更具功能、互动性和更易于使用的替代方案

    A) 您可以使用plotly:
  • 只要两行,您就可以得到:

  • 互动性

  • 平滑比例

  • 基于整个数据帧而不是单个列的颜色

  • 轴上的列名和行索引

  • 放大

  • 淘金

  • 内置一键式功能,可将其保存为PNG格式

  • 自动缩放

  • 悬停比较,

  • 气泡显示值,所以热图看起来仍然很好,您可以看到 无论您想在哪里使用价值观:

  • B) 您也可以使用Bokeh: 所有相同的功能都有点麻烦。但如果您不想选择plotly,并且仍然想要所有这些东西,那么仍然值得:

    from bokeh.plotting import figure, show, output_notebook
    from bokeh.models import ColumnDataSource, LinearColorMapper
    from bokeh.transform import transform
    output_notebook()
    colors = ['#d7191c', '#fdae61', '#ffffbf', '#a6d96a', '#1a9641']
    TOOLS = "hover,save,pan,box_zoom,reset,wheel_zoom"
    data = df.corr().stack().rename("value").reset_index()
    p = figure(x_range=list(df.columns), y_range=list(df.index), tools=TOOLS, toolbar_location='below',
               tooltips=[('Row, Column', '@level_0 x @level_1'), ('value', '@value')], height = 500, width = 500)
    
    p.rect(x="level_1", y="level_0", width=1, height=1,
           source=data,
           fill_color={'field': 'value', 'transform': LinearColorMapper(palette=colors, low=data.value.min(), high=data.value.max())},
           line_color=None)
    color_bar = ColorBar(color_mapper=LinearColorMapper(palette=colors, low=data.value.min(), high=data.value.max()), major_label_text_font_size="7px",
                         ticker=BasicTicker(desired_num_ticks=len(colors)),
                         formatter=PrintfTickFormatter(format="%f"),
                         label_standoff=6, border_line_color=None, location=(0, 0))
    p.add_layout(color_bar, 'right')
    
    show(p)
    

    您可以使用seaborn的
    热图()
    查看不同功能的相关性:

    import matplot.pyplot as plt
    import seaborn as sns
    
    co_matrics=dataframe.corr()
    plot.figure(figsize=(15,20))
    sns.heatmap(co_matrix, square=True, cbar_kws={"shrink": .5})
    

    请检查以下可读代码

    import numpy as np
    import seaborn as sns
    import matplotlib.pyplot as plt
    plt.figure(figsize=(36, 26))
    heatmap = sns.heatmap(df.corr(), vmin=-1, vmax=1, annot=True)
    heatmap.set_title('Correlation Heatmap', fontdict={'fontsize':12}, pad=12)```
    
      [1]: https://i.stack.imgur.com/I5SeR.png
    

    我认为应该是.plt而不是.pl(如果
    from bokeh.plotting import figure, show, output_notebook
    from bokeh.models import ColumnDataSource, LinearColorMapper
    from bokeh.transform import transform
    output_notebook()
    colors = ['#d7191c', '#fdae61', '#ffffbf', '#a6d96a', '#1a9641']
    TOOLS = "hover,save,pan,box_zoom,reset,wheel_zoom"
    data = df.corr().stack().rename("value").reset_index()
    p = figure(x_range=list(df.columns), y_range=list(df.index), tools=TOOLS, toolbar_location='below',
               tooltips=[('Row, Column', '@level_0 x @level_1'), ('value', '@value')], height = 500, width = 500)
    
    p.rect(x="level_1", y="level_0", width=1, height=1,
           source=data,
           fill_color={'field': 'value', 'transform': LinearColorMapper(palette=colors, low=data.value.min(), high=data.value.max())},
           line_color=None)
    color_bar = ColorBar(color_mapper=LinearColorMapper(palette=colors, low=data.value.min(), high=data.value.max()), major_label_text_font_size="7px",
                         ticker=BasicTicker(desired_num_ticks=len(colors)),
                         formatter=PrintfTickFormatter(format="%f"),
                         label_standoff=6, border_line_color=None, location=(0, 0))
    p.add_layout(color_bar, 'right')
    
    show(p)
    
    import matplot.pyplot as plt
    import seaborn as sns
    
    co_matrics=dataframe.corr()
    plot.figure(figsize=(15,20))
    sns.heatmap(co_matrix, square=True, cbar_kws={"shrink": .5})
    
    import numpy as np
    import seaborn as sns
    import matplotlib.pyplot as plt
    plt.figure(figsize=(36, 26))
    heatmap = sns.heatmap(df.corr(), vmin=-1, vmax=1, annot=True)
    heatmap.set_title('Correlation Heatmap', fontdict={'fontsize':12}, pad=12)```
    
      [1]: https://i.stack.imgur.com/I5SeR.png