mpld3.show()报int不可JSON序列化 如何实现networkx节点hover交互
报错原因
- mpld3的
PointLabelTooltip插件要求传入的标签为字符串类型,直接传入G.nodes()返回的整数节点ID,序列化JSON时会触发类型错误 - 同时混用mpld3和mplcursors会产生交互逻辑冲突:mpld3是将图表转为HTML/JS实现web端交互,mplcursors是matplotlib原生桌面交互插件,二者无法同时生效
- 要在Jupyter内直接渲染交互式图表,无需调用
mpld3.show()弹出新窗口,替换为mpld3.display()即可在当前单元格输出交互内容
修正后可运行代码
import matplotlib.pyplot as plt import mpld3 import networkx as nx # 构建网络,final_net替换为你自己的边表变量 G = nx.from_pandas_edgelist(final_net,'col_A','col_B') pos = nx.spring_layout(G) fig, ax = plt.subplots(subplot_kw=dict(facecolor='#EEEEEE')) # 绘制网络元素,直接接收节点返回对象 scatter = nx.draw_networkx_nodes(G, pos, ax=ax, node_size=300, alpha=0.8) nx.draw_networkx_edges(G, pos, ax=ax, alpha=0.5) # 核心修改:将节点ID转为字符串列表作为标签 labels = [str(node) for node in G.nodes()] tooltip = mpld3.plugins.PointLabelTooltip(scatter, labels=labels) mpld3.plugins.connect(fig, tooltip) # 隐藏坐标轴 ax.set_axis_off() # Jupyter内直接渲染交互式图表 mpld3.display(fig)
效果说明
运行后会在当前Jupyter单元格内输出交互式网络图,鼠标悬浮在节点上即可自动显示对应的节点ID,无需弹出额外窗口。
内容的提问来源于stack exchange,提问作者Slowat_Kela
相关产品推荐
相关产品推荐

