manim边做边学--有向图

打印 上一主题 下一主题

主题 919|帖子 919|积分 2757

有向图和上一篇介绍的无向图基本一样,唯一的区别在于有向图的边有方向性,它表现的是顶点之间的单向或依靠关系。
有向图G一般表现为:G=。和无向图一样,V是顶点聚集,E是边的聚集。
不同之处在于,无向图是用小括号(V,E),有向图用尖括号。
有向图中,边是有方向的,所以,从顶点A到顶点B的边与从顶点B到顶点A的边是不同的。
无向图一样,有向图也有很多应用场景,比如:
舆图导航中,有向图常被用来表现道路网络。
节点代表地点(如交织路口、城市等),有向边代表道路,边的权重可以表现道路的长度、行驶时间或交通状态等。
供应链管理中,有向图可以用来表现货物的活动路径。
节点代表供应链中的各个环节(如供应商、制造商、分销商等),边代表货物活动的路径,边的容量可以表现货物的承载能力。
社会网络中,上一篇提到可以用无向图表现用户之间的挚友关系。
而有向图同样可以用在社会网络分析,它可以用来表现用户之间的关注关系,转发关系等,用于分析用户的行为模式。
下面介绍manim中绘制有向图的对象DiGraph。
1. 重要参数

有向图对象DiGraph重要参数和无向图类似:
参数名称范例阐明verticeslist图的顶点列表edgeslist图的边列表,每个边labelsdict顶点是否显示标签文本label_fill_colorstr标签的配景色layoutstr图中定点的布局方式layout_configdict设置如何布局图中各个顶点layout_scalefloat图各个顶点布局的比例vertex_typeMobject顶点的范例,不肯定是点,也可以是manim中其他的对象vertex_configdict顶点相关的设置vertex_mobjectsdict一系列的顶点对象edge_typeMobject边的范例,不肯定是线,也可以是manim中其他的对象edge_configdict边相关的设置paritionslistroot_vertexdict这些参数中,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. 顶点的设置

顶点的设置和无向图几乎是一样的。
  1. # 不同颜色的设置
  2. graph = DiGraph(
  3.     vertex_config={
  4.         0: {"color": RED},
  5.         # ...
  6.     },
  7. )
  8. # 顶点显示标签
  9. graph = DiGraph(
  10.     labels=True,
  11. )
  12. # 星形顶点
  13. graph = DiGraph(
  14.     vertex_config={"outer_radius": 0.15},
  15.     vertex_type=Star,
  16. )
复制代码

3.2. 边的设置

有向图的边也和顶点一样,可以设置颜色,粗细等属性,
与无向图不同之处在于:有向图的边可以设置箭头的样式。
  1. # 边的颜色
  2. graph = DiGraph(
  3.     edge_config={
  4.         (0, 1): {"color": RED},
  5.         # ...
  6.     },
  7. )
  8. # 边的粗细
  9. graph = DiGraph(
  10.     edge_config={
  11.         (0, 1): {"stroke_width": 1},
  12.         # ...
  13.     },
  14. )
  15. # 不同箭头的边
  16. graph = DiGraph(
  17.     edge_config={
  18.         (0, 1): {
  19.             "tip_config": {
  20.                 "tip_shape": ArrowCircleTip,
  21.             },
  22.         },
  23.         (0, 2): {
  24.             "tip_config": {
  25.                 "tip_shape": ArrowTriangleTip,
  26.             },
  27.         },
  28.         # ...
  29.     },
  30. )
复制代码

3.3. 内置的layout

有向图中内置的layout和上一篇无向图中介绍的是一样的。
  1. for layout in [
  2.     "spring",
  3.     "circular",
  4.     "kamada_kawai",
  5.     "planar",
  6.     "random",
  7.     "shell",
  8.     "spectral",
  9.     "spiral",
  10. ]:
  11.     graph = DiGraph(
  12.         layout=layout,
  13.     )
复制代码

3.4. 层状图

层状图的布局需要配合参数partitions一起利用,partitions中决定每一层中有哪些顶点。
有向图的边有方向,绘制出来更像神经网络的布局。
  1. partitions = [[0, 1], [2, 3, 4], [5, 6], [7, 8]]
  2. graph = DiGraph(
  3.     layout="partite",
  4.     partitions=partitions,
  5. )
复制代码

3.5. 树状图

树状图的布局需要配合参数root_vertex一起利用,root_vertex定义了树的根顶点是哪个。
这里与无向图有个不同的地方,绘制有向的树状图时,顶点和边的顺序很重要,需要从根节点开始,依次传入各个顶点。
下面示例中,第二个树状图改变了 根节点,不是仅仅改变root_vertex就行的,需要先改变图中顶点的顺序。
下面的代码是简略后的代码,完整的代码可以文中末了部分的链接中下载。
  1. # 初始的树
  2. graph = DiGraph(
  3.     layout="tree",
  4.     root_vertex=0,
  5. )
  6. # 重要!!!
  7. # 修改前需要调整节点和边的顺序
  8. # 修改根节点
  9. graph2 = DiGraph(
  10.     layout="tree",
  11.     root_vertex=2,
  12. )
复制代码

4. 附件

文中完整的代码放在网盘中了(digraph.py),
下载地址: 完整代码 (访问密码: 6872)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

尚未崩坏

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表