7

警告!当 Mathematica v 8.0 是最酷的孩子时,我发布了这个问题。从 9.0.1 版本开始,该错误已得到解决

The help for EdgeLabels状态:

在此处输入图像描述

然而:

CompleteGraph[4,
 EdgeWeight -> Range@6,
 VertexShapeFunction -> "Name",
 EdgeLabels -> "EdgeWeight"]

结果是:

在此处输入图像描述

所以,没有边缘标签......我想这是一个错误。

我使用了一个讨厌的构造,例如:

adj = {{\[Infinity], 1, 1, 1, 1}, {1, \[Infinity], 2, 2, 2}, 
       {1, 2, \[Infinity], 2, 2}, {1, 2, 2, \[Infinity], 2}, 
       {1, 2, 2, 2, \[Infinity]}};

WeightedAdjacencyGraph[adj,
    VertexShapeFunction -> "Name", 
    EdgeLabels -> 
     MapThread[Rule,{EdgeList@#,AbsoluteOptions[#, EdgeWeight]/.{_ -> x_}-> x}], 
    GraphHighlight -> FindEdgeCover[#]]  
                                        &@ WeightedAdjacencyGraph[adj]

在此处输入图像描述

更好的想法?

4

4 回答 4

9

对于常规,您将需要使用(文档GraphPlot)稍微复杂的解决方案。假设您有一个邻接矩阵,其中元素也是(方向)权重。EdgeRenderingFunction

lilnums = {{0, 2., 1., 3., 0, 6.}, {0, 0, 1., 2., 0, 0}, {1., 8., 0, 2., 0, 
 2.}, {10., 13., 7., 0, 0, 10.}, {0, 0, 0, 0, 0, 0}, {4., 1., 1., 2.,
 2., 0}}

这里有一些顶点标签,假设您正在绘制国际银行间风险敞口的网络图(原来有更多的国家!)。

names = {"AT", "AU", "CA", "CH", "CL", "ES"}

以下是您需要的。技巧是使用零件规范内部的零件来参考邻接矩阵#2,参考 的正确元素nums,以及Mean[#1]将标签定位在边缘的中点。插槽#1似乎保存了顶点的坐标。

GraphPlot[lilnums, DirectedEdges -> True, 
 VertexRenderingFunction -> ({White, EdgeForm[Black], Disk[#, .04], 
 Black, Text[names[[#2]], #1]} &), 
 EdgeRenderingFunction -> ({AbsoluteThickness[2], Red, 
 Arrowheads[0.02], Arrow[#1, 0.05], Black, 
 Text[Round@ Abs[(lilnums[[#2[[1]], #2[[2]]]] + 
   lilnums[[#2[[2]], #2[[1]]]])], Mean[#1], 
  Background -> Yellow]} &), VertexLabeling -> True, 
 ImageSize -> 600,  
  PlotLabel -> Style["Plot Label", Bold, 14, FontFamily -> "Arial"]]

在此处输入图像描述

于 2011-09-12T10:25:43.560 回答
5

EdgeLabels -> "EdgeWeight" 在 8.0.4 中仍然不起作用,并且似乎不再出现在文档中。但是,这是一种可行的解决方案:

lilnums = {{0, 2., 1., 3., 0, 6.}, {0, 0, 1., 2., 0, 0}, {1., 8., 0, 2., 0, 2.},
  {10., 13., 7., 0, 0, 10.}, {0, 0, 0, 0, 0, 0}, {4., 1., 1., 2., 2., 0}}
names = {"AT", "AU", "CA", "CH", "CL", "ES"};
g = WeightedAdjacencyGraph[names, lilnums /. {0 -> \[Infinity]}, 
  VertexShapeFunction -> "Name" , ImagePadding -> 15];
SetProperty[g, EdgeLabels -> MapThread[#1 -> #2 &, 
  {EdgeList[g], PropertyValue[g, EdgeWeight]}]]
于 2012-02-25T20:22:18.433 回答
4

EdgeLabels工作正常。EdgeWeights才不是。

从贝利撒留的第二个例子中可能已经很明显,问题在于EdgeWeightsEdgeLabels

这里有一些额外的证据。EdgeLabels很高兴能正确显示各种标签。但是,当您要求 mma 显示时"EdgeWeights",无论您在那里存储了什么,它都会错误地显示 1。

CompleteGraph[4, VertexShapeFunction -> "Name",
 EdgeLabels -> {
   UndirectedEdge[1, 2] -> "hello", 
   UndirectedEdge[1, 4] -> "goodbye", UndirectedEdge[2, 3] -> 55, 
   UndirectedEdge[3, 4] -> \[Pi]/2, 
   UndirectedEdge[4, 2] -> 
   "\!\(\*UnderoverscriptBox[\(\[Sum]\), \(i = 0\), \(26\)]\)(-1\!\(\
   \*SuperscriptBox[\()\), \(i\)]\)\!\(\*SuperscriptBox[\(\[Theta]\), \
   \(n - i\)]\)", UndirectedEdge[1, 3] -> {a, b, c}}]

边权重.png

该错误并非CompleteGraph. GraphGridGraph有同样的问题。

于 2011-09-14T01:12:54.743 回答
3

解决方案很简单。升级到 V 8.0.1 :)

至少那是我所拥有的并且它在那里工作。(Windows 7的)

在此处输入图像描述

顺便说一句,我不知道边缘上的标签是否正确,但至少它确实把它们放在图上,不像你的图像)。

于 2011-09-12T06:32:25.447 回答