- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
有向图和上一篇介绍的无向图基本一样,唯一的区别在于有向图的边有方向性,它表示的是顶点之间的单向或依赖关系.
有向图G一般表示为:G=<V,E>。和无向图一样,V是顶点集合,E是边的集合.
不同之处在于,无向图是用小括号(V,E),有向图用尖括号<V,E>.
在有向图中,边是有方向的,所以,从顶点A到顶点B的边与从顶点B到顶点A的边是不同的.
与无向图一样,有向图也有很多应用场景,比如:
在地图导航中,有向图常被用来表示道路网络.
节点代表地点(如交叉路口、城市等),有向边代表道路,边的权重可以表示道路的长度、行驶时间或交通状况等.
在供应链管理中,有向图可以用来表示货物的流动路径.
节点代表供应链中的各个环节(如供应商、制造商、分销商等),边代表货物流动的路径,边的容量可以表示货物的承载能力.
在社会网络中,上一篇提到可以用无向图表示用户之间的好友关系.
而有向图同样可以用在社会网络分析,它可以用来表示用户之间的关注关系,转发关系等,用于分析用户的行为模式.
下面介绍manim中绘制有向图的对象DiGraph.
有向图对象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 |
这些参数中,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来生成层状和树状的有向图.
有向图DiGraph的方法主要用来动态改变有向图,比如添加或删除顶点和边.
名称 | 说明 |
---|---|
add_edges | 增加有向图的边 |
add_vertices | 增加有向图的顶点 |
remove_edges | 删除有向图的边 |
remove_vertices | 删除有向图的顶点 |
change_layout | 动态改表有向图的结构 |
from_networkx | 从networkx 来生成有向图 |
networkx是另一个常用的Python库,用于创建、操作和研究复杂网络的结构.
DiGraph对象也可以直接根据networkx的对象生成图.
下面的示例和上一篇无向图的示例类似,只是改用有向图DiGraph对象来实现.
顶点的设置和无向图几乎是一样的.
# 不同颜色的设置
graph = DiGraph(
vertex_config={
0: {"color": RED},
# ...
},
)
# 顶点显示标签
graph = DiGraph(
labels=True,
)
# 星形顶点
graph = DiGraph(
vertex_config={"outer_radius": 0.15},
vertex_type=Star,
)
有向图的边也和顶点一样,可以设置颜色,粗细等属性, 。
与无向图不同之处在于:有向图的边可以设置箭头的样式.
# 边的颜色
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,
},
},
# ...
},
)
有向图中内置的layout和上一篇无向图中介绍的是一样的.
for layout in [
"spring",
"circular",
"kamada_kawai",
"planar",
"random",
"shell",
"spectral",
"spiral",
]:
graph = DiGraph(
layout=layout,
)
层状图的布局需要配合参数partitions一起使用,partitions中决定每一层中有哪些顶点.
有向图的边有方向,绘制出来更像神经网络的结构.
partitions = [[0, 1], [2, 3, 4], [5, 6], [7, 8]]
graph = DiGraph(
layout="partite",
partitions=partitions,
)
树状图的布局需要配合参数root_vertex一起使用,root_vertex定义了树的根顶点是哪个.
这里与无向图有个不同的地方,绘制有向的树状图时,顶点和边的顺序很重要,需要从根节点开始,依次传入各个顶点.
下面示例中,第二个树状图改变了 根节点,不是仅仅改变root_vertex就行的,需要先改变图中顶点的顺序.
下面的代码是简略后的代码,完整的代码可以文中最后部分的链接中下载.
# 初始的树
graph = DiGraph(
layout="tree",
root_vertex=0,
)
# 重要!!!
# 修改前需要调整节点和边的顺序
# 修改根节点
graph2 = DiGraph(
layout="tree",
root_vertex=2,
)
文中完整的代码放在网盘中了(digraph.py), 。
下载地址: 完整代码 (访问密码: 6872) 。
最后此篇关于manim边做边学--有向图的文章就讲到这里了,如果你想了解更多关于manim边做边学--有向图的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我发现当文本超过 20 行时,此动画需要花费大量时间来渲染。我可以做些什么来加快速度吗? import itertools as it class FormulaExample(Scene): d
请您向我解释一下什么是 VGroup 以及它有什么用处?我试图寻找它,但显然无济于事,没有太多的文档。提前致谢。 最佳答案 基本上是一组VMobjects .所以说你有一些方程由多个单独的 Texmo
你能画对角线/箭头/任何看起来像你在manim数学方程中抵消的东西吗? 最佳答案 最接近的定义是 Cross ,但这并不完全是您要找的,我喜欢用这个: class Cancel(VGroup):
希望你们一切都好! 我想知道如何在 manim 中缩小文本。 我知道你可以做 text.scale(0.8),但我想知道使用后如何做。 例如, text.scale(0.8) self.play(Wr
希望你们一切都好! 我想知道如何在 manim 中缩小文本。 我知道你可以做 text.scale(0.8),但我想知道使用后如何做。 例如, text.scale(0.8) self.play(Wr
ORIGIN 中有一个正方形位置,我想将它移动到 UP*3 并使用以下代码片段同时缩放到 0.5: sq = Square() self.add(sq) self.play(ApplyMethod(s
我在 Manim Community v0.16.0.post0 中有以下文本: dioscuri = Text("DIOSCURI", weight=BOLD, font="Arial", colo
有什么办法可以增加动画中特定线条的宽度? 我试图改变DEFAULT_STROKE_WIDTH在 constants.py并设置 stroke_width在 CONFIG等于某个数字,但它不起作用。 这
txt11 = TexMobject(r"-7", color=BLACK) txt12 = TexMobject(r"\frac{1}{7}", color=BLACK).next_to(txt11
txt11 = TexMobject(r"-7", color=BLACK) txt12 = TexMobject(r"\frac{1}{7}", color=BLACK).next_to(txt11
我想用不同颜色绘制 MathTex 元素的变量,但 Manim 似乎对复杂的 Latex 表达式有问题。 这是我的场景。 from manim import * config.frame_width
this is the thing I wanted to make 我是 manim 的新手,我正在尝试将文本放在一个矩形内,如图中所示我怎样才能做到这一点 ?? :( 最佳答案 您可以使用 VGr
我主要尝试运行两个动画(引用以下代码): class RelTrain(Scene): def construct(self): train = Rectangle(heigh
无论如何,我正在尝试(这实际上是我的第一个 manim 程序)。 from manim import * import copy import numpy as np import random co
我开始学习 manim,希望你能帮助我理解这段代码是如何工作的 class Line_1(Scene): def construct(self): path = Line(LE
我是马尼姆新手。 与下面的示例一样, class scene_example(Scene): def construct(self): txt1 = Text("Text1")
我是马尼姆新手。 与下面的示例一样, class scene_example(Scene): def construct(self): txt1 = Text("Text1")
最初的问题发布在 Reddit (https://www.reddit.com/r/manim/comments/lw3xs7/is_it_possible_to_run_manim_programm
有没有办法使用 manim 显示 latex 表并为其设置动画? 例如 \begin{table}[] \centering \begin{tabular}{lllll} & & \multico
如果我有 3 行 manim 文本, l = TextMobject("Line 1") l2 = TextMobject("Line 2") l3 = TextMobject("Line 3")
我是一名优秀的程序员,十分优秀!