使用pandas绘制相关矩阵

时间:2015-04-03 12:57:23

标签: python pandas matplotlib data-visualization information-visualization

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

14 个答案:

答案 0 :(得分:190)

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

import matplotlib.pyplot as plt

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

答案 1 :(得分:82)

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

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

答案 2 :(得分:76)

如果你的主要目标是可视化相关矩阵,而不是创建一个情节本身,方便的pandas styling 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 Notebook。 (深色背景上的自动亮文本来自现有PR,而不是最新发布的版本pandas 0.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()快10倍10x10矩阵。不幸的是,它的扩展性不如plt.matshow():对于100x100矩阵,两者大约需要相同的时间,而对于1000x1000矩阵,plt.matshow()要快10倍。

pandas的更新> = 0.24

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

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

enter image description here

答案 3 :(得分:75)

Seaborn的热图版本:

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

答案 4 :(得分:62)

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

分散矩阵:

pd.scatter_matrix(dataframe, alpha = 0.3, figsize = (14,8), diagonal = 'kde');

如果你想要想象每个特征的偏斜度 - 使用seaborn pairplots。

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)

输出将是功能的相关性映射。即见下面的例子。

enter image description here

杂货和洗涤剂之间的相关性很高。类似地:

具有高相关性的Pdoducts:
  1. 杂货和洗涤剂。
  2. 具有中等相关性的产品:
    1. 牛奶和杂货
    2. Milk and Detergents_Paper
    3. 相关性低的产品:
      1. 牛奶和熟食店
      2. 冷冻和新鲜。
      3. 冷冻和熟食。
      4. 来自Pairplots:您可以从配对图或散点矩阵中观察到相同的关系集。但是从这些我们可以说数据是否正常分布。

        enter image description here

        注意:以上是与数据相同的图表,用于绘制热图。

答案 5 :(得分:5)

如果数据框为df,则可以简单地使用:

import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(15, 10))
sns.heatmap(df.corr(), annot=True)

答案 6 :(得分:4)

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

import pandas as pd
import matplotlib.pyplot as plt
matplotlib.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()

答案 7 :(得分:2)

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

答案 8 :(得分:2)

与其他方法一起,使用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)

答案 9 :(得分:2)

令人惊讶的是,没有人提到任何一种功能更强大,更具交互性且更易于使用的替代方案。

A)您可以使用plotly:

  1. 只需两行,您就会得到:

  2. 互动性

  3. 平滑比例,

  4. 基于整个数据框而不是单个列的颜色

  5. 列名和轴上的行索引,

  6. 放大

  7. 平移,

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

  9. 自动缩放,

  10. 悬停比较,

  11. 冒泡显示值,因此热图仍然看起来不错,您可以看到 所需的值:

import plotly.express as px
fig = px.imshow(df.corr())
fig.show()

enter image description here

B)您也可以使用Bokeh:

所有相同的功能都有些麻烦。但是,如果您不想选择加入,但仍然想要所有这些东西,仍然值得:

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)

enter image description here

答案 10 :(得分:1)

为完整起见,如果您使用的是seaborn,那么截至2019年底,我所知道的最简单的解决方案是Jupyter

import seaborn as sns
sns.heatmap(dataframe.corr())

答案 11 :(得分:1)

形成相关矩阵,在我的情况下,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)

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

答案 12 :(得分:-1)

您可以使用来自 seaborn 的 NavModel 查看不同特征的黑白相关性:

import 'package:flutter/material.dart';

import '../screens/Profile_Screen.dart';
import '../screens/Venture_Feed_Screen.dart';
import '../screens/Add_Media_Screen.dart';

import '../widgets/BottomNavBar.dart';

class NavModel extends StatefulWidget {
  static const routeName = '/nav-model';
  @override
  _NavModelState createState() => _NavModelState();
}

class _NavModelState extends State<NavModel> {
  int _currentIndex = 0;

  final tabs = [
    VentureFeedScreen(),
    ProfileScreen(),
    AddMediaScreen(),
  ];

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        body: tabs[_currentIndex],
        bottomNavigationBar: BottomNavBar(),
      ),
    );
  }
}

答案 13 :(得分:-1)

请检查以下可读代码

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