如何使用它们的权重标记图边
警告! 当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]
更好的想法?
对于常规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"]]
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]}]]
EdgeLabels
工作正常。 EdgeWeights
没有。
从Belisarius的第二个例子可能已经很明显,问题在于EdgeWeights
而不是EdgeLabels
这里有一些额外的证据。 EdgeLabels
非常乐意正确显示各种标签。 但是,当你要求"EdgeWeights"
显示"EdgeWeights"
,无论你存储在"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}}]
该错误并不是独特的CompleteGraph
。 Graph
和GridGraph
有同样的问题。