一般绘图

GraphPlotGraphPlot3D 计算以美观的二维/三维布局绘制图. 该函数的设计原理使其可用于非常大规模的图,并且处理连通和非连通图.
GraphPlot[{vi1->vj1,vi2->vj2,}]
生成图的一个图线,其中顶点 vik 与顶点 vjk 相连接
GraphPlot[{{vi1->vj1,lbl1},}]
把标签 lblk 与图中的边相联系
GraphPlot[m]
生成由邻接矩阵 m 表示的图的一个图线
GraphPlot3D[{vi1->vj1,vi2->vj2,}]
生成图的一个三维图线,其中顶点 vik 与顶点 vjk 相连接
GraphPlot3D[{{vi1->vj1,lbl1},}]
把标签 lblk 与图中的边相联系
GraphPlot3D[m]
生成由邻接矩阵 m 表示的图的一个三维图线
绘图函数.
绘制由规则列表指定的图:
对于非连通图,以视觉美观的方式对每个分量进行布局,并且组合在一起.    
以下是从一个结构工程应用中得到的稀疏邻接矩阵定义的较大规模的图. 该矩阵来自 HarwellBoeing Collection
GraphPlot 可能由于浮点的不同,在不同平台上产生略微不同的输出.
GraphPlot 和 GraphPlot3D 的选项
GraphPlotGraphPlot3D 接受以下选项;另外,也接受 GraphicsGraphics3D 的选项.
选项名
默认值
DirectedEdgesFalse
是否把边显示为有向箭头
EdgeLabelingAutomatic
是否包括对于边给出的标签
EdgeRenderingFunctionAutomatic
对于边给出明确图形的函数
MethodAutomatic
用于对图进行布局的方法
MultiedgeStyleAutomatic
如何在顶点之间画出重边
PlotRangePaddingAutomatic
在图线周围使用多少空白填充
"PackingLayout"Automatic
用于排列分量的方法
PlotStyleAutomatic
绘制对象的样式
SelfLoopStyleAutomatic
如何画出连接顶点和本身的边
VertexCoordinateRulesAutomatic
明确的顶点坐标的规则
VertexLabelingAutomatic
是否把顶点名称显示为标签
VertexRenderingFunctionAutomatic
对顶点给出明确图形的函数
GraphPlotGraphPlot3D 的选项.

DirectedEdges

选项 DirectedEdges 指明是否把边画为箭头. 该选项的可能值为 True 或者 False. 该选项的默认值为 False.
下面的图的边由箭头表示:

EdgeLabeling

选项 EdgeLabeling 指明是否并且如何显示给定边的标签. 可能的选项值为 AllNone 或者 Automatic. 该选项的默认值为 True,显示图上给定的边标签.
默认情况下,GraphPlot 显示所提供的顶点3和顶点6之间的边标签:
另外,使用 Tooltip[vi->vj,lbl] 可以为边指定一个工具提示条. 把光标放在顶点3和顶点6之间的边上,以及在顶点3和顶点5之间的边的边标签上,可以看到工具提示条:

EdgeRenderingFunction

选项 EdgeRenderingFunction 指定了图的边的图形表示. 该选项的可能值为 AutomaticNone 或是一个给出图形基元和指令的合理组合的函数. 在 Automatic 的默认设置下,对于每条边都使用一条线绘制. 若使用EdgeRenderingFunction->None,则不绘制边.
这里只绘制顶点:
设置 EdgeRenderingFunction->g 时,每条边使用图形基元和指令绘制,由具有三个或多个自变量的函数 g 给出,形式为 g[{ri,,rj},{vi,vj},lblij,],其中 rirj 是边的起点和终点的坐标,vivj 是起点和终点,而lblij 是为边指定的任意标签或者 None. EdgeShapeFunction->g 的明确设置重载了对于 EdgeLabelsDirectedEdges 的设置.
这里把边画为灰色箭头,其端点与顶点相距 0.1 的距离(在图中的坐标系统中):
这会使箭头更大:
这里生成边标签:
用红色绘制多重边和自环:
这里使用球体绘制顶点,使用圆柱体绘制边,画出一个三维图:
这里使用弹簧绘制边、使用球体绘制顶点,画出一个图:
这里画出苯分子的图形:
沿着边画出文本:
在每条边上绘制图形:

GraphLayout

GraphPlotGraphPlot3D 中使用的算法可以使用 GraphLayout 选项指定,或者是 GraphLayout->"name" 或者是 GraphLayout->{"name",opt1->val1,},其中 opti-> vali 是专用方法选项,在别的章节中有具体描述. GraphLayout->Automatic 对树使用 "RadialDrawing" 方法,而其它情况使用 "SpringElectricalEmbedding".
Automatic
自动选择适用于该问题的方法
"CircularEmbedding"
在一个环形上对顶点进行布局
"HighDimensionalEmbedding"
调用高维嵌入方法,其中该图首先基于顶点到 k 个中心的图距离在高维空间展进行布局;接着,该布局使用主成分分析法的高维坐标的线性组合投影到二维或者三维空间
"RadialDrawing"
调用径向嵌入方法,它最适合于树形图或者类似树形的图;如果该图不是一个树,首先构建一个生成树,并且使用生成树的径向绘制方法来导出图的绘制方法
"RandomEmbedding"
对顶点进行随机布局
"SpiralEmbedding"
以螺旋形对顶点进行布局;在三维空间中,这在一个球体上均匀分布顶点
"SpringElectricalEmbedding"
调用弹簧电嵌入方法,其中相邻的顶点受到与它们物理距离成正比的弹簧吸引力,而所有的顶点受到与它们的距离成反比的排斥电力;最小化总能量
"SpringEmbedding"
调用弹簧嵌入方法,其中一个顶点受到来自另一个顶点的吸引力或者排斥力,就像它们是使用弹簧连接一样;弹簧具有等于顶点间的图距离的理想长度;最小化弹簧的总能量
GraphLayout 选项的有效值.
这里使用默认方法绘制 Petersen 图:
这里使用 "SpringEmbedding" 算法绘制图:
这里使用 "HighDimensionalEmbedding" 算法绘制图:
这里使用 "CircularEmbedding" 方法绘制含有30个顶点的完全图:
这里使用三维中的 "SpiralEmbedding" 方法绘制含有30个顶点的完全图:
这里使用 "RandomEmbedding" 方法绘制完全图:

MultiedgeStyle

选项 MultiedgeStyle 指明是否绘制两个顶点之间的重边. MultiedgeStyle 的可能值为 Automatic(默认)、TrueFalse 或者一个正实数. 在默认设置 MultiedgeStyle->Automatic 下,图中显示由规则列表指定的重边,但是如果这个图由邻接矩阵指定,则不显示. 在 MultiedgeStyle->δ 下,重边以尺度缩放距离 δ 展开.
默认情况下,如果一个图是由规则列表给出的,则显示重边:
但是若是由邻接矩阵指定的,则不显示重边:
这里使用指定的量展开重边:

PackingLayout

