一般绘图
GraphPlot 和 GraphPlot3D 计算以美观的二维/三维布局绘制图. 该函数的设计原理使其可用于非常大规模的图,并且处理连通和非连通图.
绘图函数.
| Out[1]= |  |
对于非连通图,以视觉美观的方式对每个分量进行布局,并且组合在一起.
| Out[2]= |  |
| Out[4]= |  |
GraphPlot 可能由于浮点的不同,在不同平台上产生略微不同的输出.
GraphPlot 和 GraphPlot3D 的选项
GraphPlot 和 GraphPlot3D 接受以下选项(DirectedEdges 和 EdgeLabeling 选项只对 GraphPlot 有效),另外,也接受 Graphics 和 Graphics3D 的选项.
GraphPlot 和 GraphPlot3D 的选项.
DirectedEdges
选项 DirectedEdges 指明是否把边画为箭头. 该选项的可能值为 True 或者 False. 该选项的默认值为 False.
| Out[5]= |  |
| Out[3]= |  |
EdgeLabeling
选项 EdgeLabeling 指明是否并且如何显示给定边的标签. 可能的选项值为 True、False 或者 Automatic. 该选项的默认值为 True,显示图上给定的边标签. 在设置 EdgeLabeling->Automatic 的情况下,标签显示为工具提示条.
| Out[6]= |  |
这里把边标签显示为工具提示条. 把光标放在顶点3和顶点6之间的边上,就可以看到工具提示条.
| Out[7]= |  |
另外,使用
Tooltip[vi->vj, lbl] 可以为边指定一个工具提示条. 把光标放在顶点3和顶点6之间的边上,以及在顶点3和顶点5之间的边的边标签上,可以看到工具提示条.
| Out[8]= |  |
若要在三维空间上显示为该条边所提供的标签,必须使用 EdgeRenderingFunction. 在 "Edge Rendering Function" 中对此有进一步讨论.
EdgeRenderingFunction
选项 EdgeRenderingFunction 指定了图的边的图形表示. 该选项的可能值为 Automatic、None 或是一个给出图形基元和指令的合理组合的函数. 在 Automatic 的默认设置下,对于每条边都使用一条深红色的线绘制. 若使用EdgeRenderingFunction->None,则不绘制边.
| Out[9]= |  |
设置 EdgeRenderingFunction->g 时,每条边使用图形基元和指令绘制,由具有三个或多个自变量的函数 g 给出,形式为
,其中
、
是边的起点和终点的坐标,
、
是起点和终点,而
是为边指定的任意标签或者 None. EdgeRenderingFunction->g 的明确设置重载了对于 EdgeLabeling 和 DirectedEdges 的设置.
这里把边画为灰色箭头,其端点与顶点相距 0.1 的距离(在图中的坐标系统中).
| Out[10]= |  |
这里生成边标签,或者显示图的描述中所提供的边标签.
| Out[11]= |  |
| Out[13]= |  |
这里使用球体绘制顶点,使用圆柱体绘制边,画出一个三维图.
| Out[14]= |  |
这里使用弹簧绘制边、使用球体绘制顶点,画出一个图.
| Out[16]= |  |
| Out[18]= |  |
| Out[11]= |  |
| Out[10]= |  |
Method
在 GraphPlot 和 GraphPlot3D 中使用的算法可以使用 Method 选项指定,或者是 Method->"name" 或者是Method->{"name", opt1->val1, ...},其中
是专用方法选项,在别的章节中有具体描述. Method->Automatic 对树使用
方法,而其它情况使用
.
| Automatic | 自动选择适用于该问题的方法 |
| "CircularEmbedding" | 在一个环形上对顶点进行布局 |
| "HighDimensionalEmbedding" | 调用高维嵌入方法,其中该图首先基于顶点到 k 个中心的图距离在高维空间展进行布局;接着,该布局使用主成分分析法的高维坐标的线性组合投影到二维或者三维空间 |
| "RadialDrawing" | 调用径向嵌入方法,它最适合于树形图或者类似树形的图;如果该图不是一个树,首先构建一个生成树,并且使用生成树的径向绘制方法来导出图的绘制方法 |
| "RandomEmbedding" | 对顶点进行随机布局 |
| "SpiralEmbedding" | 以螺旋形对顶点进行布局;在三维空间中,这在一个球体上均匀分布顶点 |
| "SpringElectricalEmbedding" | 调用弹簧电嵌入方法,其中相邻的顶点受到与它们物理距离成正比的弹簧吸引力,而所有的顶点受到与它们的距离成反比的排斥电力;最小化总能量 |
| "SpringEmbedding" | 调用弹簧嵌入方法,其中一个顶点受到来自另一个顶点的吸引力或者排斥力,就像它们是使用弹簧连接一样;弹簧具有等于顶点间的图距离的理想长度;最小化弹簧的总能量 |
Method 选项的有效值.
| Out[19]= |  |
这里使用

