数据可视化数据分析【免费下载链接】plotly.pyThe interactive graphing library for Python :sparkles:项目地址https://gitcode.com/gh_mirrors/pl/plotly.py点击查看免费下载本指南以 plotly.py 官方文档中的《Network Graphs Comparison》教程为蓝本演示如何将两个主流 Python 图论库——igraph与networkx——计算出的网络布局数据统一交由 Plotly 的Scatter轨迹渲染成可交互的网络图。你将学会读取 GML 格式的网络数据、分别调用 Kamada-Kawaiigraph与 Fruchterman-Reingoldnetworkx两种布局算法、把节点坐标 边端点对转换为 Plotly 轨迹并掌握隐藏坐标轴、配置悬停信息与图注等绘制细节。示例背景同一张网络两种图库两种布局本教程的核心实验对象是一个真实数据集——网络理论与实验领域科学家的合著网络coauthorship network of scientists working on network theory and experiment数据以 GML 文件netscience.gml的形式发布在 UC Irvine 的 Network Data Repository 上。教程的设计思路是同一份图数据两条独立的绘制路径路径图库布局算法说明第一条igraph.GraphKamada-Kawailayout(kk)igraph 原生支持读取 GML 文件第二条networkx.GraphFruchterman-Reingoldfruchterman_reingold_layout文档明确指出 networkx 无法直接读取该 GML 文件因此从 igraph 的解析结果中复用顶点与边数据两条路径最终都产出同样的 Plotly 轨迹结构一条modelines的边轨迹灰色细线叠加一条modemarkers的节点轨迹紫色圆点、悬停显示标签唯一的差异是节点坐标来自不同的布局算法。使用前需安装图库文档原始命令为sudo pip install igraph与sudo pip install networkx当前环境建议使用虚拟环境安装例如pip install igraph networkx plotly。路径一用 igraph 读取 GML 并计算 Kamada-Kawai 布局读取图与提取结构数据import igraph as ig G ig.Graph.Read_GML(netscience.gml.txt) labels list(G.vs[label]) # 顶点标签将作为悬停文本 N len(labels) # 顶点数 E [e.tuple for e in G.es] # 边列表每条边是 (源顶点索引, 目标顶点索引) layt G.layout(kk) # Kamada-Kawai 布局 type(layt) # igraph.layout.Layout关键点拆解G.vs[label]一次性取出所有顶点的label属性对应 GML 文件中每个节点自带的属性字段G.es遍历所有边e.tuple返回边的两个端点索引E最终是一个由二元组组成的列表是后续绘制连线的最小数据单元G.layout(kk)调用 Kamada-Kawai 力导向布局返回igraph.layout.Layout对象可通过下标layt[k][0]、layt[k][1]访问第 k 个节点的 x、y 坐标。将布局坐标转换为 Plotly 轨迹布局坐标本身只是数值Plotly 的Scatter轨迹按点序列而非图结构消费数据因此需要把节点坐标和边的端点坐标展平成两个一维数组import plotly.plotly as py # 旧版 APIv1/v2 时代新代码见下文现代 API 迁移 from plotly.graph_objs import * Xn [layt[k][0] for k in range(N)] # 所有节点的 x 坐标 Yn [layt[k][1] for k in range(N)] # 所有节点的 y 坐标 Xe [] Ye [] for e in E: # 每条边生成两个端点坐标中间插入 None 断开线段 Xe [layt[e[0]][0], layt[e[1]][0], None] Ye [layt[e[0]][1], layt[e[1]][1], None] trace1 Scatter(xXe, yYe, modelines, # 纯连线模式 linedict(colorrgb(210,210,210), width1), hoverinfonone # 边不参与悬停交互 ) trace2 Scatter(xXn, yYn, modemarkers, # 纯散点模式 namentw, markerdict(symbolcircle-dot, size5, color#6959CD, linedict(colorrgb(50,50,50), width0.5) ), textlabels, # 悬停文本 hoverinfotext # 只显示文本 )这段代码里有几个值得展开的绘制细节用None断线Plotly 的连线轨迹遇到None会断开线段因此Xe/Ye采用端点 1 → 端点 2 → None的交替结构天然地把所有边画成互不相连的独立线段这是用散点图轨迹画网络边的最通用手法边轨迹关闭悬停hoverinfonone让 900 多条细线不干扰鼠标悬停节点悬停显示标签textlabels绑定节点名hoverinfotext使悬停气泡只显示该节点标签描边节点marker.line为圆点添加深色细描边rgb(50,50,50)、宽度 0.5在密集网络图中可显著提升节点可辨识度。隐藏坐标轴与整体布局网络图不需要坐标轴刻度教程用统一的axis字典一次性关闭轴线、网格和刻度标签axis dict(showlineFalse, # 隐藏轴线 zerolineFalse, # 隐藏零线 showgridFalse, # 隐藏网格 showticklabelsFalse, # 隐藏刻度标签 title ) layout Layout(titleCoauthorship network of scientists working on network theory and experiment br Data source: [1], fontdict(size12), showlegendFalse, autosizeFalse, width800, height800, xaxislayout.XAxis(axis), yaxislayout.YAxis(axis), marginlayout.Margin(l40, r40, b85, t100), hovermodeclosest, # 悬停最近节点 annotations[ dict( showarrowFalse, textThis igraph.Graph has the Kamada-Kawai layout, xrefpaper, yrefpaper, x0, y-0.1, xanchorleft, yanchorbottom, fontdict(size14) ) ] ) data [trace1, trace2] fig Figure(datadata, layoutlayout) py.iplot(fig, filenameCoautorship-network-igraph)布局要点说明autosizeFalse配合显式的width/height固定画布为 800×800 正方形避免响应式缩放导致布局比例失真hovermodeclosest让鼠标靠近节点时立即命中最近的节点页面坐标注释xrefpaper、yrefpaper、x0、y-0.1把使用 Kamada-Kawai 布局的说明文字锚定在图区下方不随数据缩放而移动。路径二用 networkx 构建同一网络并应用 Fruchterman-Reingold 布局从 igraph 数据重建 networkx.Graph文档在此处有一个非常直白的感叹Because networkx cannot read the gml file (why?!!)——即在当时的场景下networkx无法直接解析该 GML 文件。教程给出的解法是复用路径一中已解析好的顶点与边数据手工构建networkx.Graphimport networkx as nx V range(N) # 顶点集合整数索引 g nx.Graph() g.add_nodes_from(V) g.add_edges_from(E) # E 即上文由 igraph 提取的边列表 pos nx.fruchterman_reingold_layout(g)这里pos是一个字典键是节点索引值是(x, y)坐标元组。教程明确说明选择 FR 布局的原因——networkx 不提供 Kamada-Kawai 布局FR 是 networkx 内置的经典力导向布局。同一套展平逻辑不同坐标源节点与边的坐标转换逻辑与路径一完全一致只是坐标来源从layt换成posXv [pos[k][0] for k in range(N)] Yv [pos[k][1] for k in range(N)] Xed [] Yed [] for edge in E: Xed [pos[edge[0]][0], pos[edge[1]][0], None] Yed [pos[edge[0]][1], pos[edge[1]][1], None] trace3 Scatter(xXed, yYed, modelines, linedict(colorrgb(210,210,210), width1), hoverinfonone ) trace4 Scatter(xXv, yYv, modemarkers, namenet, markerdict(symbolcircle-dot, size5, color#6959CD, linedict(colorrgb(50,50,50), width0.5) ), textlabels, hoverinfotext ) annot (This networkx.Graph has the Fruchterman-Reingold layoutbrCode: [2]) data1 [trace3, trace4] fig1 Figure(datadata1, layoutlayout) fig1[layout][annotations][0][text] annot # 复用 fig 的 layout只替换注释文字 py.iplot(fig1, filenameCoautorship-network-nx)注意这里复用了路径一构建的layout对象仅通过fig1[layout][annotations][0][text] annot就地替换注释文字——这是基于字典式属性访问的便捷改法体现了 graph object 既支持属性语法fig.layout也支持字典下标fig[layout]的双重访问接口。FR 布局的视觉特征与 spring_layout 等价性文档针对 FR 布局的绘图结果给出了一条重要的实践提示Zoom in a selected region of nodes to see that edges are also plotted, but due to the node positions assigned by FR layout, they are invisible at the first sight.即 Fruchterman-Reingold 布局把许多节点推挤得彼此重叠边被节点圆点遮挡第一眼看不到边放大局部区域后才能看到。这是力导向布局在稠密合著网络上的典型现象并不代表边数据缺失。此外文档指出将布局替换为pos nx.spring_layout(g)可以得到相似的结果——spring_layout正是 FR 算法的通用实现基于 Fruchterman-Reingold 力模型两者坐标形态接近。从旧版 API 迁移到当前仓库的现代写法上述示例中的import plotly.plotly as py与py.iplot(...)属于 plotly.py 早期版本v1/v2 时代的在线/notebook 绘图 API。在当前仓库中这一用法已由plotly.graph_objects与Figure.show()取代渲染流程也从上传到在线服务变为本地渲染浏览器、notebook 或静态导出。等价写法如下import plotly.graph_objects as go fig go.Figure(data[trace1, trace2], layoutlayout) fig.show() # 在 notebook / 浏览器中本地渲染若希望写入本地 HTML 文件可使用plotly.io.write_html(fig, network.html)或fig.write_html(network.html)。另外值得说明的是教程里使用的from plotly.graph_objs import *命名空间在当前仓库中依然存在——plotly.graph_objs与plotly.graph_objects提供相同的轨迹/布局类只是前者被标记为向后兼容的别名见 graph_objs/init.py 中对_deprecations模块的导入。新代码推荐统一使用plotly.graph_objects as go。源码视角Scatter 轨迹如何支撑网络图绘制整篇教程的核心绘图原语是Scatter其类型定义位于仓库的 plotly/graph_objs/_scatter.py该类由代码生成器自动生成头部标注 THIS FILE IS AUTO-GENERATED。从其_valid_props集合可以看到教程用到的全部属性都被原生支持x、y数据数组modelines时按序连线遇到None断开——这正是教程用None分隔各条边的依据modelines边轨迹与markers节点轨迹两种模式在本教程中各司其职line边轨迹的color、width对应rgb(210,210,210)灰色细线marker节点的symbol、size、color以及内嵌line描边颜色与宽度对应紫色圆点#6959CDtexthoverinfohoverinfotext时悬停只显示text内容hoverinfonone时关闭悬停二者分别用于节点与边。此外教程中使用的Layoutxaxis、yaxis、margin、annotations、hovermode、autosize等同样是plotly.graph_objs命名空间下的一等公民类。可以推断教程展示的轨迹数组 布局对象 → Figure三步组装方式是 plotly.py 一直延续至今的图形对象模型Figure(data..., layout...)最终会被序列化为 Plotly.js 可消费的 JSON 规范。延伸与总结本教程的完整方法论图库算布局 → 展平坐标 → Scatter 轨迹 → Figure与仓库中的 network-graphs.md 指南一脉相承后者给出了更多网络图绘制技巧若需三维网络可视化可参考 3d-network-graph.mdScatter轨迹的全部可用属性与取值可在其自动生成的类型定义中查阅见 plotly/graph_objs/_scatter.py绘制网络图时最常用的是mode、line、marker、text、hoverinfo五项实战中若数据规模较大应优先考虑ScatterglWebGL 加速版本其 API 与Scatter高度一致见 plotly/graph_objs/_scattergl.py只需替换类名即可获得更好的渲染性能。通过两条路径的对照可以清晰看到布局算法igraph 的 Kamada-Kawai / networkx 的 Fruchterman-Reingold决定节点如何排布而 Plotly 只负责把排布结果忠实地可视化。这种图库负责图论计算、Plotly 负责渲染交互的分工模式正是 Python 生态中网络可视化最灵活、最常用的组合方式。赞分享数据可视化数据分析【免费下载链接】plotly.pyThe interactive graphing library for Python :sparkles:项目地址https://gitcode.com/gh_mirrors/pl/plotly.py点击查看免费下载相关推荐如何用 from_networkx 把 NetworkX 图快速绘制为 Bokeh 网络图如何用 from_networkx 把 NetworkX 图快速绘制为 Bokeh 网络图 如果你手里已经有一个 networkx.Graph 对象想把它变数据可视化图表库Butterfly布局算法深度解析Dagre、Fruchterman、Force等7大布局对比Butterfly布局算法深度解析Dagre、Fruchterman、Force等7大布局对比 Butterfly是一个专注于流程图布局的JavaScript前端UI组件图表库数据可视化litellm-proxy 源码导读用 litellm --model 一行命令启动 OpenAI 兼容网关统一调用 100 LLMlitellm proxy 源码导读用 litellm model 一行命令启动 OpenAI 兼容网关统一调用 100 LLM 本指南以仓库内 lite数据可视化数据分析上一篇AhabAssistantLimbusCompany深度解析PC端《Limbus Company》自动化助手的高效部署方案下一篇FP8量化实战NVIDIA-Nemotron-Labs-3-Elastic-30B-A3B-FP8的精度恢复与性能优化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考