选项 "PackingLayout" 指定非连通分量的排列方法. 该选项的可能值为 Automatic(默认)、"ClosestPacking""ClosestPackingCenter""Layered""LayeredLeft""LayeredTop""NestedGrid". 在设置 "PackingLayout"->"ClosestPacking" 的情况下,使用四角方法 [6]排列分量使其尽可能接近,分量的排列从左上角开始. 在设置 "PackingLayout"->"ClosestPackingCenter" 的情况下,分量排列从中心开始. 在设置 "PackingLayout"->"Layered" 的情况下,分量排列从左上角的层开始. 在设置 "PackingLayout"->"LayeredLeft" 或者 "PackingLayout"->"LayeredTop", 的情况下,分量排列从上/左的层分别开始. 在 "PackingLayout"->"NestedGrid" 的情况下,分量以一个嵌套网格的形式排列. 典型的有效设置为 "PackingLayout"->"Layered",并且从最大边界框区域的分量开始进行排列.
这里使用默认方法显示非连通分量的排列:
这里使用 "ClosestPackingCenter" 方法显示非连通分量的排列:
用户可以使用 "PackingLayout" 的子选项调整排列方式. 子选项 "Padding" 指定分量之间所允许的空间量;可能值为 Automatic (默认)或者一个非负数. 子选项 "PaddingFunction",重载 "Padding",也指定了分量之间所允许的空间量. 它采用形如 {{w1, h1},} 的列表,它们是分量的边界框的宽度和高度,并且返回一个非负数. 选项 "PackingLayout"->"ClosestPacking""PackingLayout"->"ClosestPackingCenter" 也接受"PolyominoNumber" 子选项,它指定用来近似每个非连通分量的位四角(polyominos)的平均数. "PolyominoNumber" 子选项的可能值为 Automatic (默认情况下,通常设置 "PolyominoNumber" 为 100)或者一个正整数. 一个较小的 "PolyominoNumber" 通常具有这样的效果:不允许较小的分量嵌入较大的分量之间.
这指定了分量之间的位四角(polyominos)空间:
这里指定了用于近似每个分量的5个位四角(polyominos)的平均值:

PlotRangePadding

PlotRangePadding 是由 GraphPlotGraphPlot3D 继承的图形函数的通用选项.

PlotStyle

PlotStyle 是由 GraphPlotGraphPlot3D 继承的图形函数的通用选项. 选项 PlotStyle 指明了绘制对象所采用的样式.
使用较粗的线绘制边,边和顶点的标签都采用红色:

SelfLoopStyle

选项 SelfLoopStyle 指定是否并且如何绘制与自身连接的回路. 该选项的可能值为 Automatic(默认)、TrueFalse 或者正实数. 在设置 SelfLoopStyle->Automatic 的情况下,如果图由规则列表指定,则显示回路,若是由邻接矩阵指定,则不显示. 在设置 SelfLoopStyle->δ 的情况下,回路使用直径 δ 绘制(相对于平均边长).
默认情况下,对由规则列表指定的图,显示回路:
如果图由邻接矩阵指定,则不显示回路:
这里显示回路,直径与边的平均长度一样大:

VertexCoordinates

选项 VertexCoordinates 指明顶点坐标. 可能值为 None、坐标列表,或者是指定所选或全部顶点坐标的一个规则列表.
这里使用已知的坐标绘制 Petersen 图:
这里使用 "SpringEmbedding" 算法计算相同的图的顶点坐标:
这里指定两个顶点的坐标:
这里仅指定 坐标:
这里固定 坐标绘制二分图. 并且添加锚("Anchors")来连接非连通分量:
当二分图被连接后,即使没有使用锚扩展,它的工作性能也是更好的:

VertexLabels

选项 VertexLabeling 指定是否把顶点名称显示为标签. 该选项的可能值为 AllNoneAutomatic(默认). VertexLabels->All 显示标签. 对于由邻接矩阵指定的图,顶点标签采用连续整数 ,其中 是矩阵的大小. 对于由规则列表指定的图,标签是规则中使用的表达式. VertexLabels->None 把每个顶点显示为点. 用户也可以在规则列表的任意位置上使用 Tooltip[vk,vlbl],来为顶点 vk 指定另外可选的工具提示条.
这里绘制图,并且标签作为邻接矩阵的索引给出:
这里使用在规则列表中指定的标签:
这里对顶点3和5指定其它可选的标签. 把光标放置在顶点上可以看到标签:

VertexRenderingFunction

