Seaborn 复杂热图——在图块内绘制圆圈以表示复杂注释

问题描述 投票:0回答:2

我有两个 python 数据框。

data_A
Name  X  Y
A     1  0
B     1  1
C     0  0

data_B
Name  X  Y
A     0  1
B     1  1
C     0  1

我想重叠这些热图,如果 data_frame A 中为 1,则图块颜色为紫色(或任何颜色),但如果 data_frame B 中为 1,则绘制一个圆圈(最好是第一个) )。

例如,热图将显示 A[,X][1] 紫色,但两个数据框中都为 1 的数据将显示为带有点的紫色。 C[,Y][3] 只有一个点,而 C[,X][3] 没有任何内容。

我似乎可以使用seaborn进行遮罩,并用不同的颜色绘制两个热图,但色差不够清晰,用户可以简单地看到一个图块只有一个与两个。我认为用一个圆圈来表示一个矩阵中的正值会更好。

有人知道如何使用seaborn 在热图上绘制圆圈吗?

python-3.x matrix plot heatmap seaborn
2个回答
1
投票

要显示热图,您可以使用

imshow
图。要显示一些点,您可以使用
scatter
图。然后只需将两者绘制在同一轴上即可。

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

dfA = pd.DataFrame([[1,0],[1,1],[0,0]], columns=list("XY"), index=list("ABC"))
dfB = pd.DataFrame([[0,1],[1,1],[0,1]], columns=list("XY"), index=list("ABC"))

assert dfA.shape == dfB.shape

x = np.arange(0,len(dfA.columns))
y = np.arange(0,len(dfB.index))
X,Y=np.meshgrid(x,y)

fig, ax = plt.subplots(figsize=(2.6,3))
ax.invert_yaxis()
ax.imshow(dfA.values, aspect="auto", cmap="Purples")

cond = dfB.values == 1
ax.scatter(X[cond], Y[cond], c="crimson", s=100)

ax.set_xticks(x)
ax.set_yticks(y)
ax.set_xticklabels(dfA.columns)
ax.set_yticklabels(dfA.index)
plt.show()

使用点在同一热图上显示多个数据集的替代方案也可以


0
投票

您可以使用 python 包 PyComplexHeatmap 从数据框中绘制非常复杂的热图:https://dingwb.github.io/PyComplexHeatmap/build/html/gallery.html

此外,它还允许您将多个热图合成为一张图。

© www.soinside.com 2019 - 2024. All rights reserved.