How to Label Graph Edges with their weights

前端 未结 4 1065
萌比男神i
萌比男神i 2021-02-09 11:57

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:

相关标签:
4条回答
  • 2021-02-09 12:32

    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]}]]
    
    0 讨论(0)
  • 2021-02-09 12:41

    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"]]
    

    enter image description here

    0 讨论(0)
  • 2021-02-09 12:49

    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}}]
    

    EdgeWeights.png

    The bug is not unique to CompleteGraph. Graph and GridGraph have the same problem.

    0 讨论(0)
  • 2021-02-09 12:51

    The solution is easy. Upgrade to V 8.0.1 :)

    At least that is what I have and it works there. (windows 7)

    enter image description here

    Btw, I do not know if the labels on the edges are correct, but at least it does put them on the figure, unlike your image).

    0 讨论(0)
提交回复
热议问题