我正在尝试构建一个LayeredGraphPlot,其中一些节点连接到其他节点,如树。我想有自由选择每个边缘的厚度,颜色,是否存在标签。
我还希望能够自由地显示一些顶点名称并将一些顶点显示为“点”。我似乎无法理解EdgeRenderingFunction和VertexRenderingFunction如何使我能够做到这一点。
我是mathematica的新手。我点击了有关Wolfram帮助页面的更多信息,但它似乎有一个模糊的描述而不是精确的语法,其次是一些可爱但无益(对我而言)的例子(与数学工作中的matlab相比,帮助提供了精确的语法..至少在我看来。) 我已经查阅了大约10本数学书籍(史密斯和布拉奇曼,mathematica揭秘等等),但它们似乎都只用一两个例子来表面覆盖函数,并没有提供最通用的语法。
有人可以帮忙解决这个问题,我也很欣赏如何学习mathematica的技巧吗?我是一个聪明的家伙,学习如何使用命令我不会有太多麻烦。
LayeredGraphPlot [{1→2,1-GT&; 3,2-GT; 4,3-GT; 5,3-→6}]
所以,例如,我想:
答案 0 :(得分:7)
VertexRenderingFunction
和EdgeRenderingFunction
允许您明确控制在图表中绘制顶点和边的方式。这两个函数都应返回对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
提供了两个定义。第一个仅适用于顶点4
或5
或6
。它将这些顶点绘制为框架标签。第二个定义适用于所有其他顶点并绘制简单的蓝点。
现在名为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
答案 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]}] &)
]
Mathematica语法乍一看令人生畏。几乎所有强大的工具都是。
我认为StackOverflow中提供的短片段作为新Mma用户的答案是第一步的良好起点。请注意,还发布了更高级且更困难的问题。
Mathematica不适合临时用户使用。如果你不打算花一些时间学习和习惯,我建议尝试另一种工具。
最后,帮助系统中没有深入介绍LayeredGraphPlot[]
函数,因为它是GraphPlot[]
的表兄弟,其帮助页面是所有Graph ... []系列的根目录帮助搜索。
答案 2 :(得分:0)
我模仿了你的代码并设法产生了一些非常接近我真正想要的东西。非常感谢你的帮助!
{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]}