How to Label Graph Edges with their weights
Warning! I posted the question when Mathematica v 8.0 was the coolest kid. The bug has been solved as of version 9.0.1
The help for EdgeLabels
states:
However:
CompleteGraph[4,
EdgeWeight -> Range@6,
VertexShapeFunction -> "Name",
EdgeLabels -> "EdgeWeight"]
Results in:
So, no Edge Labels ... I guess it is a bug.
I used a nasty construct like:
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]
Better ideas?
For a regular GraphPlot
, you will need a slightly more complicated solution using EdgeRenderingFunction
(documentation). Suppose you have an adjacency matrix where the elements are also the (directional) weights.
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}}
Here are some labels for the vertices, supposing you are drawing network diagrams for international inter-bank exposures (the original has a lot more countries!).
names = {"AT", "AU", "CA", "CH", "CL", "ES"}
The following does what you need. The tricks are the reference back to the adjacency matrix using the parts of #2
inside the part specification, to reference the correct elements of nums
, and the Mean[#1]
to locate the label at the midpoint of the edge. The slot #1
seems to hold the coordinates of the vertices.
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" still doesn't work in 8.0.4 and no longer seems to be in the documentation. However, here is one solution that does work:
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
works fine. EdgeWeights
does not.
It may already be obvious from Belisarius' second example that the problem lies with EdgeWeights
not EdgeLabels
Here's some additional evidence. EdgeLabels
very gladly displays a variety of labels correctly. But when you ask mma to display "EdgeWeights"
, it incorrectly displays 1's, no matter what you've stored there.
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}}]
The bug is not unique to CompleteGraph
. Graph
and GridGraph
have the same problem.
上一篇: Mathematica:重复的边缘
下一篇: 如何使用它们的权重标记图边