算法绘制图.
| Out[20]= |  |
这里使用

算法绘制图.
| Out[21]= |  |
这里使用

方法绘制含有30个顶点的完全图.
| Out[22]= |  |
这里使用三维中的

方法绘制含有30个顶点的完全图.
| Out[23]= |  |
这里使用

方法绘制完全图.
| Out[24]= |  |
这里绘制以
Combinatorica 程序包格式指定的图,并且使用其中的坐标.
| Out[26]= |  |
MultiedgeStyle
选项 MultiedgeStyle 指明是否绘制两个顶点之间的重边. MultiedgeStyle 的可能值为 Automatic(默认)、True、False 或者一个正实数. 在默认设置 MultiedgeStyle->Automatic 下,图中显示由规则列表指定的重边,但是如果这个图由邻接矩阵指定,则不显示. 在 MultiedgeStyle->
下,重边以尺度缩放距离
展开.
默认情况下,如果一个图是由规则列表给出的,则显示重边.
| Out[27]= |  |
但是若是由邻接矩阵指定的,则不显示重边.
| Out[28]= |  |
这里使用指定的量展开重边.
| Out[29]= |  |
PackingMethod
选项 PackingMethod 指定非连通分量的排列方法. 该选项的可能值为 Automatic(默认)、
、
、
、
、
和
. 在设置 PackingMethod->"ClosestPacking" 的情况下,使用四角方法 [6]排列分量使其尽可能接近,分量的排列从左上角开始. 在设置 PackingMethod->"ClosestPackingCenter" 的情况下,分量排列从中心开始. 在设置 PackingMethod->"Layered" 的情况下,分量排列从左上角的层开始. 在设置 PackingMethod->"LayeredLeft" 或者 PackingMethod->"LayeredTop" 的情况下,分量排列从上/左的层分别开始. 在 PackingMethod->"NestedGrid" 的情况下,分量以一个嵌套网格的形式排列. 典型的有效设置为 PackingMethod->"Layered",并且从最大边界框区域的分量开始进行排列.
| Out[31]= |  |
这里使用