选项 VertexRenderingFunction 指定图的边的图形表示. 该选项的可能值为 AutomaticNone 或者是一个给出图形基元和指令的适当组合的函数. 在默认设置 Automatic 的情况下,顶点显示为点,而它们的名称在工具提示条中给出.
默认情况下,顶点作为点显示:
这里不画出任何顶点:
在设置 VertexShapeFunction->g 下,每个顶点使用由 g[ri,vi,] 给出的图形基元绘制,其中 ri 是顶点坐标,而 vi 是顶点标签. VertexShapeFunction->g 的明确设置重载了 VertexLabels 的设置.
这里把顶点显示为黄色的圆盘:
这里使用预定义图形绘制顶点:
所有方法的通用子选项
所有绘图方法都接受方法子选项 "Rotation",它指明了从默认方向在半径上的正顺时针旋转的期望值. 该选项采用任意数值值、或者 False. 默认为 0.
对于 GraphPlotGraphPlot3D,默认方法由找到主轴的对齐步骤导出,并且使用 坐标对齐来绘图. 然而,如果指明 "Rotation"->False,该步骤就被跳过.
选项名
默认值
"Rotation"0
绘图中所应用的顺时针旋转次数
所有方法的通用子选项.
这里顺时钟对图形旋转
这里显示图布局过程的演化:
"SpringEmbedding" 和 "SpringElectricalEmbedding" 方法的通用子选项
SpringEmbeddingSpringElectricalEmbedding 方法都属于所谓的力导向(force-directed)方法一类. 这些方法的工作方式如下:在每个顶点上计算力,并且沿着力迭代移动顶点以最小化总的系统能量. 参见 [8] 以获取算法的详细信息. 这两种方法具有以下共同选项.
选项名
默认值
"EnergyControl"Automatic
在最小化过程中如何控制能量函数
"InferentialDistance"Automatic
临界距离;超过该距离时,力的计算忽略远处的顶点
MaxIterationsAutomatic
在最小化能量过程中使用的最大迭代次数
"RandomSeed"Automatic
对于顶点初始放置,在随机生成器中使用的种子
"RecursionMethod"Automatic
是否采用多层算法来对图进行布局
"StepControl"Automatic
在能量最小化过程中如何修正步长
"StepLength"Automatic
在移动顶点时使用的初始步长
"Tolerance"Automatic
终止能量最小化过程所使用的容差
"SpringEmbedding""SpringElectricalEmbedding" 方法的通用子选项.

"EnergyControl"

子选项 "EnergyControl" 指定在最小化过程中系统总能量的限制. 可能值为 Automatic(默认)、"Monotonic" 或者 "NonMonotonic". 当值为 "Monotonic" 时,仅当能量被降低的时候,沿着这个力的步进才被接受. 当值为 "NonMonotonic" 时,即使能量没有被降低,沿着该力的步进仍然被接受.

"InferentialDistance"

子选项 "InferentialDistance" 指定了一个临界距离,超过该距离时,可以假设顶点之间的交互作用不存在. 可能值为 Automatic(默认)或者正的数值值. 对于 "SpringEmbedding" 方法,如果顶点 i 和顶点 j 之间的图距离大于 "InferentialDistance" 的选项值,在 ij 之间的弹簧排斥和吸引力被忽略. 对于 "SpringElectricalEmbedding" 方法,如果顶点 i 和顶点 j 之间的欧式距离大于 "InferentialDistance" 的选项值,在 ij 之间的排斥力被忽略.
这里使用 "SpringElectricalEmbedding" 方法绘制一个随机树:
使用较小(更负)的 "RepulsiveForcePower" 选项值(参见下一节),这个图现在占用更多空间:
使用小的 "InferentialDistance" 选项值可以达到类似的效果:

MaxIterations

选项 MaxIterations 指定在最小化能量的过程中使用的最大迭代次数. 可能值为 Automatic(默认)或者一个正整数.

"RandomSeed"

选项 "RandomSeed" 指定了计算初始顶点放置的随机数字生成器的一个种子. 改变该选项通常影响图的绘制方向,但是它也可以改变布局. 可能值为 Automatic 或者一个整数.
这里显示在绘制 Petersen 图中不同随机种子值产生的效果:

"RecursionMethod"

