|
无向图属于数学中的图论这一学科,
所谓无向图G,就是由顶点集V(非空集合)和边集E(由V中元素构成的无序二元组的集合)组成的图,
可表示为G=(V,E)。
在无向图中,边没有方向,即从顶点A到顶点B的边与从顶点B到顶点A的边是相同的。
无向图简洁直观,常用于描述社交网络,交通网络以及电子电路等等。
在社交网络中,用户可以被视为顶点,而用户之间的关系则可以被视为边。
因为好友关系通常是双向的,没有明确的方向性,非常适合用无向图来表示。
在城市交通规划中,可以将各个路口或交通节点视为顶点,而将路口之间的道路或交通线路视为边。
因为道路通常是双向通行的,所以也适合用无向图来表示。
在电子电路设计中,可以将各个电子元件(如电阻、电容、电感等)视为顶点,而将元件之间的连接关系(如导线连接)视为边。
无向图可以表示这种电路结构,因为电路中的电流和信号通常是双向传输的。
下面介绍manim中绘制无向图的对象Graph。
1. 主要参数
无向图对象Graph主要参数有:
参数名称类型说明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. 主要方法
无向图Graph的方法主要用来动态改变无向图,比如添加或删除顶点和边。
名称说明add_edges增加无向图的边add_vertices增加无向图的顶点remove_edges删除无向图的边remove_vertices删除无向图的顶点change_layout动态改表无向图的结构from_networkx从networkx来生成无向图networkx是另一个常用的Python库,用于创建、操作和研究复杂网络的结构。
Graph对象可以直接根据networkx的对象生成图。
3. 使用示例
下面通过示例了解Graph对象的使用。
3.1. 顶点的配置
顶点默认是Dot对象,可以设置其大小和颜色,也可以添加标签,也就是在顶点中显示文字。
更进一步,设置可以改变顶点的形状,使用manim中的其他几何对象来作为图的顶点。- # 不同颜色的设置
- graph = Graph(
- vertex_config={
- 0: {"color": RED},
- # ...
- },
- )
- # 顶点显示标签
- graph = Graph(
- labels=True,
- )
- # 星形顶点
- graph = Graph(
- vertex_config={"outer_radius": 0.15},
- vertex_type=Star,
- )
复制代码
3.2. 边的配置
无向图的边也和顶点一样,可以设置颜色,粗细等属性,此外还可以将默认的直线改成虚线。- # 边的颜色
- graph = Graph(
- edge_config={
- (0, 1): {"color": RED},
- # ...
- },
- )
- # 边的粗细
- graph = Graph(
- edge_config={
- (0, 1): {"stroke_width": 1},
- # ...
- },
- )
- # 虚线
- graph = Graph(
- edge_type=DashedLine,
- )
复制代码
3.3. 内置的layout
上面的示例中,我们只能控制无向图的顶点和边的数量,而无法控制它的形状和布局,
manim为我们内置了多种不同的布局方式,直接使用这些内置的布局方式可以节约很多时间。- for layout in [
- "spring",
- "circular",
- "kamada_kawai",
- "planar",
- "random",
- "shell",
- "spectral",
- "spiral",
- ]:
- graph = Graph(
- layout=layout,
- )
复制代码
3.4. 层状图
层状图的布局需要配合参数partitions一起使用,partitions中决定每一层中有哪些顶点。
神经网络的结构图就是一个典型的层状图。
下面的示例中,通过partitions参数中定义了4个层。- partitions = [[0, 1], [2, 3, 4], [5, 6], [7, 8]]
- graph = Graph(
- layout="partite",
- partitions=partitions,
- )
复制代码
3.5. 树状图
树状图的布局需要配合参数root_vertex一起使用,root_vertex定义了树的根顶点是哪个。
下面的示例中,先设置root_vertex为顶点0,再把root_vertex改为顶点2。- # 初始的树
- graph = Graph(
- layout="tree",
- root_vertex=0,
- )
- # 修改根节点
- graph2 = Graph(
- layout="tree",
- root_vertex=2,
- )
复制代码
4. 附件
文中完整的代码放在网盘中了(graph.py),
下载地址: 完整代码 (访问密码: 6872)
来源:https://www.cnblogs.com/wang_yb/p/18456015
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|