【问题标题】:Python, Seaborn: how to replicate corrplot?Python,Seaborn:如何复制 corrplot?
【发布时间】:2017-09-16 09:26:03
【问题描述】:

我正在上一门关于数据可视化的 UDemy 课程(我会向你推荐它,但它可能看起来像垃圾邮件),在该课程之前,我一直在使用 matplotlib 进行可视化,所以 Seaborn 是对我来说很新。在课程中,他们谈到了corrplot() 函数,它可以产生如下图所示的内容:

但现在,corrplot() 已被弃用。我一直在查看 Seaborn 文档和网络上的一些链接,我所做的“更接近”是这样的:

当然,我更喜欢原始的corrplot() 输出,而且它更易于实现,使用heatmap() 或任何其他函数来做同样的事情的方法是什么?

顺便说一句:制作图表的数据不同,第一个来自视频的捕获,而另一个是我电脑的屏幕截图,因此值不一样。

【问题讨论】:

  • 假设您使用的是 Jupyter 笔记本,我发现最好的解决方案就是使用 rpy2/ggplot。有一个很棒的相关图库:ggcorrplot

标签: python matplotlib visualization data-visualization seaborn


【解决方案1】:

首先,corrplot() 被贬值并不意味着你不能使用它。它很可能会在未来的 seaborn 版本中被删除,或者伴随着其他一些问题。但是,如果您对它现在提供的功能感到满意,您仍然可以使用它。

为了获得类似于corrplot 但使用heatmap 的结果,您可能需要稍微调整一下绘图。

一个例子如下所示:

import numpy as np; np.random.seed(1)
import pandas as pd
import seaborn.apionly as sns
import matplotlib.pyplot as plt

# Generate a random dataset
cols = [s*4 for s in list("ABCD")]
df = pd.DataFrame(data=np.random.rayleigh(scale=5, size=(100, 4)), columns=cols)

# Compute the correlation matrix
corr = df.corr()
print(corr)
# Generate a mask for the upper triangle
mask = np.zeros_like(corr, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True

# Set up the matplotlib figure
fig, ax = plt.subplots()

# Draw the heatmap with the mask and correct aspect ratio
vmax = np.abs(corr.values[~mask]).max()
sns.heatmap(corr, mask=mask, cmap=plt.cm.PuOr, vmin=-vmax, vmax=vmax,
            square=True, linecolor="lightgray", linewidths=1, ax=ax)
for i in range(len(corr)):
    ax.text(i+0.5,len(corr)-(i+0.5), corr.columns[i], 
            ha="center", va="center", rotation=45)
    for j in range(i+1, len(corr)):
        s = "{:.3f}".format(corr.values[i,j])
        ax.text(j+0.5,len(corr)-(i+0.5),s, 
            ha="center", va="center")
ax.axis("off")
plt.show()

【讨论】:

  • 实际上你需要从文本和值的坐标中删除 len(corr) 。否则它们会重叠
【解决方案2】:
for i in range(len(corr)):
    ax.text(i+0.5,(i+0.5), corr.columns[i], ha="center", va="center", rotation=45)
    for j in range(i+1, len(corr)):
        s = "{:.3f}".format(corr.values[i,j])
        ax.text(j+0.5,(i+0.5),s, 
            ha="center", va="center")[my plt.show][1]

【讨论】:

  • 您能否更详细地解释您的解决方案,以便为您的答案提供更好的背景?
【解决方案3】:

下面这个简单的事情让我得到了一个 corrplot。现在您可以使用 map_upper 和 map_lower 并生成您想要的。

tech_rets_corr= tech_rets.dropna().corr()
sns.heatmap(tech_rets_corr, annot=True, fmt='.2f')
plt.show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-13
    • 2020-05-25
    • 2020-06-22
    • 2021-01-03
    • 1970-01-01
    • 2021-11-23
    • 2021-08-30
    相关资源
    最近更新 更多