【图论】 Graph.jl 概览

发布于:2025-09-01 ⋅ 阅读:(17) ⋅ 点赞:(0)

参考链接
https://juliagraphs.org/Graphs.jl/stable/

图论是数学,计算机等学科常见的课程设置。由于 Julia 语言运算速度高效的原因, 其第三方包的非常丰富且社区活跃。无论是指标计算,还是算法设计都有广泛的生态。
Graph.jl 是最为基础的图论包。可以与 Python语言 的 NetworkX 包类比。

安装

using Pkg
Pkg.add("Graphs")
Pkg.add("Karnak")

基础使用

using Graphs  调用图论包
using Karnak  调用图论绘图包
g=path_graph(6)  # 生成无向简单图,权重为整数
println(nv(g))  # 图的顶点数
println(ne(g)) # 图的边数
@drawsvg begin
    background("grey10")
    sethue("orange")
    drawgraph(g,vertexlabels = [1, 2, 3, 4,5,6])

在这里插入图片描述

using Graphs  # 调用图论包
using Karnak  # 调用图论绘图包
g=path_graph(6)  # 生成无向简单图,权重为整数
add_edge!(g, 2, 4) # 添加边
@drawsvg begin
background("grey10")
sethue("skyblue")
drawgraph(g,
        vertexshapesizes = [20, 20, 20, 20, 20, 20],
    vertexlabelfontsizes = 10,
    vertexlabels =["a","b","c","d","e","f"])
end 600 300

在这里插入图片描述

基本操作

代码 含义
add_vertex!(g) 向图g添加1个顶点
add_vertices!(g, n) 向图g添加 n 个顶点
add_edge!(g, s, d) 将边 (s, d) 添加到图 g
rem_vertex!(g, v) 将顶点 v 从图 g移除
rem_edge!(g, s, d) 将边 (s, d) 从 g 移除

全局图的指标

代码 含义
nv(g) g的顶点数
ne(g) g变数
vertices(g) 图 g 包含的所有顶点
edges(g) 图 g 包含的所有边
has_vertex(g, v) 验证顶点 v 是否在 g 中
has_edge(g, s, d) 验证边 (s,d) 是否在 g 中
has_self_loops(g) 验证图 g 的所有自回路(圈)
is_directed(g) 验证图g是否有向图
eltype(g) 验证 g 所有顶点的类型

顶点性质

代码 含义
neighbors(g, v) 返回点 v 的邻域, (若有向图返回所有外邻域)
all_neighbors 返回点 v 的邻域(若有向图返回所有外邻域和内邻域)

边性质

代码 含义
src(e) 给出边 (s,d) 的起点
dst(e) 给出边 (s,d) 的终点
reverse(e) 添加新边在 (s,d) 基础上添加 (d,s)

读写图

按照 .lgz 格式存储图数据(压缩格式)

using Graphs  # 调用图论包
g=path_graph(6)  # 生成无向简单图,权重为整数
savegraph("mygraph.lgz", g) # 保存
reloaded_g = loadgraph("mygraph.lgz")  # 读取

按照 .lg 格式存储图数据(非压缩格式)

using Graphs  
g=path_graph(6)  
savegraph("mygraph.lg", g)
reloaded_g = loadgraph("mygraph.lgz")

更多格式的读取与存储需要 GraphIO.jl

图的绘制

常见包

TikzGraphs.jl Latex 论文风格

在这里插入图片描述

GraphPlot.jl 通常与 Compose.jl 一起使用

SGtSNEpi.jl 擅长画 2维,3维稀疏图

在这里插入图片描述
在这里插入图片描述

GraphRecipes.jl 基于 Plots.jl 的包, 功能较为基础。

在这里插入图片描述

GraphMakie.jl 擅长绘制2维,3维空间中的图,交互性更强。

在这里插入图片描述

Karnak.jl 主要擅长绘制 2维图, 且参数设置丰富。


网站公告

今日签到

点亮在社区的每一天
去签到