首页 > 其他分享 >manim边做边学--有向图

manim边做边学--有向图

时间:2024-10-12 09:50:11浏览次数:8  
标签:有向图 layout -- vertex 边学 DiGraph 顶点 config

有向图和上一篇介绍的无向图基本一样,唯一的区别在于有向图的边有方向性,它表示的是顶点之间的单向或依赖关系。

有向图G一般表示为:G=<V,E>。和无向图一样,V是顶点集合,E是边的集合。

不同之处在于,无向图是用小括号(V,E)有向图用尖括号<V,E>

有向图中,边是有方向的,所以,从顶点A到顶点B的边与从顶点B到顶点A的边是不同的。

无向图一样,有向图也有很多应用场景,比如:

地图导航中,有向图常被用来表示道路网络。

节点代表地点(如交叉路口、城市等),有向边代表道路,边的权重可以表示道路的长度、行驶时间或交通状况等。

供应链管理中,有向图可以用来表示货物的流动路径。

节点代表供应链中的各个环节(如供应商、制造商、分销商等),边代表货物流动的路径,边的容量可以表示货物的承载能力。

社会网络中,上一篇提到可以用无向图表示用户之间的好友关系。

而有向图同样可以用在社会网络分析,它可以用来表示用户之间的关注关系,转发关系等,用于分析用户的行为模式。

下面介绍manim中绘制有向图的对象DiGraph

1. 主要参数

有向图对象DiGraph主要参数和无向图类似:

参数名称 类型 说明
vertices list 图的顶点列表
edges list 图的边列表,每个边
labels dict 顶点是否显示标签文本
label_fill_color str 标签的背景色
layout str 图中定点的布局方式
layout_config dict 配置如何布局图中各个顶点
layout_scale float 图各个顶点布局的比例
vertex_type Mobject 顶点的类型,不一定是点,也可以是manim中其他的对象
vertex_config dict 顶点相关的配置
vertex_mobjects dict 一系列的顶点对象
edge_type Mobject 边的类型,不一定是线,也可以是manim中其他的对象
edge_config dict 边相关的配置
paritions list
root_vertex dict

这些参数中,verticesedges相关的参数(比如xxx_type,xxx_config)比较好理解。

labels参数设置是否需要显示顶点的标签,默认是把vertices的数值作为标签的内容。

layout参数内置了多种现成的布局方式:

  • 'circular',
  • 'kamada_kawai'
  • 'partite'
  • 'planar'
  • 'random'
  • 'shell'
  • 'spectral'
  • 'spiral'
  • 'spring'
  • 'tree'

layout_config参数可以对上面现成布局方式的进行微调。

最后两个参数paritionsroot_vertex比较特殊,

paritions只能在layout设置为'partite'时使用,用来生成层状的图(比如描述神经网络的图),

paritions用来设置每一层包含哪些顶点;

root_vertex只能在layout设置为'tree'时使用,用来树状图,

root_vertex用来设置树的根节点。

后面的示例会演示如何使用paritionsroot_vertex来生成层状树状有向图

2. 主要方法

有向图DiGraph的方法主要用来动态改变有向图,比如添加或删除顶点和边。

名称 说明
add_edges 增加有向图的边
add_vertices 增加有向图的顶点
remove_edges 删除有向图的边
remove_vertices 删除有向图的顶点
change_layout 动态改表有向图的结构
from_networkx networkx来生成有向图

networkx是另一个常用的Python库,用于创建、操作和研究复杂网络的结构。

DiGraph对象也可以直接根据networkx的对象生成图。

3. 使用示例

下面的示例和上一篇无向图的示例类似,只是改用有向图DiGraph对象来实现。

3.1. 顶点的配置

顶点的设置和无向图几乎是一样的。

# 不同颜色的设置
graph = DiGraph(
    vertex_config={
        0: {"color": RED},
        # ...
    },
)

# 顶点显示标签
graph = DiGraph(
    labels=True,
)

# 星形顶点
graph = DiGraph(
    vertex_config={"outer_radius": 0.15},
    vertex_type=Star,
)

3.2. 边的配置

有向图的边也和顶点一样,可以设置颜色,粗细等属性,

与无向图不同之处在于:有向图的边可以设置箭头的样式。

# 边的颜色
graph = DiGraph(
    edge_config={
        (0, 1): {"color": RED},
        # ...
    },
)

# 边的粗细
graph = DiGraph(
    edge_config={
        (0, 1): {"stroke_width": 1},
        # ...
    },
)

# 不同箭头的边
graph = DiGraph(
    edge_config={
        (0, 1): {
            "tip_config": {
                "tip_shape": ArrowCircleTip,
            },
        },
        (0, 2): {
            "tip_config": {
                "tip_shape": ArrowTriangleTip,
            },
        },
        # ...
    },
)

3.3. 内置的layout

有向图中内置的layout和上一篇无向图中介绍的是一样的。

for layout in [
    "spring",
    "circular",
    "kamada_kawai",
    "planar",
    "random",
    "shell",
    "spectral",
    "spiral",
]:
    graph = DiGraph(
        layout=layout,
    )

3.4. 层状图