方法显示非连通分量的排列.
| Out[33]= |  |
用户可以使用 PackingMethod 的子选项调整排列方式. 子选项
指定分量之间所允许的空间量;可能值为 Automatic (默认)或者一个非负数. 子选项
,重载
,也指定了分量之间所允许的空间量. 它采用形如
的列表,它们是分量的边界框的宽度和高度,并且返回一个非负数. 选项 PackingMethod->"ClosestPacking" 和 PackingMethod->"ClosestPackingCenter" 也接受
子选项,它指定用来近似每个非连通分量的位四角(polyominos)的平均数.
子选项的可能值为 Automatic (默认情况下,通常设置
为 100)或者一个正整数. 一个较小的
通常具有这样的效果:不允许较小的分量嵌入较大的分量之间.
这指定了分量之间的位四角(polyominos)空间.
| Out[35]= |  |
这里指定了用于近似每个分量的5个位四角(polyominos)的平均值.
| Out[37]= |  |
PlotRangePadding
PlotRangePadding 是由 GraphPlot 和 GraphPlot3D 继承的图形函数的通用选项.
PlotStyle
PlotStyle 是由 GraphPlot 和 GraphPlot3D 继承的图形函数的通用选项. 选项 PlotStyle 指明了绘制对象所采用的样式.
| Out[38]= |  |
SelfLoopStyle
选项 SelfLoopStyle 指定是否并且如何绘制与自身连接的回路. 该选项的可能值为 Automatic(默认)、True、False 或者正实数. 在设置 SelfLoopStyle->Automatic 的情况下,如果图由规则列表指定,则显示回路,若是由邻接矩阵指定,则不显示. 在设置 SelfLoopStyle->
的情况下,回路使用直径
绘制(相对于平均边长).
| Out[39]= |  |
如果图由邻接矩阵指定,则不显示回路.
| Out[40]= |  |
| Out[41]= |  |
VertexCoordinateRules
选项 VertexCoordinateRules 指明顶点坐标. 可能值为 None、坐标列表,或者是指定所选或全部顶点坐标的一个规则列表.
| Out[42]= |  |
这里使用

算法计算相同的图的顶点坐标.
| Out[43]= |  |
| Out[44]= |  |
这里仅指定

坐标.
| Out[12]= |  |
这里固定

坐标绘制二分图. 并且添加锚("Anchors")来连接非连通分量.
| Out[3]= |  |
当二分图被连接后,即使没有使用"左"和"右"锚扩展,它的工作性能也是更好的.
| Out[4]= |  |
VertexLabeling
选项 VertexLabeling 指定是否把顶点名称显示为标签. 该选项的可能值为 True、False、Automatic(默认)和 Tooltip. VertexLabeling->True 显示标签. 对于由邻接矩阵指定的图,顶点标签采用连续整数
、
、...、
,其中
是矩阵的大小. 对于由规则列表指定的图,标签是规则中使用的表达式. VertexLabeling->False 把每个顶点显示为点. VertexLabeling->Tooltip 把每个顶点显示为点,并且在工具提示条中给出它的名称. VertexLabeling->Automatic 把每个顶点显示为点,如果顶点数不太大的话,在工具提示条中给出它的名称. 用户也可以在规则列表的任意位置上使用 Tooltip[vk, vlbl],来为顶点
指定另外可选的工具提示条.
| Out[45]= |  |
| Out[46]= |  |
这里对顶点3和5指定其它可选的标签. 把光标放置在顶点上可以看到标签.
| Out[47]= |  |
这里把顶点作为点画出,并且在工具提示条中显示顶点名称. 把光标放置在顶点上可以查看标签.
| Out[48]= |  |
VertexRenderingFunction
选项 VertexRenderingFunction 指定图的边的图形表示. 该选项的可能值为 Automatic、None 或者是一个给出图形基元和指令的适当组合的函数. 在默认设置 Automatic 的情况下,顶点显示为点,而它们的名称在工具提示条中给出.
默认情况下,顶点作为点显示,对于较小的图,在工具提示条中加标签. 把光标放置在顶点上可以查看工具提示条.
| Out[49]= |  |
| Out[50]= |  |
在设置 VertexRenderingFunction->g 下,每个顶点使用由
给出的图形基元绘制,其中
是顶点坐标,而
是顶点标签. VertexRenderingFunction->g 的明确设置重载了 VertexLabeling 的设置.
| Out[51]= |  |
| Out[53]= |  |
所有方法的通用子选项
所有绘图方法都接受方法子选项
,它指明了从默认方向在半径上的顺时针旋转的期望值. 该选项采用任意数值值、或者 False. 默认为 0.
对于 GraphPlot 和 GraphPlot3D,默认方法由找到主轴的对齐步骤导出,并且使用
坐标对齐来绘图. 然而,如果指明 "Rotation"->False,该步骤就被跳过.
| | |
| "Rotation" | 0 | 绘图中所应用的顺时针旋转次数 |
所有方法的通用子选项.
| Out[2]= |  |
| Out[1]= |  |
"SpringEmbedding" 和 "SpringElectricalEmbedding" 方法的通用子选项
和
方法都属于所谓的力导向(force-directed)方法一类. 这些方法的工作方式如下:在每个顶点上计算力,并且沿着力迭代移动顶点以最小化总的系统能量. 参见 [8] 以获取算法的详细信息. 这两种方法具有以下共同选项.
和
方法的通用子选项.
"EnergyControl"
子选项
指定在最小化过程中系统总能量的限制. 可能值为 Automatic(默认)、
或者
. 当值为
时,仅当能量被降低的时候,沿着这个力的步进才被接受. 当值为
时,即使能量没有被降低,沿着该力的步进仍然被接受.
"InferentialDistance"
子选项
指定了一个临界距离,超过该距离时,可以假设顶点之间的交互作用不存在. 可能值为 Automatic(默认)或者正的数值值. 对于
方法,如果顶点 i 和顶点 j 之间的图距离大于
的选项值,在 i 和 j 之间的弹簧排斥和吸引力被忽略. 对于
方法,如果顶点 i 和顶点 j 之间的欧式距离大于
的选项值,在 i 和 j 之间的排斥力被忽略.
这里使用

