我想以编程方式创建这样的图表
wolfram-mathematica - 创建图图的技巧-LMLPHP
(来源:yaroslavvb.com

我想我应该对Graph使用带有VertexCoordinateRules,VertexRenderingFunction和EdgeRenderingFunction的GraphPlot。彩色斜面背景应该使用什么?

编辑
主要使用西蒙的想法,这是我最终使用的简化的“欠健壮”版本

Needs [“ GraphUtilities`”];
GraphPlotHighlight [edges_,verts_,color_]:=模块[{},
vpos = Position [VertexList [edges],替代@@ verts];
coords = Extract [GraphCoordinates [edges],vpos];
(*添加.002,因为当线段几乎共线时,端盖消失了*)
AppendTo [coords,First [coords] + .002];
Show [Graphics [{color,CapForm [“ Round”],JoinForm [“ Round”],
粗细[.2],线[坐标],多边形[坐标]}],
GraphPlot [edges],ImageSize-> 150]
]

SetOptions [GraphPlot,
VertexRenderingFunction->({White,EdgeForm [Black],Disk [#,.15],
黑色,文字[#2,#1]}&),
EdgeRenderingFunction->({Black,Line [#]}&)];
edge = GraphData [{“ Grid”,{3,3}},“ EdgeRules”];
颜色= {浅蓝色,浅绿色,浅红色,浅洋红色};
vsets = {{8,5,2},{7,5,8},{9,6,3},{8,1,2}};
MapThread [GraphPlotHighlight [edges,#1,#2]&,{vsets,colors}]


wolfram-mathematica - 创建图图的技巧-LMLPHP
(来源:yaroslavvb.com

最佳答案

概括一下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函数(以及上述gist中的版本)使用的通用性稍差一些,在该功能中也允许将边缘规则包装在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)[_ -> _, _])..}模式是等效的并且更加简洁...

关于wolfram-mathematica - 创建图图的技巧,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4091728/

10-11 07:40