EdgeRenderingFunction和VertexRenderingFunction帮助

时间:2011-09-28 18:51:44

标签: wolfram-mathematica

我正在尝试构建一个LayeredGraphPlot,其中一些节点连接到其他节点,如树。我想有自由选择每个边缘的厚度,颜色,是否存在标签。

我还希望能够自由地显示一些顶点名称并将一些顶点显示为“点”。我似乎无法理解EdgeRenderingFunction和VertexRenderingFunction如何使我能够做到这一点。

我是mathematica的新手。我点击了有关Wolfram帮助页面的更多信息,但它似乎有一个模糊的描述而不是精确的语法,其次是一些可爱但无益(对我而言)的例子(与数学工作中的matlab相比,帮助提供了精确的语法..至少在我看来。) 我已经查阅了大约10本数学书籍(史密斯和布拉奇曼,mathematica揭秘等等),但它们似乎都只用一两个例子来表面覆盖函数,并没有提供最通用的语法。

有人可以帮忙解决这个问题,我也很欣赏如何学习mathematica的技巧吗?我是一个聪明的家伙,学习如何使用命令我不会有太多麻烦。

LayeredGraphPlot [{1→2,1-GT&; 3,2-GT; 4,3-GT; 5,3-→6}]

所以,例如,我想:

  1. 禁止除顶点4,5和6之外的所有顶点名称。
  2. 颜色为蓝色且边缘厚度为3> 6,2-> 4且1-> 3
  3. 所有其他边缘都是红色和薄的

3 个答案:

答案 0 :(得分:7)

VertexRenderingFunctionEdgeRenderingFunction允许您明确控制在图表中绘制顶点和边的方式。这两个函数都应返回对Graphics命令有效的符号图形指令(或此类指令列表)。

让我们从VertexRenderingFunction开始吧。我们将定义一个名为drawVertex的新函数。使用两个参数调用VertexRenderingFunction:顶点的位置(作为X / Y坐标对)和顶点的名称。

drawVertex[position_, vertex:(4 | 5 | 6)] :=
  Inset[Framed[vertex, Background -> LightMagenta], position]

drawVertex[position_, _] :=
  {PointSize[Medium], Blue, Point[position]}

drawVertex提供了两个定义。第一个仅适用于顶点456。它将这些顶点绘制为框架标签。第二个定义适用于所有其他顶点并绘制简单的蓝点。

现在名为EdgeRenderingFunction的{​​{1}}。该函数将传递三个参数:边的端点,边的源和目标顶点的列表,以及边的标签(如果有的话)。在我们的例子中,所有边都将绘制为箭头,但颜色和厚度将根据边缘而变化。引入辅助函数drawEdge来捕获这些差异:

edgeStyle

有了这些定义,我们现在可以将它们与drawEdge[ends_, fromTo_, label_] := Join[edgeStyle[fromTo], {Arrowheads[{{Automatic, 0.5}}], Arrow[ends]}] edgeStyle[{3, 6} | {2, 4} | {1, 3}] := {Blue, Thick} edgeStyle[_] := {Red, Thin} 结合使用来生成自定义图表:

LayeredGraphPlot

layered graph

答案 1 :(得分:3)

LayeredGraphPlot[
 {1 -> 2, 1 -> 3, 2 -> 4, 3 -> 5, 3 -> 6}, 
 VertexRenderingFunction -> 
    (If[Intersection[{4, 5, 6}, {#2}] != {},
          {White, EdgeForm[Black], Disk[#, .1], Black, Text[#2, #1]}, 
          {PointSize[Large], Point[#1]}] &),
 EdgeRenderingFunction ->
    (If[Intersection[{{3, 6}, {2, 4}, {1, 3}}, {#2}] != {}, 
          {Blue, Thick, Line[#1]}, 
          {Red, Line[#1]}] &)
 ]

enter image description here

Mathematica语法乍一看令人生畏。几乎所有强大的工具都是。
我认为StackOverflow中提供的短片段作为新Mma用户的答案是第一步的良好起点。请注意,还发布了更高级且更困难的问题。

Mathematica不适合临时用户使用。如果你不打算花一些时间学习和习惯,我建议尝试另一种工具。

最后,帮助系统中没有深入介绍LayeredGraphPlot[]函数,因为它是GraphPlot[]的表兄弟,其帮助页面是所有Graph ... []系列的根目录帮助搜索。

答案 2 :(得分:0)

我模仿了你的代码并设法产生了一些非常接近我真正想要的东西。非常感谢你的帮助!

enter image description here

    {drawVertex[position_, 
    vertex : (1111 | 1112 | 1121 | 1122 | 1211 | 1212 | 1221 | 1222)] :=
    Inset[Framed[
    Text[If[vertex == 1111, "80,70", 
    If[vertex == 1112, "50,60", 
    If[vertex == 1121, "105,50", If[vertex == 1122, "70,55",
    If[vertex == 1211, "70,40", 
    If[vertex == 1212, "90,50", 
    If[vertex == 1221, "85,60", "40,50"]]]]]]]], 
    Background -> White], position]
    drawVertex[position_, _] := {PointSize[Medium], Blue, Point[position]}
    drawEdge[ends_, fromTo_, 
    label_] := {Join[
    edgeStyle[fromTo], {Arrowheads[{{Automatic, 1}}], Arrow[ends]}], 
    Text[label, Mean[ends]]}

    edgeStyle[{1, 11} | {11, 111} | {111, 1111}] := {Blue, Thick}

    edgeStyle[_] := {Red, Thin}
    LayeredGraphPlot[{{1 -> 11, "\!\(\*SubscriptBox[\"C\", 
    RowBox[{\"1\", \"L\"}]]\)"}, {1 -> 12, "\!\(\*SubscriptBox[\"C\", 
    RowBox[{\"1\", \"R\"}]]\)"}, {11 -> 111, 
    "\!\(\*SubscriptBox[\"H\", \"L\"]\)"}, {11 -> 112, 
    "\!\(\*SubscriptBox[\"H\", \"H\"]\)"}, {12 -> 121, 
    "\!\(\*SubscriptBox[\"H\", \"L\"]\)"}, {12 -> 122, 
    "\!\(\*SubscriptBox[\"H\", \"H\"]\)"}, {111 -> 1111, 
    "\!\(\*SubscriptBox[\"C\", 
    RowBox[{\"0\", \"L\"}]]\)"}, {111 -> 1112, "\!\(\*SubscriptBox[\"C\", 
    RowBox[{\"0\", \"H\"}]]\)"}, {112 -> 1121, "\!\(\*SubscriptBox[\"C\", 
    RowBox[{\"0\", \"L\"}]]\)"}, {112 -> 1122, "\!\(\*SubscriptBox[\"C\",  
    RowBox[{\"0\", \"H\"}]]\)"}, {121 -> 1211, "\!\(\*SubscriptBox[\"C\", 
    RowBox[{\"0\", \"L\"}]]\)"}, {121 -> 1212, "\!\(\*SubscriptBox[\"C\", 
    RowBox[{\"0\", \"H\"}]]\)"}, {122 -> 1221, "\!\(\*SubscriptBox[\"C\", 
    RowBox[{\"0\", \"L\"}]]\)"}, {122 -> 1222, "\!\(\*SubscriptBox[\"C\", 
    RowBox[{\"0\", \"H\"}]]\)"}}, EdgeRenderingFunction -> drawEdge, 
    VertexRenderingFunction -> drawVertex]}