如何在 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()
我有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()