如何在Python中创建带输入输出依赖且支持Signalname交互的Chord图
Python实现带信号名展示的交互Chord图方案
完全可以实现你需要的交互效果,以下是两种可直接落地的实现方案:
方案1:基于Plotly实现(适配Notebook/网页嵌入场景)
该方案可以直接在Jupyter Notebook运行,也可以导出为独立网页,悬停弦线即可展示对应Signalname列表:
import pandas as pd import plotly.graph_objects as go # 导入示例数据 df = pd.DataFrame({ 'Message Out': ['A','A','B','C','C','C'], 'Message In': ['B','B','C','D','D','D'], 'Signalname': ['M1','M2','M3','M4','M5','M6'] }) # 聚合同流向的信号名与流量统计 agg_df = df.groupby(['Message Out','Message In']).agg( 信号列表=('Signalname', lambda x: '<br>'.join(x)), 流量=('Signalname', 'count') ).reset_index() # 构建实体索引映射 all_nodes = pd.concat([df['Message Out'], df['Message In']]).unique() node_map = {node:i for i, node in enumerate(all_nodes)} # 构造弦图输入参数 source = agg_df['Message Out'].map(node_map).tolist() target = agg_df['Message In'].map(node_map).tolist() value = agg_df['流量'].tolist() hover_text = agg_df['信号列表'].tolist() # 绘制交互弦图 fig = go.Figure(data=[go.Sankey( node = dict( pad = 15, thickness = 20, line = dict(color = "black", width = 0.5), label = list(node_map.keys()) ), link = dict( source = source, target = target, value = value, customdata = hover_text, hovertemplate = '流出实体: %{source.label}<br>流入实体: %{target.label}<br>关联信号:<br>%{customdata}<extra></extra>' ))]) fig.update_layout(title_text="消息流向弦图", font_size=12) fig.show()
方案2:基于Pyvis实现(适配高自定义交互场景)
如果需要支持拖拽节点、点击弹出详情等更复杂的交互,可以用该方案生成独立交互网页:
from pyvis.network import Network # 沿用方案1中预处理好的agg_df、node_map数据 net = Network(directed=True, height="800px", width="100%") # 添加节点 for node in node_map.keys(): net.add_node(node_map[node], label=node) # 添加边并绑定信号名到悬停属性 for _, row in agg_df.iterrows(): net.add_edge( node_map[row['Message Out']], node_map[row['Message In']], value=row['流量'], title=f"关联信号:\n{row['信号列表'].replace('<br>', '\n')}" ) # 生成布局并导出网页 net.barnes_hut() net.show("message_chord.html", notebook=False)
运行后打开生成的message_chord.html文件即可使用,悬停弦线会展示所有关联的Signalname,也可以自行扩展点击事件实现更多交互逻辑。
内容的提问来源于stack exchange,提问作者Sahin
相关产品推荐
相关产品推荐

