gpt4 book ai didi

python - 如何结合 pairplot 和三角热图?

转载 作者:行者123 更新时间:2023-12-04 08:08:22 25 4
gpt4 key购买 nike

我正在尝试制作一个上三角相关矩阵,理想情况下我想将其叠加到下三角矩阵的另一张图片上。因此,我希望将 mask 颜色设置为无色或透明(否则,如果它是白色,我将无法叠加)...知道如何在 seaborn 中执行此操作吗?

Here is the figure I am trying to modify

编辑

这是我想做的:使用数据框中的一组列,我想绘制这些列的配对图(下三角)和相关图(上三角)

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


rs = np.random.RandomState(112358)
d1 = pd.DataFrame(data=rs.normal(size=(100, 10)), columns=[*'abcdefghij' ])

corr1 = d1.corr()
mask1 = np.tril(np.ones_like(corr1, dtype=bool))

fig, ax = plt.subplots(figsize=(11, 9))

sns.heatmap(corr1, mask=mask1, cmap='PRGn', vmax=.3, vmin=-.3,
square=True, linewidths=.5, cbar_kws={"shrink": .85, "pad":-.01}, ax=ax)

def hide_current_axis(*args, **kwds):
plt.gca().set_visible(False)

e = sns.pairplot(d1)

e.map_upper(hide_current_axis)

plt.show()

这段代码当然有效,但它分别绘制了两个图形。

最佳答案

创建三角形热图的常规方法是屏蔽掉不需要的部分。那里不会绘制任何东西,原始背景颜色将保持可见。如果您绘制第二个热图,它也只会绘制未被遮盖的地方。

下面是一些代码来演示这个想法。

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

sns.set_theme(style="white")

rs = np.random.RandomState(112358)
d1 = pd.DataFrame(data=rs.normal(size=(100, 10)), columns=[*'abcdefghij' ])
d2 = pd.DataFrame(data=rs.normal(size=(100, 10)), columns=[*'abcdefghij' ])

corr1 = d1.corr()
corr2 = d2.corr()
mask1 = np.tril(np.ones_like(corr1, dtype=bool))
mask2 = np.triu(np.ones_like(corr2, dtype=bool))

fig, ax = plt.subplots(figsize=(11, 9))

sns.heatmap(corr1, mask=mask1, cmap='PRGn', vmax=.3, vmin=-.3,
square=True, linewidths=.5, cbar_kws={"shrink": .85, "pad":-.01}, ax=ax)
sns.heatmap(corr1, mask=mask2, cmap='RdYlBu', vmax=.3, vmin=-.3,
square=True, linewidths=.5, cbar_kws={"shrink": .85}, ax=ax)

# the following lines color and hatch the axes background, only the diagonals are visible
ax.patch.set_facecolor('grey')
ax.patch.set_edgecolor('yellow')
ax.patch.set_hatch('xx')

plt.show()

example plot

关于新问题,将配对图与三角形热图相结合。因为 pairplot 是 figure-level function ,它会创建自己的带有子图的图形。它应该首先创建。

作为第二步,可以使用 pairplot 子图的位置为热图创建一个特殊的 ax。将其 facecolor 设置为“无”使其完全透明(默认为白色,隐藏所有内容)。

添加颜色条可能会更麻烦,因为 pairplot 没有留下放置它的好位置。

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

def hide_current_axis(*args, **kwds):
plt.gca().set_visible(False)

rs = np.random.RandomState(112358)
d1 = pd.DataFrame(data=rs.normal(size=(20, 5)), columns=[*'abcde'])

e = sns.pairplot(d1)
e.map_upper(hide_current_axis)

(xmin, _), (_, ymax) = e.axes[0, 0].get_position().get_points()
(_, ymin), (xmax, _) = e.axes[-1, -1].get_position().get_points()

ax = e.fig.add_axes([xmin, ymin, xmax - xmin, ymax - ymin], facecolor='none')

corr1 = d1.corr()
mask1 = np.tril(np.ones_like(corr1, dtype=bool))
sns.heatmap(corr1, mask=mask1, cmap='seismic', vmax=.5, vmin=-.5,
linewidths=.5, cbar=False, annot=True, annot_kws={'size': 22}, ax=ax)
ax.set_xticks([])
ax.set_yticks([])
# ax.xaxis.tick_top()
# ax.yaxis.tick_right()

plt.show()

combining pairplot and triangular heatmap

如评论中所述,一种更忠实于 seaborn 哲学的方法是根据相关性以及数字显示为右上角子图的轴着色。我找不到示例代码,这是我的尝试:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import pearsonr

def corrfunc(x, y, **kwds):
cmap = kwds['cmap']
norm = kwds['norm']
ax = plt.gca()
ax.tick_params(bottom=False, top=False, left=False, right=False)
sns.despine(ax=ax, bottom=True, top=True, left=True, right=True)
r, _ = pearsonr(x, y)
facecolor = cmap(norm(r))
ax.set_facecolor(facecolor)
lightness = (max(facecolor[:3]) + min(facecolor[:3]) ) / 2
ax.annotate(f"r={r:.2f}", xy=(.5, .5), xycoords=ax.transAxes,
color='white' if lightness < 0.7 else 'black', size=26, ha='center', va='center')

rs = np.random.RandomState(112358)
d1 = pd.DataFrame(data=rs.normal(size=(20, 5)), columns=[*'abcde'])

g = sns.PairGrid(d1)
g.map_lower(plt.scatter, s=10)
g.map_diag(sns.histplot, kde=False)
g.map_upper(corrfunc, cmap=plt.get_cmap('seismic'), norm=plt.Normalize(vmin=-.5, vmax=.5))
g.fig.subplots_adjust(wspace=0.06, hspace=0.06) # equal spacing in both directions
plt.show()

coloring the upper right subplots

关于python - 如何结合 pairplot 和三角热图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66108908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com