用Manim实现Graf的数学动画——【DiGraph】的详细
这是表示有向图的类。在有向图中,边有方向,意味着边是从一个顶点指向另一个顶点的。
图【Graph】两层含义:
1.称为顶点的连接点图。
2. 绘制的值,通常显示为具有水平轴和垂直轴的线,如下所示:
接下来我们介绍一下DiGraph ,这是DiGraph函数的构造函数:
DiGraph(vertices, edges, labels=False, label_fill_color=ManimColor('#000000'),layout='spring', layout_scale=2, layout_config=None, vertex_type=<class
'manim.mobject.geometry.arc.Dot'>, vertex_config=None, vertex_mobjects=None,edge_type=<class 'manim.mobject.geometry.line.Line'>, partitions=None,
root_vertex=None, edge_config=None)[source]
DiGraph
是一个用于在 Manim 中创建有向图的数据结构。下面是对该函数及其参数的解释:
参数说明
-
vertices:
- 类型: 列表
- 描述: 有向图中的顶点(节点)集合。每个顶点可以是任意可哈希的对象,通常是字符串或数字。
-
edges:
- 类型: 列表
- 描述: 有向图中的边(连接)集合。每条边由一个元组表示,元组的两个元素分别是起点和终点。例如,
(1, 2)
表示从顶点 1 到顶点 2 的一条有向边。
-
labels:
- 类型: 布尔值
- 默认值:
False
- 描述: 是否为顶点添加标签。如果为
True
,则将在图中显示顶点的标签。
-
label_fill_color:
- 类型: ManimColor
- 默认值:
ManimColor('#000000')
- 描述: 顶点标签的填充颜色。
-
layout:
- 类型: 字符串
- 默认值:
'spring'
- 描述: 图形的布局算法。可以选择不同的布局方式,例如
'spring'
、'circular'
等。
-
layout_scale:
- 类型: 数字
- 默认值:
2
- 描述: 布局的缩放比例,用于调整图形的大小。
-
layout_config:
- 类型: 字典
- 描述: 与布局相关的额外配置参数,允许用户自定义布局的行为。
-
vertex_type:
- 类型: 类
- 默认值:
<class 'manim.mobject.geometry.arc.Dot'>
- 描述: 定义顶点的类型,可以使用自定义的 Manim 对象来替代默认的 Dot。
-
vertex_config:
- 类型: 字典
- 描述: 用于配置顶点的额外属性,如颜色、大小等。
-
vertex_mobjects:
- 类型: 列表
- 描述: 用户可以直接提供顶点的 Manim 对象,而不是让 DiGraph 创建它们。
-
edge_type:
- 类型: 类
- 默认值:
<class 'manim.mobject.geometry.line.Line'>
- 描述: 定义边的类型,可以使用自定义的 Manim 对象来替代默认的 Line。
-
partitions:
- 类型: 列表
- 描述: 用于定义图的分区(如果需要),可以将顶点分组。
-
root_root_vertex:
- 类型: 对象
- 描述: 指定根点,用于一些特定的布局或绘。
-
edge_config
- 类型: 字典
- 描述: 用于配置边的额外属性,如颜色、宽度等。
示例1:
from manim import *class MovingDiGraph(Scene):def construct(self):vertices = [1, 2, 3, 4,5]edges = [(1, 2), (2, 3), (3, 4), (1, 3), (1, 4),(5,4)]g = DiGraph(vertices, edges,label_fill_color="#ece6e2")self.add(NumberPlane(),g)self.play(g[1].animate.move_to([1, 1, 1]),g[2].animate.move_to([-1, 1, 2]),g[3].animate.move_to([1, -1, -1]),g[4].animate.move_to([-1, -1, 0]),g[5].animate.move_to([0, 3, 0]),)self.wait()
运行结果:https://download.csdn.net/download/qq_45449625/89587196https://download.csdn.net/download/qq_45449625/89587196
示例2:
from manim import *class CustomDiGraph(Scene):def construct(self):vertices = [i for i in range(5)]edges = [(0, 1),(1, 2),(2, 3),(3, 4),(4, 0)]edge_config = {(0,1):{"color": YELLOW ,"tip_config": {"tip_shape": ArrowTriangleTip , "tip_length": 0.1,}},(1,2):{"color": BLUE ,"tip_config": { "tip_length": 0.15,}},(2,3):{"color": PINK ,"tip_config": {"tip_shape": StealthTip , "tip_length": 0.25,}},(3, 4): { "color": RED,"tip_config": {"tip_length": 0.25, "tip_width": 0.25}},(4, 0): { "color": WHITE,"tip_config": {"tip_shape":ArrowSquareTip ,"tip_length": 0.25, "tip_width": 0.25}},}g = DiGraph(vertices,edges,labels=True,layout="circular",edge_config=edge_config,).scale(1.4)self.play(Create(g))self.wait()
运行结果:https://download.csdn.net/download/qq_45449625/89587231https://download.csdn.net/download/qq_45449625/89587231
示例3
from manim import *class UndirectedMovingDiGraph(Scene):def construct(self):vertices = [i for i in range(5)]edges = [(0, 1),(1, 2),(3, 2),(3, 4),]edge_config = {"stroke_width": 2,"tip_config": {"tip_length": 0, "tip_width": 0},(3, 4): {"color": RED},}g = DiGraph(vertices,edges,labels=True,layout="circular",edge_config=edge_config,).scale(1.4)self.play(Create(g))self.wait()self.play(g[1].animate.move_to([1, 1, 1]),g[2].animate.move_to([-1, 1, 2]),g[3].animate.move_to([-1.5, -1.5, -1]),g[4].animate.move_to([1, -2, -1]),)self.wait()
运行结果:https://download.csdn.net/download/qq_45449625/89588613https://download.csdn.net/download/qq_45449625/89588613
示例4:
from manim import *
import networkx as nx class CustomGraph01(Scene): def construct(self): # 创建一个空的有向图 graph = self._empty_networkx_graph() # 添加顶点 vertices = ["A", "B", "C", "D"] graph.add_nodes_from(vertices) # 添加边 edges = [("A", "B"), ("B", "C"), ("C", "D"), ("D", "A"), ("A", "C")] graph.add_edges_from(edges) # 使用 ManimGraph 创建图形 manim_graph = Graph( vertices, edges, vertex_type=Dot, edge_type=Line, vertex_config={"color": BLUE, "fill_opacity": 0.7}, edge_config={"stroke_width": 2, "color": RED}, layout="spring", layout_scale=2, labels=True ) # 将图形添加到场景中 self.play(Create(manim_graph)) self.wait(2) @staticmethod def _empty_networkx_graph(): """创建一个空的 NetworkX 图""" return nx.Graph()
运行结果:https://download.csdn.net/download/qq_45449625/89588667https://download.csdn.net/download/qq_45449625/89588667
参数解释:
vertices
:一个包含图中所有顶点(节点)的列表或集合。edges
:一个包含顶点之间连接的边的列表或集合。labels
:一个布尔值,指示是否为顶点显示标签。label_fill_color
:指定标签的填充颜色,默认值为ManimColor('#000000')
,即黑色。layout
:图形的布局算法,用于在视觉上排列顶点,默认使用 'spring' 布局,它是一种常用的图形布局方法,可以达到美观的效果。layout_scale
:布局的缩放因子,可以调整图形的整体大小。layout_config
:布局算法的附加配置选项。vertex_type
:指定用于图形中顶点的对象类型,默认为Dot
。vertex_config
:顶点表示的附加配置选项。vertex_mobjects
:如果需要自定义顶点图形对象,可以在这里列出这些对象。edge_type
:指定用于图形中边的对象类型,默认为Line
。partitions
:如果图形要进行视觉上的分区(例如,聚类顶点),这个参数将定义这些分区。root_vertex
:可能用于指定某个起始点或根顶点,以便于某些图算法(如树遍历)。edge_config
:边的表示的附加配置选项。
总结
DiGraph
函数提供了一种灵活的方式来创建和可视化有向图,用户可以通过各种参数自定义图的外观和布局,以满足不同的需求。