方法绘制一个随机树.
| Out[2]= |  |
使用较小(更负)的

选项值(参见
下一节),这个图现在占用更多空间.
| Out[22]= |  |
使用小的

选项值可以达到类似的效果.
| Out[21]= |  |
MaxIterations
选项 MaxIterations 指定在最小化能量的过程中使用的最大迭代次数. 可能值为 Automatic(默认)或者一个正整数.
"RandomSeed"
选项
指定了计算初始顶点放置的随机数字生成器的一个种子. 改变该选项通常影响图的绘制方向,但是它也可以改变布局. 可能值为 Automatic 或者一个整数.
这里显示在绘制 Petersen 图中不同随机种子值产生的效果.
| Out[61]= |  |
| Out[62]= |  |
"RecursionMethod"
选项
指定图的布局是否使用迭代过程产生. 可能值为 Automatic(默认)、
或者 None. 在
算法中,该图连续粗化为具有越来越小顶点数的图. 较粗糙的图形首先被展开布局,然后这些布局图插入较精细的图,然后进一步完善.
的子选项.
对于选项
,可能值为 Automatic、True 和 False. 对于
,可能值为 Automatic 或者一个正数. 对于
,所实现的算法或者基于最大独立顶点集,这也形成了粗顶点,或者基于最大独立边集,也称为匹配. 在一个匹配中,形成一条边的两个顶点合并形成一个粗顶点. 下面是
的可能值.
| "MaximalIndependentVertexSet" | 如果顶点的图距离为3或者更小的数,在最大独立集合中连接顶点 |
| "MaximalIndependentVertexSetInjection" |
| 如果顶点之间的图距离为1或者2的时候,在最大独立集合中连接顶点 |
| "MaximalIndependentVertexSetRugeStuben" |
| 生成最大独立顶点集,把优先级给更多相邻顶点不在这个集合中的顶点,并且如果顶点间的图距离为3或者更小的话,连接顶点 |
| "MaximalIndependentVertexSetRugeStubenInjection" |
| 如果顶点的图距离为1或者2的时候,连接顶点,并且把优先级给具有更多相邻顶点的顶点 |
| "MaximalIndependentEdgeSet" | 当匹配时以自然顺序考虑边 |
| "MaximalIndependentEdgeSetHeavyEdge" |
| 当匹配时,把优先级给具有较高边权值的边(即,代表原图中较大边数的边) |
| "MaximalIndependentEdgeSetSmallestVertexWeight" |
| 把优先级给具有最小顶点权重的邻点的顶点匹配 |
"StepControl"
选项
定义在能量最小化过程中如何修正步长. 它可以是 Automatic(默认)、
(其中步长只能减少)、
(其中步长可以变大或者变小)、或者
(其中步长在迭代过程中严格减小).
"StepLength"
选项
给出在移动顶点时所使用的初始步长. 可能值为 Automatic(默认)或者正实数.
Tolerance
选项 Tolerance 指明在终止能量最小化过程中所使用的容差. 如果每个顶点坐标的平均改变量小于该容差,能量最小化过程就被终止,而当前坐标作为输出给出. 可能值为 Automatic 或者一个正实数.
"SpringElectricalEmbedding" 方法的子选项
| | |
| "Octree" | Automatic | 在排斥力的计算时,是否使用八叉树数据结构(三维)或者四叉树数据结构(二维) |
| "RepulsiveForcePower" | -1 | 排斥力随着距离的衰变速度有多快 |
的方法选项.
"Octree"
选项指明是否在排斥力的计算中,使用八叉树数据结构(三维)或者四叉树数据结构(二维). 可能值为Automatic(默认)、True 或者 False. 对于八叉树/四叉树数据结构的使用通过对长范围的排斥力的逼近,最小化了计算复杂度. 但是,它也引入了力的计算近似. 因此,在一些情况中,结果可能不会很好.
"RepulsiveForcePower"
可能值为负实数,-1 为默认值. 在弹簧电嵌入(spring-electrical embedding)中,两个顶点
和
之间的排斥力默认为
. 如果
的值为
(其中
),那么排斥力被定义为
,其中
是顶点之间的距离,而
是常量系数.
一个在长距离内的强的长范围排斥力通常具有边界效应,即在边缘上的顶点比中心处的顶点彼此更接近. 而指明较弱的长范围排斥力有时候可以减弱这种效果. 该选项对于绘制占用更多空间的图也是有益的. (参见"InferentialDistance" 方法选项以获取更多的详细信息.)
在排斥力的 power 为

