Skip to main content

graphs and networks - Edge Labels with distance between vertices


I am trying to make traveling salesman type graph using the locations of NFL stadiums as the vertices. I need to get the EdgeLabels to appear was the distance between the vertices. I was able to slightly modify some code from


Building graph based on the cities connection?


but I am still unsure about how to incorporate the distances.


stateConnections = {{"TEN", "CAR"}, {"NYGJ", "PIT", "DET"}, {"SEA", 
"MIN" }, {"SFO", "SEA", "SDO"}, {"ARZ", "HOU"}, {"DAL",
"STL"}, {"PHI", "MIA", "KCY"}, {"OAK", "ARZ", "DEN"}, {"DEN",
"DAL"}, {"GBY", "CIN", "CHI"}, {"MIN", "MIA"}, {"NOR", "TEN",
"HOU"}, {"DET", "KCY"}, {"BUF", "CLE"}, {"CLE", "NWE"}, {"NWE",
"TBY"}, {"TBY", "STL"}, {"PIT", "BAL"}, {"JAC", "ATL"}, {"IND",

"BAL", "CHI"}, {"ATL", "CIN"}, {"JAC", "BUF"}, {"WAS", "CAR",
"JAC"}, {"SDO", "ARZ"}};


stateData = {"TEN,36.1665,-86.7713", "NYGJ,40.8122,-74.077", "PIT,40.4468,-80.0158", "CAR,35.2258,-80.8529", "BAL,39.278,-76.6228", "TBY,27.976,-82.5033",
"IND,39.7601,-86.1638", "MIN,44.9739,-93.2581",
"ARZ,33.5277,-112.263", "DAL,32.7478,-97.0928",
"ATL,33.7576,-84.401", "NYGJ,40.8122,-74.077",
"DEN,39.7439,-105.02", "MIA,25.9579,-80.2388",
"PHI,39.9008,-75.1675", "CHI,41.8623,-87.6167",

"NWE,42.0909,-71.2643", "WAS,38.9077,-76.8645",
"GBY,44.5013,-88.0622", "SDO,32.7831,-117.12",
"NOR,29.9509,-90.0814", "HOU,29.6848,-95.411",
"BUF,42.7737,-78.787", "SFO,37.7135,-122.386",
"JAC,30.3239,-81.6374", "CLE,41.506,-81.6996",
"OAK,37.7514,-122.201", "KCY,39.0489,-94.484",
"STL,38.633,-90.1885", "SEA,47.5952,-122.332",
"CIN,39.0954,-84.516", "DET,42.3402,-83.0458"};

stateAbbreviations = Union[Flatten[stateConnections]];

stateToNumber = MapThread[Rule, {stateAbbreviations, Range[Length[stateAbbreviations]]}];
numberToState = MapThread[ Rule, {Range[Length[stateAbbreviations]], stateAbbreviations}];
allConnections = Flatten[Function[e, Map[UndirectedEdge[First[e], #] &, Rest[e]]] /@ stateConnections];
connections = Union[Sort /@ allConnections];
stateCenters = First[StringSplit[#, ","]] -> ToExpression /@ RotateLeft@Rest[StringSplit[#, ","]] & /@ stateData;
stateCoords = (# & /@ stateAbbreviations) /. stateCenters;
temp = Graph[connections /. stateToNumber];
vertexCoordinates = stateCoords[[VertexList[temp]]];
g = Graph[connections /. stateToNumber, VertexCoordinates -> vertexCoordinates, VertexLabels -> numberToState, VertexShapeFunction -> "Circle", VertexSize -> 1, VertexLabelStyle -> Directive[Black, 7]];


Show[Graphics[{LightGray, CountryData["USA", "Polygon"]}], g, ImageSize -> 1000]

Answer



In Mathematica 10 it is easy to do with GeoDistance. Simply replace your g with the following lines


stateToLocation = 
Rule[First[#], ToExpression[Rest[#]]] & /@ (StringSplit[stateData,
","]);
edgeLabels =
Thread[Rule[
EdgeList[g], (EdgeList[g] /. numberToState /. stateToLocation) /.
UndirectedEdge -> GeoDistance]];

g = Graph[connections /. stateToNumber,
VertexCoordinates -> vertexCoordinates,
VertexLabels -> numberToState, VertexShapeFunction -> "Circle",
VertexSize -> 1, VertexLabelStyle -> Directive[Black, 7],
EdgeLabels -> edgeLabels];

Comments

Popular posts from this blog

front end - keyboard shortcut to invoke Insert new matrix

I frequently need to type in some matrices, and the menu command Insert > Table/Matrix > New... allows matrices with lines drawn between columns and rows, which is very helpful. I would like to make a keyboard shortcut for it, but cannot find the relevant frontend token command (4209405) for it. Since the FullForm[] and InputForm[] of matrices with lines drawn between rows and columns is the same as those without lines, it's hard to do this via 3rd party system-wide text expanders (e.g. autohotkey or atext on mac). How does one assign a keyboard shortcut for the menu item Insert > Table/Matrix > New... , preferably using only mathematica? Thanks! Answer In the MenuSetup.tr (for linux located in the $InstallationDirectory/SystemFiles/FrontEnd/TextResources/X/ directory), I changed the line MenuItem["&New...", "CreateGridBoxDialog"] to read MenuItem["&New...", "CreateGridBoxDialog", MenuKey["m", Modifiers-...

How to thread a list

I have data in format data = {{a1, a2}, {b1, b2}, {c1, c2}, {d1, d2}} Tableform: I want to thread it to : tdata = {{{a1, b1}, {a2, b2}}, {{a1, c1}, {a2, c2}}, {{a1, d1}, {a2, d2}}} Tableform: And I would like to do better then pseudofunction[n_] := Transpose[{data2[[1]], data2[[n]]}]; SetAttributes[pseudofunction, Listable]; Range[2, 4] // pseudofunction Here is my benchmark data, where data3 is normal sample of real data. data3 = Drop[ExcelWorkBook[[Column1 ;; Column4]], None, 1]; data2 = {a #, b #, c #, d #} & /@ Range[1, 10^5]; data = RandomReal[{0, 1}, {10^6, 4}]; Here is my benchmark code kptnw[list_] := Transpose[{Table[First@#, {Length@# - 1}], Rest@#}, {3, 1, 2}] &@list kptnw2[list_] := Transpose[{ConstantArray[First@#, Length@# - 1], Rest@#}, {3, 1, 2}] &@list OleksandrR[list_] := Flatten[Outer[List, List@First[list], Rest[list], 1], {{2}, {1, 4}}] paradox2[list_] := Partition[Riffle[list[[1]], #], 2] & /@ Drop[list, 1] RM[list_] := FoldList[Transpose[{First@li...

plotting - How to draw lines between specified dots on ListPlot?

I would like to create a plot where I have unconnected dots and some connected. So far, I have figured out how to draw the dots. My code is the following: ListPlot[{{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4,13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full] I have thought using ListLinePlot command, but I don't know how to specify to the command to draw only selected lines between the dots. Do have any suggestions/hints on how to do that? Thank you. Answer One possibility would be to use Epilog with Line : ListPlot[ {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4, 13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full, Epilog -> { Line[ ...