层状图的布局需要配合参数partitions一起使用,partitions中决定每一层中有哪些顶点。

有向图的边有方向,绘制出来更像神经网络的结构。

partitions = [[0, 1], [2, 3, 4], [5, 6], [7, 8]]
graph = DiGraph(
    layout="partite",
    partitions=partitions,
)

3.5. 树状图

树状图的布局需要配合参数root_vertex一起使用,root_vertex定义了树的根顶点是哪个。

这里与无向图有个不同的地方,绘制有向的树状图时,顶点和边的顺序很重要,需要从根节点开始,依次传入各个顶点。

下面示例中,第二个树状图改变了 根节点,不是仅仅改变root_vertex就行的,需要先改变图中顶点的顺序。

下面的代码是简略后的代码,完整的代码可以文中最后部分的链接中下载。

# 初始的树
graph = DiGraph(
    layout="tree",
    root_vertex=0,
)

# 重要!!! 
# 修改前需要调整节点和边的顺序

# 修改根节点
graph2 = DiGraph(
    layout="tree",
    root_vertex=2,
)

4. 附件

文中完整的代码放在网盘中了(digraph.py),

下载地址: 完整代码 (访问密码: 6872)

标签:有向图,layout,--,vertex,边学,DiGraph,顶点,config
From: https://www.cnblogs.com/wang_yb/p/18459887

相关文章

  • 代理模式和委托模式有什么区别
    代理模式(ProxyPattern)和委托模式(DelegationPattern)在软件设计中都是常用的设计模式,但它们的目的和应用场景有所不同。1. 代理模式:目的:代理模式提供了一个代理对象来控制对原对象的访问。它在不直接访问实际对象的情况下,提供了对目标对象的间接访问。应用场景:常用于懒加载......
  • 第 2 章 基础支持层(下)
    2.6DataSourceMyBatis提供了两个javax.sql.DataSource接口实现,分别是PooledDataSource和UnpooledDataSource。MyBatis使用不同的DataSourceFactory接口实现创建不同类型的DataSource。2.6.1工厂方法模式在工厂方法模式中,定义一个用于创建对象的工厂接口,并根......
  • 传输层密码协议(TLCP)伪随机函数 PRF 研究
    TLCP概述TLCP是利用密码技术,为两个应用程序之间提供保密性和数据的完整性。协议用的密码算法包含非对称密码算法、分组密码算法、密码杂凑算法、数据扩展函数和伪随机函数、协议用到的密钥种类包含服务端密钥、客户端密钥、预主密钥、主密钥和工作密钥。密钥种类服务端......
  • 【反转链表】【K个一组翻转链表】两个问题具体思路,文中含多种解法(附完整代码)
    文章目录前言一、如何理解反转链表?二、反转链表1.方法一(递归)方法二(迭代)三、K个一组翻转链表前言本文将围绕【反转链表】问题展开详细论述。采用【递归法】【迭代法】同时,还将进一步升级该问题,讨论【K个一组翻转链表】一、如何理解反转链表?题目链接:[点击......
  • 使用 InstallShield 2020 打包项目 安装程序
     打开InstallShield2020程序,单击New填写信息下一步  打包成功效果 注:打包过程中报错,进行如下设置 ......
  • 代码随想录训练营第60天|冗余连接
    108.冗余连接#include<iostream>#include<vector>usingnamespacestd;intn;//节点数量vector<int>father(1001,0);//按照节点大小范围定义数组//并查集初始化voidinit(){for(inti=0;i<=n;++i){father[i]=i;}}//并查集......
  • 图像去雾综述-图像去雨综述(代码+教程)
    图像去雾是一种针对雾霾、雨雾等大气干扰因素引起的图像模糊和降低对比度的现象进行处理的技术。在现实生活中,这种现象常常会影响到图像的质量,使得图像难以清晰地表现出真实景物。为了解决这个问题,研究人员开发了各种图像去雾算法。本文将对当前主流的图像去雾算法进行综述......
  • taozige/Java语言的Netty框架+云快充协议1.5+充电桩系统+新能源汽车充电桩系统源码
    云快充协议+云快充1.5协议+云快充1.6+云快充协议开源代码+云快充底层协议+云快充桩直连+桩直连协议+充电桩协议+云快充源码介绍云快充协议+云快充1.5协议+云快充1.6+云快充协议开源代码+云快充底层协议+云快充桩直连+桩直连协议+充电桩协议+云快充源码软件架构1、提供云快......
  • Elasticsearch安装学习
    前言:ElasticSearch官网:http://www.elasticsearch.org/先上一张elasticsearch的总体框架图:ElasticSearch是基于Lucene开发的分布式搜索框架,包含如下特性:分布式索引、搜索索引自动分片、负载均衡自动发现机器、组建集群支持Restful风格接口配置简单等。Elasticse......
  • 虚拟化溢出漏洞的安全测试
    使用源码编译方式通过安全测试对VMwareWorkstation进行缓冲区溢出与远程代码执行(RCE)测试的完整流程注意:VMwareWorkstation是一款商业软件,其源代码为闭源状态。未经授权进行逆向工程、漏洞挖掘或任何形式的安全测试可能违反相关法律法规和软件许可协议。以下内容仅供学......