我有一个具有大量特征的数据集,因此分析相关矩阵变得非常困难。我想绘制一个相关矩阵,我们使用dataframe.corr()函数从pandas库中获得。pandas库是否提供了任何内置函数来绘制这个矩阵?
当前回答
如果你的主要目标是可视化相关矩阵,而不是创建一个图形本身,方便的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。
样式
您可以轻松地限制数字精度:
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倍,比sn .heatmap()快120倍,矩阵为10x10。不幸的是,它的伸缩性不如plt.matshow():对于100x100的矩阵,两者需要相同的时间,而对于1000x1000的矩阵,plt.matshow()要快10倍。
储蓄
有几种可能的方法来保存风格化的数据框架:
通过追加render()方法返回HTML,然后将输出写入文件。 通过附加to_excel()方法保存为带有条件格式的.xslx文件。 结合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(null_color='#f1f1f1') # Color NaNs grey
.set_precision(2))
其他回答
你可以通过绘制海洋出生的热图或熊猫的散射矩阵来观察特征之间的关系。
散射矩阵:
pd.scatter_matrix(dataframe, alpha = 0.3, figsize = (14,8), diagonal = 'kde');
如果你想可视化每个特征的偏度,也可以使用海运配对图。
sns.pairplot(dataframe)
党Heatmap:
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)
输出将是特征的相关映射。参见下面的例子。
杂货店和洗涤剂之间的相关性很高。类似的:
高相关性产品:
杂货和洗涤剂。
相关性中等的产品:
牛奶和杂货 牛奶和洗涤剂。纸
低相关性产品:
牛奶和熟食 冷冻和新鲜。 冷冻熟食店。
从配对图中:你可以从配对图或散射矩阵中观察到相同的一组关系。但从这些可以判断数据是否正态分布。
注:上图为取自数据的同一张图,用于绘制热图。
可以使用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()
你可以使用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);
试试这个函数,它也会显示相关矩阵的变量名:
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)
我更喜欢用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()
推荐文章
- 数据类vs类型。NamedTuple主要用例
- 如何从macOS完全卸载蟒蛇
- 是否有可能键入提示一个lambda函数?
- 'dict'对象没有has_key属性
- 使用Pandas groupby连接来自几行的字符串
- Pandas:给定列的数据帧行之和
- 如何避免在为Python项目构建Docker映像时重新安装包?
- 如何激活蟒蛇环境
- 省略[…]意思是在一个列表里?
- 为什么我得到“'str'对象没有属性'读取'”当尝试使用' json。载入字符串?
- 不区分大小写的列表排序,没有降低结果?
- 排序后的语法(key=lambda:…)
- 在烧瓶中返回HTTP状态代码201
- 使用python创建一个简单的XML文件
- APT命令行界面式的yes/no输入?