1.概述

在本教程中,我们将讨论如何使用乳胶绘制图形。

我们首先通过上市,我们可以使用图形的主要LaTeX的包开始,并表达自己的独特优势。

然后,我们将研究这些软件包绘制图表的一些例子,以及它们的变化。

在本教程结束时,我们将能够在乳胶文档中实现图形。

2.在图表上短暂回顾

2.1。图表的组件及其代表

一个图形g(v,e)由一组V顶点和一套E边缘。边缘可以是直接的或间接的,通常连接两个顶点,不一定是不同的。为超图,边缘还可以连接两个以上的边缘,但我们不会在这里对待他们。

顶点的标准表示由圆圈的图像组成:

通过QuickLaTeX.com渲染

如果顶点有一个标签,它就会被输入到圆圈内,就像上面例子中的数字1一样。我们也可以将多个顶点以非重叠的方式放置在图像的任何地方:

通过QuickLaTeX.com渲染

的边缘对应于无向边的线或用于向边的箭头的标准表示:

通过QuickLaTeX.com渲染

2.2。图的典型代表

因此,表示图形的图像由在空场和连接它们的一组线或箭头上的一组圆圈.此外,如果图表是一个加权图,我们可以在边缘上用标签表示权重:

通过QuickLaTeX.com渲染

最后,如果图形有循环,我们可以将它们表示为连接顶点与自身的边:

通过QuickLaTeX.com渲染

这些是我们需要代表任何形式的元素复杂性.在下一节中,我们首先研究了相关的包绘制图表,然后看看在码图的执行情况的一些例子。

2.3。图的替代表示

不过,我们也应该声明图形表示并不是直观描述图形的唯一方法.其他陈述,特别是边列表邻接清单,或邻接矩阵,在实践中也普遍存在。

在某些情况下,他们可能会更翔实人类读者比图形的绘制图像。例如,向图26点的顶点V = \ {A,B,...,X,Y,Z \}只有两条边E = {(x, y), (x, z)\},用正式符号表示非常简单:

g(v,\ {(x,y),(x,z)\})

然而,它的完整的图形表示将占据巨大的空间,而且大多是无信息的。这是因为,如果我们使用的是图形具有比节点或边缘的屈指可数,它便成为挑战通过查看其图像了解它的结构.一些广泛的图表,如代表互联网节点的图,具有图形表示的是,虽然很漂亮但对人类来说却毫无意义。

为此原因,如果我们的图形包含的顶点或边多于几个,我们应该避免绘制它.相反,我们应该使用其他类型的形式表示,如邻接矩阵、边表或邻接表:

\ begin {matrix} \ framebox {a} \\ \ framebox {b} \\ \ vdots \\\ framebox {x} \ lightarrow \ fbox {y} \ fbox {z} \\ \ framebox {y} \\ \FrameBox {z} \\\结尾{matrix}

3. Tikz.

我们现在可以讨论我们可以用来绘制乳胶图形的包。最常用的乳胶包装用于绘图,一般来说,是TikZ,这是一层PGF.这简化了其语法。TIKZ是一个强大的包,附带了一个专用于特定任务的图书馆,例如:

而且,与我们的目的相关,它包含一个graphdrawing我们可以用来自动绘制图形的库。TikZ是我们用来绘制图表的标准包,我们将把它专门用于大多数编码示例。

3.1。基本图形和节点

TikZ中的图纸包括在tikzpicture.环境。我们可以绘制的最简单图表包括一个顶点,其中标签表示为包含例如变量的圆圈:

\ DocumentClass {Stical} \ usepackage {tikz} \ begin {document} \ begin {tikzpicture} [main / .style = {draw,circle}] \ node [main](1){$ x_1 $};\ {端tikzpicture} \ {端文档}

通过QuickLaTeX.com渲染

