使用 Pandas 绘制相关矩阵

2025-03-26 09:09:00
admin
原创
19
摘要:问题描述:我有一个包含大量特征的数据集,因此分析相关矩阵变得非常困难。我想绘制一个使用dataframe.corr()pandas 库中的函数得到的相关矩阵。pandas 库是否提供了任何内置函数来绘制此矩阵?解决方案 1:您可以pyplot.matshow() 使用matplotlib:import mat...

问题描述:

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


解决方案 1:

您可以pyplot.matshow() 使用matplotlib

import matplotlib.pyplot as plt

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

编辑:

评论中有人要求更改轴刻度标签。这是一个豪华版,它绘制在更大的图形上,轴标签与数据框相匹配,还有一个颜色条图例来解释颜色刻度。

其中包括如何调整标签的大小和旋转,以及使用使颜色条和主图形具有相同高度的图形比例。


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

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

相关图示例

解决方案 2:

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

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。


造型

您可以轻松限制数字精度(现在.format(precision=2)在 pandas 2.* 中):

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

在此处输入图片描述

或者,如果您更喜欢没有注释的矩阵,则可以完全删除数字:

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

在此处输入图片描述

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


时间比较

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


保存

有几种可能的方法来保存风格化的数据框:

  • 通过附加方法返回 HTML render(),然后将输出写入文件。

  • .xslx通过附加方法保存为具有条件格式的文件to_excel()

  • 和imgkit结合保存为位图

  • 截取屏幕截图(就像我在这里所做的那样)。


对整个矩阵的颜色进行标准化 (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(color='#f1f1f1')  # Color NaNs grey
 .format(precision=2))

在此处输入图片描述

解决方案 3:

Seaborn 的热图版本:

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

解决方案 4:

您可以通过从 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,
    cmap=sns.diverging_palette(220, 10, as_cmap=True),
    vmin=-1.0, vmax=1.0,
    square=True, ax=ax)

输出将是特征的相关图。即参见下面的示例。

在此处输入图片描述

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

相关性较高的产品:

  1. 杂货和洗涤剂。

具有中等相关性的产品:

  1. 牛奶和杂货

  2. 牛奶和洗涤剂_论文

相关性较低的产品:

  1. 牛奶和熟食

  2. 冷冻和新鲜。

  3. 冷冻和熟食。

从配对图:您可以从配对图或散点矩阵中观察到同一组关系。但从这些我们可以判断数据是否呈正态分布。

在此处输入图片描述

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

解决方案 5:

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

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)

解决方案 6:

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

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

解决方案 7:

很惊讶没有人提到功能更强大、交互性更强、更易于使用的替代方案。

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

在此处输入图片描述

B)您还可以使用散景:

所有功能都一​​样,但麻烦一点。但如果你不想选择使用 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)

在此处输入图片描述

解决方案 8:

我认为有很多好的答案,但我将这个答案添加到那些需要处理特定列并显示不同情节的人中。

import numpy as np
import seaborn as sns
import pandas as pd
from matplotlib import pyplot as plt

rs = np.random.RandomState(0)
df = pd.DataFrame(rs.rand(18, 18))
df= df.iloc[: , [3,4,5,6,7,8,9,10,11,12,13,14,17]].copy()
corr = df.corr()
plt.figure(figsize=(11,8))
sns.heatmap(corr, cmap="Greens",annot=True)
plt.show()

在此处输入图片描述

解决方案 9:

如果你的数据框是df你可以简单地使用:

import matplotlib.pyplot as plt
import seaborn as sns

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

解决方案 10:

您可以使用 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()

解决方案 11:

当处理大量特征之间的相关性时,我发现将相关特征聚类在一起很有用。这可以使用 seaborn clustermap图来完成。

import seaborn as sns
import matplotlib.pyplot as plt

g = sns.clustermap(df.corr(), 
                   method = 'complete', 
                   cmap   = 'RdBu', 
                   annot  = True, 
                   annot_kws = {'size': 8})
