Seaborn Complex Heatmap ---在tile中绘制圆圈以表示复杂的注释

时间:2018-03-08 00:05:50

标签: python-3.x matrix plot heatmap seaborn

我在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将圆圈绘制到热图上?

1 个答案:

答案 0 :(得分: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()

enter image description here

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