manim边做边学--有向图
有向图和上一篇介绍的无向图基本一样,唯一的区别在于有向图的边有方向性,它表示的是顶点之间的单向或依赖关系。
有向图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 |
这些参数中,vertices
和edges
相关的参数(比如xxx_type,xxx_config)比较好理解。
labels
参数设置是否需要显示顶点的标签,默认是把vertices
的数值作为标签的内容。
layout
参数内置了多种现成的布局方式:
'circular',
'kamada_kawai'
'partite'
'planar'
'random'
'shell'
'spectral'
'spiral'
'spring'
'tree'
layout_config
参数可以对上面现成布局方式的进行微调。
最后两个参数paritions
和root_vertex
比较特殊,
paritions
只能在layout
设置为'partite'
时使用,用来生成层状的图(比如描述神经网络的图),
paritions
用来设置每一层包含哪些顶点;
root_vertex
只能在layout
设置为'tree'
时使用,用来树状图,
root_vertex
用来设置树的根节点。
后面的示例会演示如何使用paritions
和root_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)
manim边做边学--有向图的更多相关文章
- 边做边学入门微信小程序之仿豆瓣评分
微信小程序由于适用性强.逻辑简要.开发迅速的特性,叠加具有海量活跃用户的腾讯公司背景,逐渐成为了轻量级单一功能应用场景的较佳承载方式,诸如电影购票.外卖点餐.移动商城.生活服务等场景服务提供商迅速切入 ...
- Grails边做边学入门篇[1]--------大家一起来动手建立project和Domain
近期工作比較忙,没空写博客了.我发现每周五的下午都是我最放松的时候,可能是迟延症的缘故吧...总是寄希望于周末,慢慢的.我的周末就被工作占领了. 希望大家不要有这种坏毛病.今日事,今日毕.当然我们程序 ...
- 技术的止境(客户价值第一,快速实现第二,边做边学,迅速成为牛人。紧贴客户的需求去做技术,立于不败之地。追求的目标:把一项产品去做好,用产品去养活自己和家人)good
作为一个依靠技术来谋生的程序员,我最近一直在思考一个问题,有限的生命里,面对无限的技术更新,我要研究到什么程度才能算是完成我的成为技术大牛的目标呢?换而言之,那就是技术的止境在哪儿呢?深入的思考下去, ...
- 【Leetcode 做题学算法周刊】第四期
首发于微信公众号<前端成长记>,写于 2019.11.21 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 67 ...
- 做fzu oj 1045 做减法学到的sprintf()函数
题目 做题一直输不出答案,于是就上网去百度了这题的解题,发现解答十分的简短,而且其中我看见了平时没见过的函数,sprintf(). 于是就百度sprintf()的使用. 如下: 函数功能:把格式化的数 ...
- 【Leetcode 做题学算法周刊】第一期
首发于微信公众号<前端成长记>,写于 2019.10.28 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 1. ...
- 【Leetcode 做题学算法周刊】第二期
首发于微信公众号<前端成长记>,写于 2019.11.05 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 20 ...
- 【Leetcode 做题学算法周刊】第三期
首发于微信公众号<前端成长记>,写于 2019.11.13 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 35 ...
- 【Leetcode 做题学算法周刊】第六期
首发于微信公众号<前端成长记>,写于 2019.12.15 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 11 ...
- 【Leetcode 做题学算法周刊】第七期
首发于微信公众号<前端成长记>,写于 2020.01.15 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 12 ...
随机推荐
- 【Tutorial C】03 数据类型、变量
在程序的世界中,可以让计算机按照指令做很多事情, 如进行数值计算.图像显示.语音对话.视频播放.天文计算.发送邮件.游戏绘图以及任何我们可以想象到的事情. 要完成这些任务,程序需要使用数据,即承载信息 ...
- AI围棋项目:KataGo
网站地址: https://katagotraining.org/ 项目地址: https://github.com/lightvector/KataGo
- 分段树(segment tree)的实现 —— 强化学习中 "优先级回放机制" 的重要组成部分
分段树(segment tree)是强化学习中 "优先级回放机制" 的重要组成部分.本文针对分段树(segment tree)的一个开源版本的实现来进行分析,代码地址: https ...
- TensorFlow和pytorch中的pin_memory和non_blocking设置是做什么的,又是否有用???(续2)
接前文: TensorFlow和pytorch中的pin_memory和non_blocking设置是做什么的,又是否有用??? TensorFlow和pytorch中的pin_memory和non_ ...
- SQL Server序列号的获取
建表: 1 USE [JX_IMS_CPK] 2 GO 3 4 SET ANSI_NULLS ON 5 GO 6 7 SET QUOTED_IDENTIFIER ON 8 GO 9 10 CREATE ...
- LeetCode40.组合总和II
LeetCode40.组合总和II 力扣题目链接(opens new window) 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 ...
- C# 导出Excel NPOI 修改指定单元格的样式 或者行样式
参考文章:原文链接:https://blog.csdn.net/chensirbbk/article/details/52189985 #region 2.NPOI读取Excel 验证Excel数据的 ...
- Linux 常见编辑器
命令行编辑器 Vim Linux 上最出名的编辑器当属 Vim 了.Vim 由 Vi 发展而来,Vim 的名字意指 Vi IMproved,表示 Vi 的升级版.Vim 对于新手来说使用比较复杂,不过 ...
- WiFi基础(二):最新WiFi信道、无线OSI模型与802.11b/g/n
liwen01 2024.09.01 前言 最近十几年,通信技术发展迅猛,通信标准更新频繁,有的设备还在使用 802.11/b/g/n 协议,有的已支持到 WiFi6.WiFi7. 而国内有关无线 W ...
- 使用 nuxi generate 进行预渲染和部署
title: 使用 nuxi generate 进行预渲染和部署 date: 2024/9/4 updated: 2024/9/4 author: cmdragon excerpt: 通过 nuxi ...