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

有向图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)

manim边做边学--有向图的更多相关文章

  1. 边做边学入门微信小程序之仿豆瓣评分

    微信小程序由于适用性强.逻辑简要.开发迅速的特性,叠加具有海量活跃用户的腾讯公司背景,逐渐成为了轻量级单一功能应用场景的较佳承载方式,诸如电影购票.外卖点餐.移动商城.生活服务等场景服务提供商迅速切入 ...

  2. Grails边做边学入门篇[1]--------大家一起来动手建立project和Domain

    近期工作比較忙,没空写博客了.我发现每周五的下午都是我最放松的时候,可能是迟延症的缘故吧...总是寄希望于周末,慢慢的.我的周末就被工作占领了. 希望大家不要有这种坏毛病.今日事,今日毕.当然我们程序 ...

  3. 技术的止境(客户价值第一,快速实现第二,边做边学,迅速成为牛人。紧贴客户的需求去做技术,立于不败之地。追求的目标:把一项产品去做好,用产品去养活自己和家人)good

    作为一个依靠技术来谋生的程序员,我最近一直在思考一个问题,有限的生命里,面对无限的技术更新,我要研究到什么程度才能算是完成我的成为技术大牛的目标呢?换而言之,那就是技术的止境在哪儿呢?深入的思考下去, ...

  4. 【Leetcode 做题学算法周刊】第四期

    首发于微信公众号<前端成长记>,写于 2019.11.21 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 67 ...

  5. 做fzu oj 1045 做减法学到的sprintf()函数

    题目 做题一直输不出答案,于是就上网去百度了这题的解题,发现解答十分的简短,而且其中我看见了平时没见过的函数,sprintf(). 于是就百度sprintf()的使用. 如下: 函数功能:把格式化的数 ...

  6. 【Leetcode 做题学算法周刊】第一期

    首发于微信公众号<前端成长记>,写于 2019.10.28 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 1. ...

  7. 【Leetcode 做题学算法周刊】第二期

    首发于微信公众号<前端成长记>,写于 2019.11.05 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 20 ...

  8. 【Leetcode 做题学算法周刊】第三期

    首发于微信公众号<前端成长记>,写于 2019.11.13 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 35 ...

  9. 【Leetcode 做题学算法周刊】第六期

    首发于微信公众号<前端成长记>,写于 2019.12.15 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 11 ...

  10. 【Leetcode 做题学算法周刊】第七期

    首发于微信公众号<前端成长记>,写于 2020.01.15 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 12 ...

随机推荐

  1. Jax报错:Windows系统环境下WSL中运行Jax会导致nvidia-smi报错退出,无法使用nvidia-smi和gpustat

    环境: Window11下的WSL: 运行jax,导致nvidia-smi无法使用,不过经过测试发现虽然nvidia-smi报错无法使用,但是GPU已经可以正常使用,调用jax的GPU运行也保持正常, ...

  2. 外观很好看的云盘:一款开源的云盘系统 —— kodcloud

    看到一款外观十分好看的开源云盘系统: 下载地址: https://kodcloud.com/explorer/download/ 开源地址: https://github.com/kalcaddle ...

  3. vim 插件汇总网站

    在网上找到了一个vim插件的汇总网站,上面有对vim插件进行汇总.简介.使用排名等,十分适合vim用户在上面寻找一些可用的插件. 网址: https://vimawesome.com/ 虽然我没有太用 ...

  4. Mysql 不用Json存储 List<Long>的方式

    public static void main(String[] args) { List<Long> idList = new ArrayList<>(); for (int ...

  5. .proto文件的作用

    在网络通信和通用数据交换等应用场景中经常使用的技术是 JSON 或 XML,而在最近的开发中接触到了 Google 的 ProtoBuf. 在查阅相关资料学习 ProtoBuf 以及研读其源码之后,发 ...

  6. Mac安装Adobe PS_AE_PR等系列软件提示错误代码146怎么办?

    在安装Mac版Adobe系列软件的时候,不管PS.AE.PR.AI等,如果出现错误代码146,下面两个方法能够轻松解决. 解决方法一:需要我们打开「系统设置」-「隐私与安全」-「App管理」,打开「i ...

  7. android 访问域名接口报错

    1. 移动端访问https域名及接口,显示 java.net.UnknownHostException: Unable to resolve host "xxx" : No add ...

  8. Webpack4-使用expose-loader将变量注册到全局

    首先贴一下 package.json中的插件版本,不同的版本也许会有很大的差异: // package.json{ "name": "WEBPACK-DEV-1" ...

  9. windows系统使用UnblockNeteaseMusic解锁网易云音乐灰色歌曲

    使用UnblockNeteaseMusic解锁网易云音乐灰色歌曲 一.问题 用网易云音乐听歌曲,有的曲目听不了,如下: 二.解决步骤 参照:https://github.com/nondanee/Un ...

  10. Goby 漏洞发布|泛微 e-cology v10 appThirdLogin 权限绕过漏洞【漏洞复现】

    漏洞名称:泛微 e-cology v10 appThirdLogin 权限绕过漏洞 English Name:Weaver e-cology v10 appThirdLogin Permission ...