Mathematica GraphPlot和EdgeRenderingFunction

时间:2010-09-26 01:43:52

标签: graph wolfram-mathematica

当我等待sorting完成时,我想调整我正在研究的Mathematica图的一部分。问题是节点位于边缘之上,我想知道是否有办法扭转它。在图像中,您可以看到箭头显示不正确......

我正在使用自定义GraphPlot[]VertexRenderingFunction参数进行EdgeRenderingFunction。它看起来像这样:

Where are the arrows? Can you see them? Did you take my arrows? http://img816.imageshack.us/img816/9703/graphbadarrows.png

正如您所看到的,如果箭头位于节点顶部,那就像他们说 cool 一样。是否有一种简单的方法来 hax 呢?

2 个答案:

答案 0 :(得分:4)

我不知道是否有办法直接使用GraphPlot选项,但您可以直接操作GraphPlot生成的Graphics对象。例如,这是一个与您的功能类似的图表。

bg = GraphPlot[Table[i -> Mod[3 i + 1, 9],
  {i, 0, 8}], DirectedEdges -> True,
  VertexRenderingFunction -> (
  {{White, Disk[#, 0.15]}, Circle[#, 0.15]} &),
  EdgeRenderingFunction -> (Arrow[#1] &)]

您可以按如下方式检查Graphics原语和指令的结构:

  bg // InputForm

您可以看到箭头在顶点之前放下。简单地反过来如下。

  MapAt[Reverse, bg, {1, 1}]

当然,您的Graphics对象可能会有不同的结构。

Mark McClure

答案 1 :(得分:3)

Mark的回答完全符合您的要求 - 您可以编写自己的功能来自动化Reverse。

一个不那么直接的解决办法可能就是将箭头从末端拉回一点:

GraphPlot[Table[i -> Mod[3 i + 1, 9], {i, 0, 8}], 
 VertexRenderingFunction -> ({{White, Disk[#, 0.15]}, 
     Circle[#, 0.15]} &), DirectedEdges -> True, 
 EdgeRenderingFunction -> ({Arrowheads[{{.05, .8}}], Red, 
     Arrow[#]} &)]

这也可以减少节点的拥塞。