的情况下,边界顶点之间比起默认值

的情况下,彼此没有更接近.
| Out[63]= |  |
| Out[64]= |  |
"HighDimensionalEmbedding" 方法的子选项
| | |
| "RefinementMethod" | None | 是否应该进一步改进结果,以及应该使用哪种方法改进 |
的方法选项.
"RefinementMethod"
选项
指定是否应该进一步改进结果,以及应该采用哪种方法改进. 可能值为 None(默认)、
或者
.
这里表明了这样一种情况,其中

方法把顶点5和6放置在同样的位置. 指定

选项有助于更好地绘制这个图.
| Out[66]= |  |
| Out[67]= |  |
高级专题
绘制一个图,以其能够占用更多空间
虽然 GraphPlot 的默认设置一般说来适用于具有广泛顶点度范围的图,我们经常也需要使用帮助顶点占用更少空间的设置.
| Out[19]= |  |
| Out[20]= |  |
但是,有时候

产生一个占用更多空间的绘图法.
| Out[21]= |  |
使用小于默认值

的排斥力,可以达到类似的效果,因此排斥力随着距离变大,衰变得更快.
| Out[23]= |  |
| Out[24]= |  |
对于这样的树状图,绘制树的算法可能是更可取的. 参见
"树形图" 以更好地控制树的布局.
| Out[25]= |  |
| Out[23]= |  |
改进对非常大规模的图的绘制性能
虽然通常默认选项设置能够保证很好的性能,但往往有可能通过对特定任务选择具体的选项组合,来进一步提高绘图速度和减少内存使用量. 举例来说,可以使用更小的迭代次数、更小的推断距离(inferential distance)、或者更低的容差来提高速度和/或内存使用量. 这些设置很容易就降低了绘图质量,但是仍然常常为用户提供一个可以接受的折衷方法.
| Out[76]= |  |
基于最大独立顶点集的粗略方案通常速度更快,使用更少的内存,但是却提供了一个可以比拟的布局质量.
| Out[77]= |  |
通过把迭代次数降低为 30,用户可以更快地获得结果.
| Out[78]= |  |
把推论距离(inferential distance)设置为 2,迭代次数设置为40,也比使用默认设置更快.
| Out[79]= |  |
通过进一步把迭代次数降低为 20,用户可以以快得多的速度获得结果.
| Out[80]= |  |
| Out[81]= |  |