选项 "RecursionMethod" 指定图的布局是否使用迭代过程产生. 可能值为 Automatic(默认)、"Multilevel" 或者 None. 在 "Multilevel" 算法中,该图连续粗化为具有越来越小顶点数的图. 较粗糙的图形首先被展开布局,然后这些布局图插入较精细的图,然后进一步完善.
选项名
默认值
"Randomization"Automatic
是否以随机顺序检查顶点
"MinSize"Automatic
经过粗化的图中的最小顶点数
"CoarseningScheme"Automatic
图如何被粗化
"Multilevel" 的子选项.
对于选项 "Randomize",可能值为 AutomaticTrueFalse. 对于 "MinSize",可能值为 Automatic 或者一个正数. 对于 "CoarseningScheme",所实现的算法或者基于最大独立顶点集,这也形成了粗顶点,或者基于最大独立边集,也称为匹配. 在一个匹配中,形成一条边的两个顶点合并形成一个粗顶点. 下面是 "CoarseningScheme" 的可能值.
"MaximalIndependentVertexSet"
如果顶点的图距离为3或者更小的数,在最大独立集合中连接顶点
"MaximalIndependentVertexSetInjection"
如果顶点之间的图距离为1或者2的时候,在最大独立集合中连接顶点
"MaximalIndependentVertexSetRugeStuben"
生成最大独立顶点集,把优先级给更多相邻顶点不在这个集合中的顶点,并且如果顶点间的图距离为3或者更小的话,连接顶点
"MaximalIndependentVertexSetRugeStubenInjection"
如果顶点的图距离为1或者2的时候,连接顶点,并且把优先级给具有更多相邻顶点的顶点
"MaximalIndependentEdgeSet"
当匹配时以自然顺序考虑边
"MaximalIndependentEdgeSetHeavyEdge"
当匹配时,把优先级给具有较高边权值的边(即,代表原图中较大边数的边)
"MaximalIndependentEdgeSetSmallestVertexWeight"
把优先级给具有最小顶点权重的邻点的顶点匹配

"StepControl"

选项 "StepControl" 定义在能量最小化过程中如何修正步长. 它可以是 Automatic(默认)、"Monotonic" (其中步长只能减少)、"NonMonotonic"(其中步长可以变大或者变小)、或者 "StrictlyMonotonic"(其中步长在迭代过程中严格减小).

"StepLength"

选项 "StepLength" 给出在移动顶点时所使用的初始步长. 可能值为 Automatic(默认)或者正实数.

Tolerance

选项 Tolerance 指明在终止能量最小化过程中所使用的容差. 如果每个顶点坐标的平均改变量小于该容差,能量最小化过程就被终止,而当前坐标作为输出给出. 可能值为 Automatic 或者一个正实数.
"SpringElectricalEmbedding" 方法的子选项
选项名
"Octree"Automatic
在排斥力的计算时,是否使用八叉树数据结构(三维)或者四叉树数据结构(二维)
"RepulsiveForcePower "-1
排斥力随着距离的衰变速度有多快
"SpringElectricalEmbedding" 的方法选项.

"Octree"

"Octree" 选项指明是否在排斥力的计算中,使用八叉树数据结构(三维)或者四叉树数据结构(二维). 可能值为Automatic(默认)、True 或者 False. 对于八叉树/四叉树数据结构的使用通过对长范围的排斥力的逼近,最小化了计算复杂度. 但是,它也引入了力的计算近似. 因此,在一些情况中,结果可能不会很好.

"RepulsiveForcePower"

可能值为负实数,-1 为默认值. 在弹簧电嵌入(spring-electrical embedding)中,两个顶点 之间的排斥力默认为 . 如果 RepulsiveForcePower 的值为 (其中 ),那么排斥力被定义为 ,其中 是顶点之间的距离,而 是常量系数.
一个在长距离内的强的长范围排斥力通常具有边界效应,即在边缘上的顶点比中心处的顶点彼此更接近. 而指明较弱的长范围排斥力有时候可以减弱这种效果. 该选项对于绘制占用更多空间的图也是有益的. (参见"InferentialDistance" 方法选项以获取更多的详细信息.)
在排斥力的 power 为 的情况下,边界顶点之间比起默认值 的情况下,彼此没有更接近:
高级专题

绘制一个图,以其能够占用更多空间

