Pandas 在seaborn中覆盖来自一个数据帧的两个热图(一个是围绕另一个单元的帧)

Pandas 在seaborn中覆盖来自一个数据帧的两个热图(一个是围绕另一个单元的帧),pandas,matplotlib,seaborn,Pandas,Matplotlib,Seaborn,我有一个简单的问题:我有两个数据帧,一个是带有列(行、列、强度)的df_信号,另一个是带有列(行、列、检测)的df_det信号,其中“强度”是浮点,“检测”是二进制1或0 我想将df_det数据帧覆盖在热图中的df_信号帧上,在热图中检测到的单元周围有一个帧 我也很乐意使用seaborn以外的绘图库,如果这样做更容易的话。我不建议在这里使用seaborn,因为这会使获得具有单位的数据的正确缩放更加困难(因为seaborn使用轴上的分类值)。相反,可以使用matplotlibimshowplot

我有一个简单的问题:我有两个数据帧,一个是带有列(行、列、强度)的df_信号,另一个是带有列(行、列、检测)的df_det信号,其中“强度”是浮点,“检测”是二进制1或0

我想将df_det数据帧覆盖在热图中的df_信号帧上,在热图中检测到的单元周围有一个帧


我也很乐意使用seaborn以外的绘图库,如果这样做更容易的话。

我不建议在这里使用seaborn,因为这会使获得具有单位的数据的正确缩放更加困难(因为seaborn使用轴上的分类值)。相反,可以使用matplotlib
imshow
plot

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

# generate data
x = np.linspace(-3,3, num=11)
y = np.linspace(2,8, num=11)
X,Y = np.meshgrid(x,y)
signal = np.random.rand(len(x)*len(y))
det = np.random.poisson(lam=0.5,size=len(x)*len(y))
det[det>1] = 1

df_signal = pd.DataFrame({"y":Y.flatten(), "x":X.flatten(), "intensity":signal})
df_det = pd.DataFrame({"y":Y.flatten(), "x":X.flatten(), "det":det})

# prepare Dataframes
df = df_signal.pivot(index="y", columns="x")
dfmark = df_det[df_det["det"]>0]

#plotting
fig, ax=plt.subplots()

x = df_signal["x"].unique()
y = df_signal["y"].unique()
ext = [x.min()-np.diff(x)[0]/2.,x.max()+np.diff(x)[0]/2., 
       y.min()-np.diff(y)[0]/2.,y.max()+np.diff(y)[0]/2. ]
ax.imshow(df, extent=ext)
ax.set_xticks(x)
ax.set_yticks(y)

ax.scatter(dfmark["x"], dfmark["y"], marker="s", s=100, c="crimson")

plt.show()

您可以使用矩形创建帧,而不是散射:

dx = np.diff(x)[0]; dy = np.diff(y)[0]
for (xi,yi), in zip(dfmark[["x","y"]].values):
    rec = plt.Rectangle((xi-dx/2.,yi-dy/2.),dx,dy, fill=False, hatch="\\",
                        edgecolor="crimson", lw=2 )
    ax.add_artist(rec)

到目前为止,您尝试过哪些不起作用的方法?如果你能提供一个简单的例子,并解释你陷入困境的地方,那么帮助就会容易得多。Saeborn是基于matplotlib构建的,如果你进入matplotlib级别,你可以随心所欲地操纵一切。除非您提供代码和示例,否则我只能说这些。FWIW,对
seaborn.heatmap()
的连续调用将在上一个热图的基础上绘制下一个热图,将包含
np.nan
的单元格视为透明。太好了,谢谢!不幸的是,我不允许对你的答案投赞成票,因为stackoverflow有一个奇怪的政策,不允许新来者有任何东西。不计算新帐户的选票是有充分理由的。然而,你仍然可以投票,一旦你有足够的声望点数,这一票将被计算在内。但如果答案能解决你的问题,你可以决定回答。如果没有,您可以进一步澄清您的需求和/或等待不同的答案。