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

manim边学边做--无向图

时间:2024-10-10 11:43:32浏览次数:7  
标签:layout -- Graph vertex 无向 顶点 root 边学边

无向图属于数学中的图论这一学科,

所谓无向图G,就是由顶点集V(非空集合)和边集E(由V中元素构成的无序二元组的集合)组成的图,

可表示为G=(V,E)

无向图中,边没有方向,即从顶点A到顶点B的边与从顶点B到顶点A的边是相同的。

无向图简洁直观,常用于描述社交网络,交通网络以及电子电路等等。

社交网络中,用户可以被视为顶点,而用户之间的关系则可以被视为边。

因为好友关系通常是双向的,没有明确的方向性,非常适合用无向图来表示。

城市交通规划中,可以将各个路口或交通节点视为顶点,而将路口之间的道路或交通线路视为边。

因为道路通常是双向通行的,所以也适合用无向图来表示。

电子电路设计中,可以将各个电子元件(如电阻、电容、电感等)视为顶点,而将元件之间的连接关系(如导线连接)视为边。

无向图可以表示这种电路结构,因为电路中的电流和信号通常是双向传输的。

下面介绍manim中绘制无向图的对象Graph

1. 主要参数

无向图对象Graph主要参数有:

参数名称 类型 说明
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. 主要方法

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

标签:layout,--,Graph,vertex,无向,顶点,root,边学边
From: https://www.cnblogs.com/wang_yb/p/18456015

相关文章

  • VScode远程访问虚拟机
    下载vscode插件RemoteDevelopment该插件包括了wsl,remotessh等四个插件,均是用于远程访问虚拟机。 通过ssh访问虚拟机下载后在工具栏索引可以看到如下标识,按顺序点击进入,然后在“3”显示的搜索框通过“sshusername@ipAddr”访问,这是方法一。 方法二,还可以通过选择“2......
  • 用Tessent工具给网表插入扫描链
    有时候我们现有的网表没有带scancell,但我们又想将其变成一个可扫描的网表,就可以用Tessent工具帮助我们实现。 插入扫描链的过程,一般是将电路的时序非扫描单元(如DFF)替换成时序扫描单元(如SDFF),同时添加一些必要的输入输出端口,再将这些时序扫描单元和输入输出端口连接起来,形成了扫......
  • OCR+PDF解析配套前端工具开源详解!
    面对日常生活和工作中常见的OCR识别、PDF解析、翻译、校对等场景,配套的可视化工具能够极大地提升我们的使用体验和工作效率。通过可视化界面,我们可以直观地看到文本识别、解析和翻译的结果,便捷评估产品效果。今天来跟大家分享一个非常棒的开源项目——TextInParseX-Frontend,帮......
  • 通用线程池1
    1publicclassCommonThreadPool{2privatestaticfinalCommonThreadPoolpool=newCommonThreadPool();3privateThreadPoolExecutorexecutor;4privateCommonThreadPool(){5intcorePoolSize=4;6intmaximumPoolSize......
  • 荣耀 10.8 开发笔试 笔经
    我好像是卷1第一题:完善字符串输入字符串(子串数、子串,形如2abc123456789),子串未满8个则填充0使其总长度达到8个字符,超过8个则分割核心部分:for(Stringpart:parts){//处理每8个字符for(inti=0;i<part.length();i+=8){Stringchunk=part.subs......
  • py脚本一:业务中excel报表处理
    excel报表处理根据业务需求,每月都要对报表处理一次,手动太麻烦,还容易出错,用py脚本,实现对应处理,能更快;个人需求可能并不符合所有要求涉及python模块pandas、numpy、re代码:importpandasaspdimportnumpyasnpimportreimportosdeflist_columns(df):print("......
  • [Python手撕]第 k 个缺失的正整数
    给你一个严格升序排列的正整数数组arr和一个整数k。请你找到这个数组里第k个缺失的正整数。示例1:输入:arr=[2,3,4,7,11],k=5输出:9解释:缺失的正整数包括[1,5,6,8,9,10,12,13,...]。第5个缺失的正整数为9。示例2:输入:arr=[1,2,3,4],k=2输出:6解释:缺......
  • 20222317 2024-2025-1《网络与系统攻防技术》实验一实验报告
    一、实验内容本次实验的对象是一个名为pwn1的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们本次实验将学习两种方法运行这......
  • 【精品毕设推荐】基于微信小程序的电影订票系统设计与实现
    点击下载原文及代码,可辅助在本地配置运行......
  • 时间同步PPS+GPRMC
    介绍一下pps结合rmc报文的时间同步方案 定义:PPS全称为每秒脉冲,即1脉冲/1秒。它是一个低功率的脉冲电平信号,通常用于提供精确的时钟同步信号。特征:PPS信号的脉冲宽度通常在20ms至200ms之间,也有说法为200ms至300ms,采用上升沿为准时点,上升时间非常短,一般在纳秒级别。PPS信号提供......