虽然 GraphPlot 的默认设置一般说来适用于具有广泛顶点度范围的图,我们经常也需要使用帮助顶点占用更少空间的设置.
通常情况下,默认方法性能良好:
但是,有时候 "SpringEmbedding" 产生一个占用更多空间的绘图法:
使用小于默认值 -1 的排斥力,可以达到类似的效果,因此排斥力随着距离变大,衰变得更快:
此外,指定了一个临界距离:
对于这样的树状图,绘制树的算法可能是更可取的. 参见 "树形图" 以更好地控制树的布局:
这里从电网模型绘制一个图:

改进对非常大规模的图的绘制性能

虽然通常默认选项设置能够保证很好的性能,但往往有可能通过对特定任务选择具体的选项组合,来进一步提高绘图速度和减少内存使用量. 举例来说,可以使用更小的迭代次数、更小的推断距离(inferential distance)、或者更低的容差来提高速度和/或内存使用量. 这些设置很容易就降低了绘图质量,但是仍然常常为用户提供一个可以接受的折衷方法.
这里使用默认选项设置画图:
基于最大独立顶点集的粗略方案通常速度更快,使用更少的内存,但是却提供了一个可以比拟的布局质量:
通过把迭代次数降低为 30,用户可以更快地获得结果:
把推论距离(inferential distance)设置为 2,迭代次数设置为40,也比使用默认设置更快:
通过进一步把迭代次数降低为 20,用户可以以快得多的速度获得结果:
前面的选项组合也仍然更快:
"HighDimensionalEmbedding" 往往是最快的方法,但是绘图质量常常会受到影响:
相比之下,"SpringEmbedding" 是最慢的方法,但是它也是唯一使用正交线绘制网格的方法:
示例

大肠杆菌转录网络(E. coli Transcription Networks)

在控制细胞中基因表达的一个转录调控网络的图表示中,节点(顶点)为操纵子,这是在同样的信使核糖核酸(mRNA)中结合转录的一个或多个基因. 图的边从对一种转录因子进行编码的操纵子指向直接调节 [1] 的操纵子.

数据

这是按规则描述的网络 [2].

绘制网络

该网络由许多分量组成. 把鼠标移到顶点上可以查看标签:
使用不同的组件包装方式:
这里展开顶点:
这是另一种展开顶点的的方式:

蛋白质:一种氧化还原酶

这里使用从 [4] 得到的数据绘制一种氧化还原酶蛋白质 [3]:

社会网络

图的绘制是将社会结构可视化的有力工具.
这里画出一个社会网络图:

从单词和文本得到的图

这里画出所有以din开头的单词组成的网络. 这里,对于每个单词找到最近的两个单词,并且用边相连:
这里通过把单词中的每个字母与单词中该字母后面的所有字母相连接产生一个图:
这里通过把文本中的每个单词与接下来的其它单词相连接产生一个图:

环面

这里定义一个环面,并且在三维空间中画出相应的图线:
参考文献

[1] Milo, R., S. Shen-Orr, S. Itzkovitz, N. Kashtan, D. Chklovskii, and U. Alon. "Network Motifs: Simple Building Blocks of Complex Networks." Science 298, no. 5594 (2002): 824827.

[2] Alon, U. "Collection of Complex Networks." Uri Alon Homepage 2007.

[3] Milo, R., S. Itzkovitz, N. Kashtan, et al. "Superfamilies of Designed and Evolved Networks." Science 303, no. 5663 (2004): 15381542.

[4] Alon, U. "1AORInter." network Motifs 2007.

[5] National Institute of Standards and Technology. "DWA512: Square Dielectric Waveguide." Matrix Market 2007.

[6] Freivalds, K., U. Dogrusoz, and P. Kikusts, "Disconnected Graph Layout and the Polyomino Packing Approach." Lecture Notes in Computer Science: Revised Papers from the 9th International Symposium on Graph Drawing 2265 (2001): 378391.

[7] Hu, Y. F. "Graph Drawing of Square Matrices from University of Florida Sparse Matrix Collection." (2007).

[8] Hu, Y. F. "Efficient, High-Quality Force-Directed Graph Drawing." The Mathematica Journal 10, no. 1 (2006): 3771.