用于创建Graph图表的提示
我想以编程方式创建像这样的图表http://yaroslavvb.com/upload/junction-tree-decomposition.png
我想我应该使用带有VertexCoordinateRules,VertexRenderingFunction和EdgeRenderingFunction的GraphPlot作为图形。 我应该使用什么颜色的斜面背景?
编辑主要使用Simon的想法,这里是我最终使用的简化的“不太健壮”版本
Needs["GraphUtilities`"]; GraphPlotHighlight[edges_, verts_, color_] := Module[{}, vpos = Position[VertexList[edges], Alternatives @@ verts]; coords = Extract[GraphCoordinates[edges], vpos]; (* add .002 because end-cap disappears when segments are almost colinear *) AppendTo[coords, First[coords] + .002]; Show[Graphics[{color, CapForm["Round"], JoinForm["Round"], Thickness[.2], Line[coords], Polygon[coords]}], GraphPlot[edges], ImageSize -> 150] ] SetOptions[GraphPlot, VertexRenderingFunction -> ({White, EdgeForm[Black], Disk[#, .15], Black, Text[#2, #1]} &), EdgeRenderingFunction -> ({Black, Line[#]} &)]; edges = GraphData[{"Grid", {3, 3}}, "EdgeRules"]; colors = {LightBlue, LightGreen, LightRed, LightMagenta}; vsets = {{8, 5, 2}, {7, 5, 8}, {9, 6, 3}, {8, 1, 2}}; MapThread[GraphPlotHighlight[edges, #1, #2] &, {vsets, colors}]
http://yaroslavvb.com/upload/mathematica-graphs.png
我总结了Samsdram的答案
GraphPlotHighlight[edges:{((_->_)|{_->_,_})..},hl:{___}:{},opts:OptionsPattern[]]:=Module[{verts,coords,g,sub},
verts=Flatten[edges/.Rule->List]//.{a___,b_,c___,b_,d___}:>{a,b,c,d};
g=GraphPlot[edges,FilterRules[{opts}, Options[GraphPlot]]];
coords=VertexCoordinateRules/.Cases[g,HoldPattern[VertexCoordinateRules->_],2];
sub=Flatten[Position[verts,_?(MemberQ[hl,#]&)]];
coords=coords[[sub]];
Show[Graphics[{OptionValue[HighlightColor],CapForm["Round"],JoinForm["Round"],Thickness[OptionValue[HighlightThickness]],Line[AppendTo[coords,First[coords]]],Polygon[coords]}],g]
]
Protect[HighlightColor,HighlightThickness];
Options[GraphPlotHighlight]=Join[Options[GraphPlot],{HighlightColor->LightBlue,HighlightThickness->.15}];
上面的一些代码可以做得更健壮一些,但是它可以工作:
GraphPlotHighlight[{b->c,a->b,c->a,e->c},{b,c,e},VertexLabeling->True,HighlightColor->LightRed,HighlightThickness->.1,VertexRenderingFunction -> ({White, EdgeForm[Black], Disk[#, .06],
Black, Text[#2, #1]} &)]
编辑#1:这个代码的清理版本可以在http://gist.github.com/663438找到
编辑#2:正如在下面的评论中所讨论的,我的edges
必须匹配的模式是带有可选标签的边缘规则列表。 这与GraphPlot
函数(以及上述要点中的版本)所使用的一样,其边缘规则也被允许封装在Tooltip
这一般性略低于此。
为了找到GraphPlot
使用的确切模式,我重复使用Unprotect[fn];ClearAttributes[fn,ReadProtected];Information[fn]
其中fn
是感兴趣的对象,直到我发现它使用以下(清理)函数:
Network`GraphPlot`RuleListGraphQ[x_] :=
ListQ[x] && Length[x] > 0 &&
And@@Map[Head[#1] === Rule
|| (ListQ[#1] && Length[#1] == 2 && Head[#1[[1]]] === Rule)
|| (Head[#1] === Tooltip && Length[#1] == 2 && Head[#1[[1]]] === Rule)&,
x, {1}]
我认为我的edges:{((_ -> _) | (List|Tooltip)[_ -> _, _])..}
模式是等价的,更简洁...
对于只连接两个节点的简单示例(如最右边的示例),可以使用像这样的带顶点的终点画线。
vertices = {a, b};
Coordinates = {{0, 0}, {1, 1}};
GraphPlot[{a -> b}, VertexLabeling -> True,
VertexCoordinateRules ->
MapThread[#1 -> #2 &, {vertices, Coordinates}],
Prolog -> {Blue, CapForm["Round"], Thickness[.1], Line[Coordinates]}]
对于更复杂的示例(如右起第二个),我会建议使用顶点坐标绘制多边形,然后用带帽线描绘多边形的边缘。 我无法找到直接向多边形添加斜面边缘的方法。 在跟踪多边形的周长时,需要将第一个顶点的坐标添加到该线段构成多边形完整周长的线段末尾。 此外,CapForm有两条单独的图形指令,它们决定是否斜切行的末端,以及JoinForm,它决定是否斜切行的中间点。
vertices = {a, b, c};
Coordinates = {{0, 0}, {1, 1}, {1, -1}};
GraphPlot[{a -> b, b -> c, c -> a}, VertexLabeling -> True,
VertexCoordinateRules ->
MapThread[#1 -> #2 &, {vertices, Coordinates}],
Prolog -> {Blue, CapForm["Round"], JoinForm["Round"], Thickness[.15],
Line[AppendTo[Coordinates, First[Coordinates]]],
Polygon[Coordinates]}]
JoinForm [“Round”]将围绕线段的连接。
您需要在彩色区域顶点中心周围填充多边形,然后使用JoinForm["Round"], ..., Line[{...}]
来获得圆角。
考虑
foo = GraphPlot[{a -> b, a -> c, b -> d, b -> e, b -> f, c -> e, e -> f}, VertexRenderingFunction -> ({White, EdgeForm[Black], Disk[#, .1], Black, Text[#2, #1]} &)] Show[ Graphics[{ RGBColor[0.6, 0.8, 1, 1], Polygon[foo[[1, 1, 1, 1, 1, {2, 5, 6, 2}]]], JoinForm["Round"], Thickness[0.2], Line[foo[[1, 1, 1, 1, 1, {2, 5, 6, 2}]]] }], foo ]
其中foo [[1,1,1,1,1]]是顶点中心列表,{2,5,6}拉出{b,e,f}顶点。 ({2,5,6,2}在起点关闭线路。)
美容有很大的空间,但我认为这涵盖了你没有提到的成分。
链接地址: http://www.djcxy.com/p/35491.html