往往是最快的方法,但是绘图质量常常会受到影响.
| Out[82]= |  |
相比之下,

是最慢的方法,但是它也是唯一使用正交线绘制网格的方法.
| Out[83]= |  |
从输出提取顶点坐标
在大多数情况下,用户将会处理 GraphPlot 和 GraphPlot3D 的输出,就像处理平常的 Graphics 表达式一样. 但是,有时候用户可能想要利用在输出表达式中封装的其他信息,形式如 Graphics[Annotation[data, VertexCoordinateRules->rules]]. 特别是,有时候提取图的顶点坐标是有益的.
| Out[84]= |  |
| Out[85]= |  |
示例
大肠杆菌转录网络(E. coli Transcription Networks)
在控制细胞中基因表达的一个转录调控网络的图表示中,节点(顶点)为操纵子,这是在同样的信使核糖核酸(mRNA)中结合转录的一个或多个基因. 图的边从对一种转录因子进行编码的操纵子指向直接调节 [1] 的操纵子.
数据
这是按规则描述的网络 [2].
绘制网络
该网络由许多分量组成. 把鼠标移到顶点上可以查看标签.
| Out[87]= |  |
| Out[88]= |  |
| Out[89]= |  |
| Out[90]= |  |
蛋白质:一种氧化还原酶
这里使用从 [4] 得到的数据绘制一种氧化还原酶蛋白质 [3].
| Out[91]= |  |
方形介质波导
一个方形稀疏矩阵可以看作图的邻接矩阵;因此,使用 GraphPlot "画出" 该稀疏矩阵常常是有益的. 下面给出一个例子,超过一千个矩阵的图的绘制可以参见 [7].
| Out[115]= |  |
| Out[116]= |  |
社会网络
图的绘制是将社会结构可视化的有力工具.
| Out[94]= |  |
从单词和文本得到的图
这里画出所有以"din"开头的单词组成的网络. 这里,对于每个单词找到最近的两个单词,并且用边相连.
| Out[97]= |  |
这里通过把单词中的每个字母与单词中该字母后面的所有字母相连接产生一个图.
| Out[2]= |  |
这里通过把文本中的每个单词与接下来的其它单词相连接产生一个图.
| Out[101]= |  |
环面
这里定义一个环面,并且在三维空间中画出相应的图线.
| Out[103]= |  |
参考文献
[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): 824-827.
[2] Alon, U. "Collection of Complex Networks." Uri Alon Homepage 2007. http://www.weizmann.ac.il/mcb/UriAlon/groupNetworksData.html
[3] Milo, R., S. Itzkovitz, N. Kashtan, et al. "Superfamilies of Designed and Evolved Networks." Science 303, no. 5663 (2004): 1538-1542.
[4] Alon, U. "1AORInter." network Motifs 2007. http://www.weizmann.ac.il/mcb/UriAlon/Papers/networkMotifs/1AORInter_st.txt
[5] National Institute of Standards and Technology. "DWA512: Square Dielectric Waveguide." Matrix Market 2007. http://math.nist.gov/MatrixMarket/data/NEP/dwave/dwa512.html
[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): 378-391.
[7] Hu, Y. F. "Graph Drawing of Square Matrices from University of Florida Sparse Matrix Collection." (2007). http://members.wolfram.com/~yifanhu/UFMatrixGraphPlot
[8] Hu, Y. F. "Efficient, High-Quality Force-Directed Graph Drawing." The Mathematica Journal 10, no. 1 (2006): 37-71.