我有一个包含大量特征的数据集,因此分析相关矩阵变得非常困难。我想绘制一个相关矩阵,我们可以使用dataframe.corr()
熊猫库中的函数获取相关矩阵。熊猫库是否提供任何内置函数来绘制此矩阵?
我有一个包含大量特征的数据集,因此分析相关矩阵变得非常困难。我想绘制一个相关矩阵,我们可以使用dataframe.corr()
熊猫库中的函数获取相关矩阵。熊猫库是否提供任何内置函数来绘制此矩阵?
Answers:
您可以使用pyplot.matshow()
从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);
AttributeError: 'module' object has no attribute 'matshow'
import matplotlib.pyplot as plt
吗?
如果您的主要目标是可视化相关矩阵,而不是自己创建图表,则便捷的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' are other good diverging colormaps
请注意,这需要在支持渲染HTML的后端中,例如JupyterLab Notebook。(深色背景上的自动浅色文本来自现有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 ,然后将其写入文件(或者只是截取屏幕快照,以减少非正式目的)。
在我的测试中,速度是10x10矩阵的style.background_gradient()
4倍,是plt.matshow()
120x的120 倍sns.heatmap()
。不幸的是,它的伸缩性不如plt.matshow()
:对于100x100的矩阵,两者花费的时间大约相同,而plt.matshow()
对于1000x1000的矩阵,两者的速度要快10倍。
有几种方法可以保存样式化数据框:
render()
方法返回HTML ,然后将输出写入文件。.xslx
通过附加该to_excel()
方法以条件格式另存为文件。通过设置axis=None
,现在可以基于整个矩阵而不是每列或每行计算颜色:
corr.style.background_gradient(cmap='coolwarm', axis=None)
import seaborn as sns corr = df.corr() cm = sns.light_palette("green", as_cmap=True) cm = sns.diverging_palette(220, 20, sep=20, as_cmap=True) corr.style.background_gradient(cmap=cm).set_precision(2)
corr.style.background_gradient(cmap='coolwarm')
。当前尚无法将cmap定位在特定值上,这对于使用不同cmaps可能是个好主意。
试试这个函数,它也显示相关矩阵的变量名:
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);
plt.xticks(range(len(corr.columns)), corr.columns, rotation='vertical')
如果要在x轴上垂直排列列名称
plt.tight_layout()
对于长列名也可能有用。
Seaborn的热图版本:
import seaborn as sns
corr = dataframe.corr()
sns.heatmap(corr,
xticklabels=corr.columns.values,
yticklabels=corr.columns.values)
您可以通过绘制Seaborn的热图或熊猫的散点图来观察要素之间的关系。
散点矩阵:
pd.scatter_matrix(dataframe, alpha = 0.3, figsize = (14,8), diagonal = 'kde');
如果您还想可视化每个特征的偏斜度,请使用深浅的成对图。
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)
输出将是要素的关联图。即见下面的例子。
杂货和洗涤剂之间的相关性很高。类似地:
具有高相关性的产品:从线对图:您可以从线对图或散布矩阵观察同一组关系。但是从这些我们可以说,数据是否是正态分布的。
注意:以上是从数据中提取的相同图形,用于绘制热图。
from matplotlib import pyplot as pl
您可以从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()
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()
与其他方法一起使用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)
然后我们可以截屏。或将html转换为图像文件。