【图论】 Graph.jl 概览

文章目录

  • 安装
  • 基础使用
  • 读写图
    • [按照 .lgz 格式存储图数据(压缩格式)](#按照 .lgz 格式存储图数据(压缩格式))
    • [按照 .lg 格式存储图数据(非压缩格式)](#按照 .lg 格式存储图数据(非压缩格式))
  • 图的绘制
    • [TikzGraphs.jl Latex 论文风格](#TikzGraphs.jl Latex 论文风格)
    • [GraphPlot.jl 通常与 Compose.jl 一起使用](#GraphPlot.jl 通常与 Compose.jl 一起使用)
    • [SGtSNEpi.jl 擅长画 2维,3维稀疏图](#SGtSNEpi.jl 擅长画 2维,3维稀疏图)
    • [GraphRecipes.jl 基于 Plots.jl 的包, 功能较为基础。](#GraphRecipes.jl 基于 Plots.jl 的包, 功能较为基础。)
    • [GraphMakie.jl 擅长绘制2维,3维空间中的图,交互性更强。](#GraphMakie.jl 擅长绘制2维,3维空间中的图,交互性更强。)
    • [Karnak.jl 主要擅长绘制 2维图, 且参数设置丰富。](#Karnak.jl 主要擅长绘制 2维图, 且参数设置丰富。)

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

图论是数学,计算机等学科常见的课程设置。由于 Julia 语言运算速度高效的原因, 其第三方包的非常丰富且社区活跃。无论是指标计算,还是算法设计都有广泛的生态。

Graph.jl 是最为基础的图论包。可以与 Python语言 的 NetworkX 包类比。

安装

julia 复制代码
using Pkg
Pkg.add("Graphs")
Pkg.add("Karnak")

基础使用

julia 复制代码
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])
julia 复制代码
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 格式存储图数据(压缩格式)

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

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

julia 复制代码
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维图, 且参数设置丰富。