plt.setp(g.ax_heatmap.get_xticklabels(), rotation=60);

在此处输入图片描述

clustermap 函数使用层次聚类将相关特征排列在一起并生成树状树状图。

该图中有两个值得注意的集群:

  1. y_desdew.point_des

  2. irradiancey_seasonaldew.point_seasonal


值得一提的是,生成该图表的气象数据可以通过这个 Jupyter 笔记本访问。

解决方案 12:

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

解决方案 13:

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

解决方案 14:

有很多有用的答案。我只是想添加一种可视化相关矩阵的方法。因为有时颜色对您来说不太清楚,所以heatmap库可以绘制一个相关矩阵,显示每个相关测量的正方形大小。

import matplotlib.pyplot as plt
from heatmap import corrplot

plt.figure(figsize=(15, 15))
corrplot(df.corr())

在此处输入图片描述

注意:heatmap库需要 Python 图像库和 Python 2.5+。但您可以在新的虚拟环境或简单的协作笔记本上运行它

感谢@coding_is_fun 提到这个问题

解决方案 15:

形成相关矩阵,在我的例子中,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 转换为图像文件。

解决方案 16:

我更喜欢用 Plotly 来实现,因为它的图表更具交互性,而且更容易理解。您可以使用以下代码片段。

import plotly.express as px

def plotly_corr_plot(df,w,h):
    fig = px.imshow(df.corr())
    fig.update_layout(
        autosize=False,
        width=w,
        height=h,)
    fig.show()

解决方案 17:

您可以使用heatmap()seaborn 查看不同特征之间的相关性:

import matplotlib.pyplot as plt
import seaborn as sns

co_matrix=dataframe.corr()
plt.figure(figsize=(15,20))
sns.heatmap(co_matrix, square=True, cbar_kws={"shrink": .5})

解决方案 18:

请检查以下可读代码

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.sstatic.net/I5SeR.png

解决方案 19:

corrmatrix = df.corr()
corrmatrix *= np.tri(*corrmatrix.values.shape, k=-1).T
corrmatrix = corrmatrix.stack().sort_values(ascending = False).reset_index()
corrmatrix.columns = ['Признак 1', 'Признак 2', 'Корреляция']
corrmatrix[(corrmatrix['Корреляция'] >= 0.7) + (corrmatrix['Корреляция'] <= -0.7)]
drop_columns = corrmatrix[(corrmatrix['Корреляция'] >= 0.82) + (corrmatrix['Корреляция'] <= -0.7)]['Признак 2']
df.drop(drop_columns, axis=1, inplace=True)
corrmatrix[(corrmatrix['Корреляция'] >= 0.7) + (corrmatrix['Корреляция'] <= -0.7)]
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2079  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1459  
  建筑行业正处于数字化转型的关键时期,建筑产品生命周期管理(PLM)系统的实施对于提升项目效率、质量和协同性至关重要。特别是在 2025 年,基于建筑信息模型(BIM)的项目进度优化工具成为众多建筑企业关注的焦点。这些工具不仅能够整合项目全生命周期的数据,还能通过精准的分析和模拟,为项目进度管理提供强大支持。BIM 与建...
plm是什么软件   0  
  PLM系统开发的重要性与现状PLM(产品生命周期管理)系统在现代企业的产品研发、生产与管理过程中扮演着至关重要的角色。它贯穿产品从概念设计到退役的整个生命周期,整合了产品数据、流程以及人员等多方面的资源,极大地提高了企业的协同效率和创新能力。通过PLM系统,企业能够实现产品信息的集中管理与共享,不同部门之间可以实时获取...
国产plm软件   0  
  PLM(产品生命周期管理)系统在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和技术的飞速发展,企业对PLM系统的迭代周期优化需求日益迫切。2025年敏捷认证对项目管理提出了新的要求,其中燃尽图作为一种强大的可视化工具,在PLM系统迭代周期优化中有着广泛且重要的应用。深入探讨这些应用,对于提升企业的项...
plm系统主要干什么的   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用