如何让Plotly折线图悬浮注释显示另一DataFrame的对应值
解决Plotly绘制Pandas折线图时悬浮注释显示对应DataFrame单个值的问题
问题出在hover_data=df2.values的用法上:Pandas的Plotly后端会把传入的二维数组整列绑定到每个trace的hover数据中,导致悬浮时显示整列而非对应位置的单个值。以下是两种可行的解决方法:
方法1:用Plotly Express合并数据后绘制
将两个DataFrame转成长格式并合并,让每个点都关联对应位置的df2值,再用px.line绘制:
import pandas as pd import numpy as np import plotly.express as px vals=[[1,2,3], [4,5,6], [7,8,9]] df = pd.DataFrame(np.random.rand(3,3), columns=['option0', 'option1', 'option2']) df2 = pd.DataFrame(vals, columns=['option0', 'option1', 'option2']) # 转换为长格式,保留行索引作为时间维度 df_long = df.reset_index().melt(id_vars='index', var_name='option', value_name='money') df2_long = df2.reset_index().melt(id_vars='index', var_name='option', value_name='extra_val') # 合并两个数据集,匹配时间和选项 merged_df = pd.merge(df_long, df2_long, on=['index', 'option']) # 绘制折线图,指定hover显示额外值 fig = px.line(merged_df, x='index', y='money', color='option', title="Pandas Backend Example", template="simple_white", labels={'index': 'time'}, hover_data={'extra_val': True, 'money': ':.4f', 'time': True}) fig.show()
方法2:修改Pandas Plotly后端生成的图表trace
如果坚持使用df.plot(),可以在生成图表后遍历每个trace,手动设置对应位置的hover文本:
import pandas as pd import numpy as np pd.options.plotting.backend = "plotly" vals=[[1,2,3], [4,5,6], [7,8,9]] df = pd.DataFrame(np.random.rand(3,3)) df2 = pd.DataFrame(vals) # 生成基础折线图 fig = df.plot(title="Pandas Backend Example", template="simple_white", labels=dict(index="time", value="money", variable="option")) # 遍历每个trace,绑定df2对应列的单个值到hover文本 for idx, trace in enumerate(fig.data): # 获取df2中当前trace对应的列数据 extra_vals = df2.iloc[:, idx].tolist() # 设置hovertext为对应值,并重写hover模板 trace.hovertext = extra_vals trace.hovertemplate = ( "time: %{x}<br>" "money: %{y:.4f}<br>" "extra_val: %{hovertext}<br>" "<extra></extra>" ) fig.show()
两种方法都能实现:悬浮第一条线的第一个点时显示df2(0,0)的值,第二条线第一个点显示df2(0,1)的值,以此类推。
内容的提问来源于stack exchange,提问作者mag1103
相关产品推荐
相关产品推荐

