How to Label Graph Edges with their weights

前端 未结 4 1086
萌比男神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: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

提交回复
热议问题