这个单词主要的这里指的是一种风格,我们介绍的时候定义tikzpicture.环境。在这种情况下,我们使用它来告诉编译器为节点绘制圆圈的形状。

在上面的是代码的最重要的命令\节点.它的语法如下:

\ node [参数](nodeid){nodelabel};

我们可以重复使用这个命令来添加更多的顶点到图中:

\节点[主要](2)[上述的右边= 1] {$ $ X_2};\节点[主要](3)[以下权= 1] {$ $ X_3};\节点[主要](4)[上述的右= 3] {$ $ X_4};\节点[主要](5)[上述的右= 4] {$ $ x_5};\节点[主要](6)[以下权利= 4] {$ $ x_6};

通过QuickLaTeX.com渲染

请注意,第二对方括号之间的术语如何允许我们在与其他节点相关联的位置定义节点的位置。我们可以使用关键字来完成此操作正确的以上以下,后跟一个空格,然后将关键字以及它们所指的节点的标签。如果我们稍后需要重新排列图片上的图表,这是特别有用的。事实上,通过使用与绝对坐标相反的相对位置,我们可以在周围移动一个锚点以移动所有其他节点。

3.2。增加边

我们还可以使用使用的边缘\画命令:

\绘制[参数](fromWhere)——(toWhere);

例如,如果我们想要绘制与节点(2)和(4)之间的无向边缘对应的行,我们可以写入:

\draw(2)——(4);

通过QuickLaTeX.com渲染

如果是,我们想为定向边缘添加箭头,我们可以给出参数- >到了\画命令:

\绘制[ - >](1) - (2);

通过QuickLaTeX.com渲染

3.3.距离和宽度

我们还可以注意到这些线路似乎太薄,并且难以区分指向和无向边缘。通过传递参数,我们可以使图形更可读厚的到了tikzpicture.环境,介绍:

\开始{tikzpicture} [厚,主/ .style = {绘制,圆}] ... \ {端} tikzpicture

通过QuickLaTeX.com渲染

如果顶点看起来彼此太接近,我们也可以指定参数节点的距离到了tikzpicture.环境来进一步传播它们:

\开始{tikzpicture} [节点距离= {15毫米},厚,主/ .style = {绘制,圆}] ... \ {端} tikzpicture

通过QuickLaTeX.com渲染

3.4。更具挑战性的边缘

我们可能还希望与某些节点连接,直接路径与其他边距或节点相交。假设我们尝试用直接路径连接节点(1)和(5):

通过QuickLaTeX.com渲染

它看起来并不好。取而代之的是,我们要在图形周围循环,由外及以上节点2,然后下降背对着图形。幸运的是,我们可以通过指定的参数做松动在声明直线的起始点之后。为了更好地明确我们想要的边的方向,我们还指定了角度出去其分别指示的角度外向和内向的边缘

\绘制(1)至[OUT = 135,IN = 90,松散度= 1.5](5);

通过QuickLaTeX.com渲染

3.5。循环

我们可以使用相同的技术绘制循环在图中,通过表示为松线的起始点和结束点相同的两倍节点:

\draw (1) to [out=180,in=270,松动=5](1);

通过QuickLaTeX.com渲染

3.6。绘制加权边缘

如果我们的图表是加权图,我们可以将加权边缘添加为幻像节点\画命令:

\绘制[ - >](6) - 节点[Midway,右边,倾斜,POS = 1] {+1}(4);

通过QuickLaTeX.com渲染

通过这个命令,我们在顶点(6)和顶点(4)之间添加一个看不见的节点,然后添加到边缘中点的右上角。标签{+1}表示图的权重。的参数倾斜的pos分别表示,我们希望权值与边正交,并沿边移动一定数量。我们可以根据图像的大小,通过反复试验确定正确的量。

3.7。完整的图

最后,我们可以重复上面的所有指令填充图形,并使用我们所需的所有边缘填充图形:

