Goal of post.

The goal of this post is to show how to use the data available on DataUSA, specifically employment by state data, to demonstrate different approaches to constructing network diagrams. The data structures of the following network diagrams follow EdgeNetworks most closely, but the concepts can be transferred to other network data structures. Additional resources used to build these diagrams are listed at the bottom of the post, and are great step-by-step guides for creating many types of network diagrams from scratch.

Sample network outputs:

Gathering and structuring your data:

The data in these examples utilize {r} [Data USA] (https://datausa.io/), a project created by {r} [Cesar Hidalgo] (www.chidalgo.com), (whose techniques will be utilized further in this post). The resulting dataframe should have the following columns before you attempt to build a network diagram:



Column mapping:

id: The id number of the observation.

to: The node number that the link is in the direction of.

from: The node number that the link is directed from.

industry_id1: The industry ID for the “to” node. Can be used as an attribute for labelling or coloring.

industry_id1: The industry ID for the “from” node. Can be used as an attribute for labelling or coloring.

industry1: The industry name for the “to” node. Can be used as an attribute for labelling or coloring.

industry2: The industry name for the “from” node. Can be used as an attribute for labelling or coloring.

value: A calculated field indicating the number of interactions between the two industries. Can be used for coloring, fill, size, etc.

Creating the Network DF

If you’re reading your data in from a CSV, excel etc. use the following to create a simple dataframe that contains the coluimns as needed. The below pulls columns from a file called ny_network_data. Replace “ny_network_data” for whatever your filename is. $ indicates a call to the columns within that file structure, you can edit this to meet your own column names.

R code to create dataframe:

simple_network <- data.frame(
  to=ny_network_data$from,
  from=ny_network_data$to,
  id = ny_network_data$id,
  to_industry = ny_network_data$industry2,
  from_industry = ny_network_data$industry1,
  value = ny_network_data$value, 
  title = as.character(ny_network_data$industry2)
)
Formatting the dataframe into a network graph.

The igraph library provides multiple functions that convert dataframes and other data structures into a format that can be read by multiple plotting functions within R. Below is an example showing how to run your df through the graph_from_data_frame function.

edge_network <- graph_from_data_frame(d=simple_network, directed=F) 
Plotting

Once your data is structured in a way that graphing functions can read it, you’re ready to plot. There are multiple tools and libraries that can be used to plot networks, each of them has their benefits and limitations.

The below represents the most basic (and built-in), but powerful use of “plot.”

plot(edge_network)

The hard work is done, the rest is just formatting and structuring of the network diagram to make it more easily readable and valuable to a viewer. Using the extra columns in your df, you can start to play with sizes of the notes, length of edges, colors, as well as labels and titles.

A full list of all the ways to format a simple network diagram is available{r} [here.] (https://www.rdocumentation.org/packages/network/versions/1.13.0/topics/plot.network.default), and much of the example below is borrow from {r} [Yan Holtz.] (https://www.r-graph-gallery.com/250-correlation-network-with-igraph.html)

plot(edge_network, 
     vertex.size=simple_network$value*.5,           # Mapping the size of the nodes to value.
     vertex.color=simple_network$from_industry,     # Mapping the color of the nodes to industries
     vertex.label=" ",                              # Placeholder before figuring out how to hover.
     layout=layout.random, main="Random")           # Playing with layouts (random, sphere, etc.)

To update with more guidance soon!
LS0tCnRpdGxlOiAiQnVpbGRpbmcgZW1wbG95bWVudCBuZXR3b3JrIHN0cnVjdHVyZXMgZm9yIE5vcnRoZWFzdCBTdGF0ZXMgaW4gdGhlIFVTIgpzdWJ0aXRsZTogIlJlc3VsdHMgJiByZXBybyBndWlkZSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpCiMgTG9hZCBhcHByb3ByaWF0ZSBsaWJyYXJpZXMKbGlicmFyeShpZ3JhcGgpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KGphbml0b3IpCmxpYnJhcnkodmlyaWRpcykKbGlicmFyeShnZ3JhcGgpCmxpYnJhcnkodmlzTmV0d29yaykKbGlicmFyeShndCkKbGlicmFyeShuZXR3b3JrRDMpCmxpYnJhcnkodGlkeXZlcnNlKQoKIyBSZXNvdXJjZXMKIyBodHRwczovL2lncmFwaC5vcmcvcHl0aG9uL2RvYy90dXRvcmlhbC90dXRvcmlhbC5odG1sCiMgaHR0cHM6Ly93d3cuci1ncmFwaC1nYWxsZXJ5LmNvbS8yNDctbmV0d29yay1jaGFydC1sYXlvdXRzLmh0bWwKCgojIFJlYWQgaW4gdGhlIG5ldHdvcmsgZGF0YQpueV9uZXR3b3JrX2RhdGEgPC0gcmVhZF94bHN4KCJOWV9uZXR3b3JrZWQueGxzeCIpICU+JSBjbGVhbl9uYW1lcygpICU+JSBzZWxlY3QoMTo5KSAlPiUgbmEub21pdCgpICAlPiUgZmlsdGVyKHZhbHVlID4gMTkpIApueV8xOCA8LSByZWFkX3hsc3goIk5ZX25ldHdvcmtlZF8xOC54bHN4IikgJT4lIGNsZWFuX25hbWVzKCkgJT4lIHNlbGVjdCgxOjkpICU+JSBuYS5vbWl0KCkgCgpgYGAKCmBgYHtyIHdyaXRpbmcgb3V0LCBpbmNsdWRlPUZBTFNFLCBlY2hvID0gRkFMU0V9CiMgQ3JlYXRpbmcgCiMgRGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb21iaW5lcyBib3RoIGZvciBhIHNpbXBsZSBuZXR3b3JrCnNpbXBsZV9uZXR3b3JrIDwtIGRhdGEuZnJhbWUoCiAgdG89bnlfbmV0d29ya19kYXRhJGZyb20sCiAgZnJvbT1ueV9uZXR3b3JrX2RhdGEkdG8sCiAgaWQgPSBueV9uZXR3b3JrX2RhdGEkaWQsCiAgdG9faW5kdXN0cnkgPSBueV9uZXR3b3JrX2RhdGEkaW5kdXN0cnkyLAogIGZyb21faW5kdXN0cnkgPSBueV9uZXR3b3JrX2RhdGEkaW5kdXN0cnkxLAogIHZhbHVlID0gbnlfbmV0d29ya19kYXRhJHZhbHVlLCAKICB0aXRsZSA9IGFzLmNoYXJhY3RlcihueV9uZXR3b3JrX2RhdGEkaW5kdXN0cnkyKQopCgpgYGAKCiMjIyMjIEdvYWwgb2YgcG9zdC4KClRoZSBnb2FsIG9mIHRoaXMgcG9zdCBpcyB0byBzaG93IGhvdyB0byB1c2UgdGhlIGRhdGEgYXZhaWxhYmxlIG9uIERhdGFVU0EsIHNwZWNpZmljYWxseSBlbXBsb3ltZW50IGJ5IHN0YXRlIGRhdGEsIHRvIGRlbW9uc3RyYXRlIGRpZmZlcmVudCBhcHByb2FjaGVzIHRvIGNvbnN0cnVjdGluZyBuZXR3b3JrIGRpYWdyYW1zLiBUaGUgZGF0YSBzdHJ1Y3R1cmVzIG9mIHRoZSBmb2xsb3dpbmcgbmV0d29yayBkaWFncmFtcyBmb2xsb3cgRWRnZU5ldHdvcmtzIG1vc3QgY2xvc2VseSwgYnV0IHRoZSBjb25jZXB0cyBjYW4gYmUgdHJhbnNmZXJyZWQgdG8gb3RoZXIgbmV0d29yayBkYXRhIHN0cnVjdHVyZXMuIEFkZGl0aW9uYWwgcmVzb3VyY2VzIHVzZWQgdG8gYnVpbGQgdGhlc2UgZGlhZ3JhbXMgYXJlIGxpc3RlZCBhdCB0aGUgYm90dG9tIG9mIHRoZSBwb3N0LCBhbmQgYXJlIGdyZWF0IHN0ZXAtYnktc3RlcCBndWlkZXMgZm9yIGNyZWF0aW5nIG1hbnkgdHlwZXMgb2YgbmV0d29yayBkaWFncmFtcyBmcm9tIHNjcmF0Y2guIAoKIyMjIyMgU2FtcGxlIG5ldHdvcmsgb3V0cHV0czoKCmBgYHtyIHBsb3R0aW5nfQplZGdlX25ldHdvcmsgPC0gZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKGQ9c2ltcGxlX25ldHdvcmssIGRpcmVjdGVkPUYpIAoKcGFyKG1mcm93PWMoMiwzKSkKcGxvdChlZGdlX25ldHdvcmssIHZlcnRleC5zaXplPXNpbXBsZV9uZXR3b3JrJHZhbHVlKi41LCB2ZXJ0ZXguY29sb3I9c2ltcGxlX25ldHdvcmskZnJvbV9pbmR1c3RyeSwgdmVydGV4LmxhYmVsPSIgIiwgbGF5b3V0PWxheW91dC5yYW5kb20sIG1haW49IlJhbmRvbSIpCnBsb3QoZWRnZV9uZXR3b3JrLCB2ZXJ0ZXguc2l6ZT1zaW1wbGVfbmV0d29yayR2YWx1ZSouNSwgdmVydGV4LmNvbG9yPXNpbXBsZV9uZXR3b3JrJGZyb21faW5kdXN0cnksIHZlcnRleC5sYWJlbD0iICIsIGxheW91dD1sYXlvdXQuZnJ1Y2h0ZXJtYW4ucmVpbmdvbGQsIG1haW49ImZydWNodGVybWFuLnJlaW5nb2xkIikKcGxvdChlZGdlX25ldHdvcmssIHZlcnRleC5zaXplPXNpbXBsZV9uZXR3b3JrJHZhbHVlKi41LCB2ZXJ0ZXguY29sb3I9c2ltcGxlX25ldHdvcmskZnJvbV9pbmR1c3RyeSwgdmVydGV4LmxhYmVsPSIgIiwgbGF5b3V0ID0gbGF5b3V0X3dpdGhfbWRzLCBtYWluID0gIk1EUyIpCnBsb3QoZWRnZV9uZXR3b3JrLCB2ZXJ0ZXguc2l6ZT1zaW1wbGVfbmV0d29yayR2YWx1ZSouNSwgdmVydGV4LmNvbG9yPXNpbXBsZV9uZXR3b3JrJGZyb21faW5kdXN0cnksIHZlcnRleC5sYWJlbD0iICIsIGxheW91dCA9IGxheW91dF93aXRoX2dyYXBob3B0LCBtYWluID0gIkdyYXBoIE9QVCIpCnBsb3QoZWRnZV9uZXR3b3JrLCB2ZXJ0ZXguc2l6ZT1zaW1wbGVfbmV0d29yayR2YWx1ZSouNSwgdmVydGV4LmNvbG9yPXNpbXBsZV9uZXR3b3JrJGZyb21faW5kdXN0cnksIHZlcnRleC5sYWJlbD0iICIsIGxheW91dCA9IGxheW91dC5zcGhlcmUsIG1haW49IlNwaGVyZSIpCnBsb3QoZWRnZV9uZXR3b3JrLCB2ZXJ0ZXguc2l6ZT1zaW1wbGVfbmV0d29yayR2YWx1ZSouNSwgdmVydGV4LmNvbG9yPXNpbXBsZV9uZXR3b3JrJGZyb21faW5kdXN0cnksIHZlcnRleC5sYWJlbD0iICIsIGxheW91dD1sYXlvdXQuY2lyY2xlLCBtYWluPSJDaXJjbGUiKSAKCmBgYAoKCiMjIyMjIEdhdGhlcmluZyBhbmQgc3RydWN0dXJpbmcgeW91ciBkYXRhOgoKVGhlIGRhdGEgaW4gdGhlc2UgZXhhbXBsZXMgdXRpbGl6ZSB7cn0gW0RhdGEgVVNBXSAoaHR0cHM6Ly9kYXRhdXNhLmlvLyksICBhIHByb2plY3QgY3JlYXRlZCBieSB7cn0gW0Nlc2FyIEhpZGFsZ29dICh3d3cuY2hpZGFsZ28uY29tKSwgKHdob3NlIHRlY2huaXF1ZXMgd2lsbCBiZSB1dGlsaXplZCBmdXJ0aGVyIGluIHRoaXMgcG9zdCkuIFRoZSByZXN1bHRpbmcgZGF0YWZyYW1lIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgY29sdW1ucyBiZWZvcmUgeW91IGF0dGVtcHQgdG8gYnVpbGQgYSBuZXR3b3JrIGRpYWdyYW06CgpgYGB7cn0Kbnlfc2FtcGxlIDwtaGVhZChueV8xOCwgNSkgJT4lIHNlbGVjdCgxOjcpICAlPiUgZ3QoKQpueV9zYW1wbGUKYGBgCgo8YnI+Cjxicj4KCiMjIyMjIENvbHVtbiBtYXBwaW5nOgoKKippZDoqKiBUaGUgaWQgbnVtYmVyIG9mIHRoZSBvYnNlcnZhdGlvbi4KCioqdG86KiogVGhlIG5vZGUgbnVtYmVyIHRoYXQgdGhlIGxpbmsgaXMgaW4gdGhlIGRpcmVjdGlvbiBvZi4KCioqZnJvbToqKiBUaGUgbm9kZSBudW1iZXIgdGhhdCB0aGUgbGluayBpcyBkaXJlY3RlZCBmcm9tLgoKKippbmR1c3RyeV9pZDE6KiogVGhlIGluZHVzdHJ5IElEIGZvciB0aGUgInRvIiBub2RlLiBDYW4gYmUgdXNlZCBhcyBhbiBhdHRyaWJ1dGUgZm9yIGxhYmVsbGluZyBvciBjb2xvcmluZy4KCioqaW5kdXN0cnlfaWQxOioqIFRoZSBpbmR1c3RyeSBJRCBmb3IgdGhlICJmcm9tIiBub2RlLiBDYW4gYmUgdXNlZCBhcyBhbiBhdHRyaWJ1dGUgZm9yIGxhYmVsbGluZyBvciBjb2xvcmluZy4KCioqaW5kdXN0cnkxOioqIFRoZSBpbmR1c3RyeSBuYW1lIGZvciB0aGUgInRvIiBub2RlLiBDYW4gYmUgdXNlZCBhcyBhbiBhdHRyaWJ1dGUgZm9yIGxhYmVsbGluZyBvciBjb2xvcmluZy4KCioqaW5kdXN0cnkyOioqIFRoZSBpbmR1c3RyeSBuYW1lIGZvciB0aGUgImZyb20iIG5vZGUuIENhbiBiZSB1c2VkIGFzIGFuIGF0dHJpYnV0ZSBmb3IgbGFiZWxsaW5nIG9yIGNvbG9yaW5nLgoKKip2YWx1ZToqKiBBIGNhbGN1bGF0ZWQgZmllbGQgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZSB0d28gaW5kdXN0cmllcy4gQ2FuIGJlIHVzZWQgZm9yIGNvbG9yaW5nLCBmaWxsLCBzaXplLCBldGMuIAoKIyMjIyMgQ3JlYXRpbmcgdGhlIE5ldHdvcmsgREYKCklmIHlvdSdyZSByZWFkaW5nIHlvdXIgZGF0YSBpbiBmcm9tIGEgQ1NWLCBleGNlbCBldGMuIHVzZSB0aGUgZm9sbG93aW5nIHRvIGNyZWF0ZSBhIHNpbXBsZSBkYXRhZnJhbWUgdGhhdCBjb250YWlucyB0aGUgY29sdWltbnMgYXMgbmVlZGVkLiBUaGUgYmVsb3cgcHVsbHMgY29sdW1ucyBmcm9tIGEgZmlsZSBjYWxsZWQgbnlfbmV0d29ya19kYXRhLiBSZXBsYWNlICJueV9uZXR3b3JrX2RhdGEiIGZvciB3aGF0ZXZlciB5b3VyIGZpbGVuYW1lIGlzLiAkIGluZGljYXRlcyBhIGNhbGwgdG8gdGhlIGNvbHVtbnMgd2l0aGluIHRoYXQgZmlsZSBzdHJ1Y3R1cmUsIHlvdSBjYW4gZWRpdCB0aGlzIHRvIG1lZXQgeW91ciBvd24gY29sdW1uIG5hbWVzLiAKClIgY29kZSB0byBjcmVhdGUgZGF0YWZyYW1lOgpgYGB7ciBzYW1wbGVfY29kZSwgZWNobz1UUlVFIH0Kc2ltcGxlX25ldHdvcmsgPC0gZGF0YS5mcmFtZSgKICB0bz1ueV9uZXR3b3JrX2RhdGEkZnJvbSwKICBmcm9tPW55X25ldHdvcmtfZGF0YSR0bywKICBpZCA9IG55X25ldHdvcmtfZGF0YSRpZCwKICB0b19pbmR1c3RyeSA9IG55X25ldHdvcmtfZGF0YSRpbmR1c3RyeTIsCiAgZnJvbV9pbmR1c3RyeSA9IG55X25ldHdvcmtfZGF0YSRpbmR1c3RyeTEsCiAgdmFsdWUgPSBueV9uZXR3b3JrX2RhdGEkdmFsdWUsIAogIHRpdGxlID0gYXMuY2hhcmFjdGVyKG55X25ldHdvcmtfZGF0YSRpbmR1c3RyeTIpCikKYGBgCgojIyMjIyBGb3JtYXR0aW5nIHRoZSBkYXRhZnJhbWUgaW50byBhIG5ldHdvcmsgZ3JhcGguCgpUaGUgaWdyYXBoIGxpYnJhcnkgcHJvdmlkZXMgbXVsdGlwbGUgZnVuY3Rpb25zIHRoYXQgY29udmVydCBkYXRhZnJhbWVzIGFuZCBvdGhlciBkYXRhIHN0cnVjdHVyZXMgaW50byBhIGZvcm1hdCB0aGF0IGNhbiBiZSByZWFkIGJ5IG11bHRpcGxlIHBsb3R0aW5nIGZ1bmN0aW9ucyB3aXRoaW4gUi4gQmVsb3cgaXMgYW4gZXhhbXBsZSBzaG93aW5nIGhvdyB0byBydW4geW91ciBkZiB0aHJvdWdoIHRoZSBncmFwaF9mcm9tX2RhdGFfZnJhbWUgZnVuY3Rpb24uCgpgYGB7ciwgZWNobz0gVFJVRX0KZWRnZV9uZXR3b3JrIDwtIGdyYXBoX2Zyb21fZGF0YV9mcmFtZShkPXNpbXBsZV9uZXR3b3JrLCBkaXJlY3RlZD1GKSAKYGBgCgojIyMjIyBQbG90dGluZwoKT25jZSB5b3VyIGRhdGEgaXMgc3RydWN0dXJlZCBpbiBhIHdheSB0aGF0IGdyYXBoaW5nIGZ1bmN0aW9ucyBjYW4gcmVhZCBpdCwgeW91J3JlIHJlYWR5IHRvIHBsb3QuIFRoZXJlIGFyZSBtdWx0aXBsZSB0b29scyBhbmQgbGlicmFyaWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGxvdCBuZXR3b3JrcywgZWFjaCBvZiB0aGVtIGhhcyB0aGVpciBiZW5lZml0cyBhbmQgbGltaXRhdGlvbnMuIAoKVGhlIGJlbG93IHJlcHJlc2VudHMgdGhlIG1vc3QgYmFzaWMgKGFuZCBidWlsdC1pbiksIGJ1dCBwb3dlcmZ1bCB1c2Ugb2YgInBsb3QuIgpgYGB7ciwgZWNobz0gVFJVRX0KcGxvdChlZGdlX25ldHdvcmspCmBgYApgYGB7ciwgZWNobz0gVFJVRX0KcGxvdChlZGdlX25ldHdvcmspCmBgYAoKCgoKVGhlIGhhcmQgd29yayBpcyBkb25lLCB0aGUgcmVzdCBpcyBqdXN0IGZvcm1hdHRpbmcgYW5kIHN0cnVjdHVyaW5nIG9mIHRoZSBuZXR3b3JrIGRpYWdyYW0gdG8gbWFrZSBpdCBtb3JlIGVhc2lseSByZWFkYWJsZSBhbmQgdmFsdWFibGUgdG8gYSB2aWV3ZXIuIFVzaW5nIHRoZSBleHRyYSBjb2x1bW5zIGluIHlvdXIgZGYsIHlvdSBjYW4gc3RhcnQgdG8gcGxheSB3aXRoIHNpemVzIG9mIHRoZSBub3RlcywgbGVuZ3RoIG9mIGVkZ2VzLCBjb2xvcnMsIGFzIHdlbGwgYXMgbGFiZWxzIGFuZCB0aXRsZXMuIAoKQSBmdWxsIGxpc3Qgb2YgYWxsIHRoZSB3YXlzIHRvIGZvcm1hdCBhIHNpbXBsZSBuZXR3b3JrIGRpYWdyYW0gaXMgYXZhaWxhYmxle3J9IFtoZXJlLl0gKGh0dHBzOi8vd3d3LnJkb2N1bWVudGF0aW9uLm9yZy9wYWNrYWdlcy9uZXR3b3JrL3ZlcnNpb25zLzEuMTMuMC90b3BpY3MvcGxvdC5uZXR3b3JrLmRlZmF1bHQpLCBhbmQgbXVjaCBvZiB0aGUgZXhhbXBsZSBiZWxvdyBpcyBib3Jyb3cgZnJvbSB7cn0gW1lhbiBIb2x0ei5dIChodHRwczovL3d3dy5yLWdyYXBoLWdhbGxlcnkuY29tLzI1MC1jb3JyZWxhdGlvbi1uZXR3b3JrLXdpdGgtaWdyYXBoLmh0bWwpIAoKYGBge3IsIGVjaG89IFRSVUV9CnBsb3QoZWRnZV9uZXR3b3JrLCAKICAgICB2ZXJ0ZXguc2l6ZT1zaW1wbGVfbmV0d29yayR2YWx1ZSouNSwgICAgICAgICAgICMgTWFwcGluZyB0aGUgc2l6ZSBvZiB0aGUgbm9kZXMgdG8gdmFsdWUuCiAgICAgdmVydGV4LmNvbG9yPXNpbXBsZV9uZXR3b3JrJGZyb21faW5kdXN0cnksICAgICAjIE1hcHBpbmcgdGhlIGNvbG9yIG9mIHRoZSBub2RlcyB0byBpbmR1c3RyaWVzCiAgICAgdmVydGV4LmxhYmVsPSIgIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFBsYWNlaG9sZGVyIGJlZm9yZSBmaWd1cmluZyBvdXQgaG93IHRvIGhvdmVyLgogICAgIGxheW91dD1sYXlvdXQucmFuZG9tLCBtYWluPSJSYW5kb20iKSAgICAgICAgICAgIyBQbGF5aW5nIHdpdGggbGF5b3V0cyAocmFuZG9tLCBzcGhlcmUsIGV0Yy4pCgpgYGAKCiMjIyMjIFRvIHVwZGF0ZSB3aXRoIG1vcmUgZ3VpZGFuY2Ugc29vbiEK