如何在 plotly imshow 热图的 hovertemplate 中使用来自第二个 df 的信息?

How can I use the info from a second df in hovertemplate of a plotly imshow heatmap?

我有2个df;第一个具有制作热图的值,第二个 df 具有我想在悬停时使用的元数据。

我已经尝试了很多东西,这几乎可以正常工作,除了有一些我不明白的行为:

import plotly.express as px
import pandas as pd
import difflib

df1 = pd.DataFrame([[22,33],[23,31]], columns=['A','B'])
df2 = pd.DataFrame([['top_left','top_right'],['bottom_left','bottom_right']], columns=['A','B'])
print(df1)
print(df2)

fig = px.imshow(df1, 
                color_continuous_scale=px.colors.diverging.RdYlGn, 
                title='QC')

def ff(sample, pos, tmp):
    
    d=tmp.to_dict()
    s2 = list(d.keys())[0]
    
    print(sample, pos, s2, s2 == sample, s2 == 'A', sample == 'A', type(sample), type(s2), list(difflib.ndiff([sample], [s2])))
    
    return sample, pos #1, tmp.loc[pos, sample]

fig.update_traces(hovertemplate="Sample: %{x} <br> Position: %{y} <br> Score: %{z}" +\
                  f" <br> Depths: {ff('%{x}', '%{y}', df2)}")

fig.show()

给予

    A   B
0  22  33
1  23  31
             A             B
0     top_left     top_right
1  bottom_left  bottom_right

%{x} %{y} A False True False <class 'str'> <class 'str'> ['- %{x}', '+ A']

所以 s2 != 样本因为它仍然是 %{x}(不是 'A')。这可以解释为什么这不起作用 #1,tmp.loc[pos, sample]。我不知道如何解决这个问题。任何帮助表示赞赏!

明确一点 - 如果我将鼠标悬停在热图的左上角 (A0) 上,我想要得到的是 'top_left'。

感谢 Cimbali 找到图表工作室:

import plotly.graph_objects as go
import pandas as pd

df1 = pd.DataFrame([[22,33],[23,31]], columns=['A','B'])
df2 = pd.DataFrame([['top_left','top_right'],['bottom_left','bottom_right']], columns=['A','B'])
fig3 = go.Figure(go.Heatmap(z = df1, customdata= df2, hovertemplate= 'z: %{z}<br> %{customdata}'))
fig3.show()