\ {的DocumentClass文章} \ {usepackage tikz} \ {开始文档} \ {开始} tikzpicture [节点距离= {15毫米},厚,主/ .style = {绘制,圆}] \节点[主要](1){$ X_1 $};\节点[主要](2)[上述的右边= 1] {$ $ X_2};\节点[主要](3)[以下权= 1] {$ $ X_3};\节点[主要](4)[上述的右= 3] {$ $ X_4};\节点[主要](5)[上述的右= 4] {$ $ x_5};\节点[主要](6)[以下权利= 4] {$ $ x_6};\绘制[ - >](1) - (2);\绘制[ - >](1) - (3);\绘制(1)至[OUT = 135,IN = 90,松散度= 1.5](5);\draw (1) to [out=180,in=270,松动=5](1); \draw (2) -- (4); \draw (3) -- (4); \draw (5) -- (4); \draw[->] (5) to [out=315, in=315, looseness=2.5] (3); \draw[->] (6) -- node[midway, above right, sloped, pos=1] {+1} (4); \end{tikzpicture} \end{document}

通过QuickLaTeX.com渲染

4. Neuralnetwork

另一个用于生成图的有用包是Neuralnetwork.这个包,顾名思义,对于绘制一个神经网络,特别是前馈神经网络

这个包简化了层的构造及其操作。它将单层的所有命令缩短为一行

其主要优势在于迅速描述一个只有几行代码的完整图形。相反,其主要缺点在于图形的个性特征的稀缺可定制性。

4.1.包的基础知识

在乳胶包Neuralnetwork,我们定义具有相同名称的环境中图:

\ begin {neuralnetwork} ... \结束{neuralnetwork}

这里面的环境,我们就可以使用添加图层\ inputlayer\ hiddenlayer, 和\ outputlayer命令分别是我们是否参考第一个,或者是神经网络的最后一层。语法类似于所有三个命令:

\ inputLayer [count = howManynode,bias = traworfalse,nodeclass = {classofnode}] {}

参数表示给定图层中的节点数。术语偏见表示是否是偏见因为该层应该作为一个单独的元素计算。在这种情况下,当链接建立时,这个偏差将不会连接到前一层。最后,节点的类由其中一个预定义类组成输入节点隐藏的节点,或输出节点,或者也可以是任何我们的自定义类的。

4.2.绘制神经网络

我们可以画一个简单的神经网络,它由三个特征组成,在输入层,一个隐含层有两个神经元和一个偏差项,在输出层只有一个神经元。这和。的结构很相似一种用于XOR分类的神经网络

\的DocumentClass {物品} \ usepackage {neuralnetwork} \开始{文档} \开始{neuralnetwork} \ inputlayer [计数= 3,偏压=假] {} \ hiddenlayer [计数= 2] {} \ outputlayer [计数= 1] {} \结束{neuralnetwork} \结束{document}

通过QuickLaTeX.com渲染

4.3。增加边和标签

我们也可以在每一层之间添加边,通过下面的每一层,我们想要连接它的前一层\ linklayers.命令:

...\inputlayer[count=3, bias=false]{} \linklayers \hiddenlayer[count=2]{} \linklayers \outputlayer[count=1]{}…

通过QuickLaTeX.com渲染

通知如何黄色节点,表示在中间层的偏差项,没有被连接到输入层。我们还可以添加标签的节点,虽然这是有点棘手。做到这一点的方式是通过定义新的LaTeX命令,将它作为一个参数文本到的层:

... \ newcommand {\ x} [2] {$ x_#2 $} \ inputlayer [count = 3,bias = false,text = \ x] ...

通过QuickLaTeX.com渲染

我们还可以通过创建适当的命令来遵循与隐藏图层和输出层的相同标准:

... \ newcommand {\ H} [2] {$ H_#2 $} \ newcommand {\ Y} [2] {$ Y_#2 $} ... \ hiddenlayer [计数= 2,文本= \ H]{} \ linklayers \ outputlayer [计数= 1,文本= \ Y] {} \ linklayers ...

通过QuickLaTeX.com渲染

隐藏层中的偏置项自动获取索引h_0,就像在文献中常见的那样,无需指定任何特别的说明。

4.4。权重

我们还可以通过使用如下一个如此如此的公式添加到边缘的重量。我们必须首先定义一个新命令,然后将其分配给默认文本以获取链接:

\ newcommand {\ W} [4] {$瓦特_ {#2,#4} $} \ {setdefaultlinklabel \ W}

通过QuickLaTeX.com渲染

这里,#1表示原点,#2原点的节点,#3和#4分别表示目的地的层和节点。请注意,虽然隐藏层的权重看起来正常,但是前一层中的一些权重丢失。

这是因为,它们会自动通过一些其他的权重重写,因此,我们看到的只是其中的一部分。解决这个问题的唯一方法是通过单独定义的所有链接,然后给他们适当的标签。我们可以利用这样做\关联命令,而不是\ linklayers.

... \ inputlayer [计数= 3,偏压=假,文本= \ X] {} \ hiddenlayer [计数= 2,文本= \ H] {} \链路[风格= {},labelpos =附近开始,从层= 0,从节点= 1,到图层= 1,到节点= 1] ...

通过QuickLaTeX.com渲染

参数labelpos是我们用于转移到原产地的节点的那个。在这种情况下,边缘假设标签。反过来,这避免了边缘标签之间的重叠。

4.5。完成触摸

然后,我们可以重复此操作有两个嵌套\ foreach.循环,它将让我们把所有标签放在正确的、可读的位置:

foreach \n in{1,…,3}{ \foreach \m in {1,2}{ \link[style={}, labelpos=near start, from layer=0, from node=\n, to layer=1, to node=\m] } }

通过QuickLaTeX.com渲染

网络现在完成。我们可以使用此完整代码将其复制它在Latex编辑器中:

\的DocumentClass {物品} \ usepackage {neuralnetwork} \开始{文档} \开始{neuralnetwork} \ newcommand {\ X} [2] {$ X_#2 $} \ newcommand {\ Y} [2] {$ Y_#2$} \ newcommand {\ H} [2] {$ H_#2 $} \ newcommand {\ W} [4] {$瓦特_ {#2,#4} $} \ setdefaultlinklabel {\ W} \ inputlayer [计数=3,偏压=假,文本= \ X] \ hiddenlayer [计数= 2,文本= \ H] \的foreach \ n的{1,...,3} {\的foreach \米在{1,2} {\链路[风格= {},labelpos =附近开始,从层= 0,从节点= \ n,用来层= 1,节点= \米]}} \ outputlayer [计数= 1,文本= \ Y] \ linklayers\ {端neuralnetwork} \ {端文档}

5.通过扩展转换为乳胶

还有另一个选项需要提到,它与LaTeX包本身没有太大关系,而是与在其他图形编辑器中创建的图形自动转换为LaTeX代码有关。如果我们习惯于用其他编程语言绘制图形,而且我们还在学习如何用LaTeX绘制图形,那么这就特别方便了。

事实上,有一些库或扩展可以将另一个编辑器的图形输出自动转换为LaTeX代码:

  • 在Python中,我们可以将与创建图表matplotlib谢谢乳胶,感谢图书馆tikzplotlib
  • 在MATLAB中,我们可以使用从脚本matlab2tikz执行类似的操作
  • 在Blender 2.4中,我们可以使用blend2tikz出口搅拌机曲线进入LaTeX的代码

六,结论

在本文中,我们研究了如何使用乳胶绘制图表。

2注释
最老的
最新
内联反馈
查看所有评论
新浪
新浪
11天前

哇,这是惊人的。非常感谢。

吉米·布鲁诺
吉米·布鲁诺
6天前

很有帮助。谢谢!

评论在本文上关闭!