We finally got the alpha release of the new tsna package up on CRAN! The goal is for the package to be a repository of algorithms and techniques for doing Social Network Analysis on longitudinal networks stored as networkDynamic objects. It includes:
The package vignette has lots more details.
As a quick example, the code below extracts a forward temporal path (think “what is the earliest journey a message could take from vertex 10 to each vertex in the network while respecting edge timing”) and plots it as a transmission tree, including the transmission time for each edge:
# load the libraries
# load a dynamic network example
# compute the forward temporal path from vertex 10 at time 0
# plotting trees still a little complicated,
# but with Graphviz and ndtv we can do it
layout.par = list(gv.engine='dot')),
main='earliest fwd path transmission times from vertex 10')
Ran into this on a friend’s bookshelf a while back. Great advice. I think that
“Thou shalt not spread false information. Thou shalt not pervert information to enhance profit or status.”
“Do not exchange your best understanding of how things work for cheap social consensus.”
are particularly relevant guidelines for people working in information design. Should there be a Hippocratic Oath for data visualization? :-)
By default you can
- play forwards and backwards, jump to any point in the timeline
- zoom (mousewheel or pinch)
- pan (drag)
- display tooltips (click on a vertex or edge)
- highlight connections (double-click a vertex)
- change the playback speed (menu in upper right)
The example above can be produced in your local web browser with the R code below:
Much of it is customizable. If you want to get under the hood, I’ve created a short vignette for ndtv-d3 with additional details on how to configure the the network plot (it generally follows the conventions of
render.animation) and how to include the results rmarkdown documents or export for embedding in a blog post like this one.
There are a number of updates and improvements elsewhere in the package. For example, the
proximity.timeline function can now color by vertex attributes.
This image shows a trivial simulated epidemic process on a dynamic network produced by EpiModel. Horizontal splines correspond to the vertices of the network, with red color indicating infection status. The vertical positions are adjust to place closely-connected vertices in proximity, so you can see how the components group and break apart over time. The network snapshots below the timeline illustrate three time points for comparison. See the package vignette for example code.
If you will be at the 2015 INSNA conference, we will be doing a workshop session on Tuesday June 23 with in-depth tutorials of the package.
In which I make timelines and network diagrams to illustrate relationships in a web soap opera. (This is what happens when a data geek watches YouTube with his wife :-)
Quite fittingly, a friend shared an article with interesting network images showing the extremely divided semantic and social spaces with respect to the war on Gaza.
The network images in the article were apparently constructed from Facebook, Instagram, and Twitter data. Many of the images look like they were made with Gephi, but unfortunately the author doesn’t give sources for them.
While I think much of the semantic separation and “micro-propaganda” discussed in the article pre-dates social media, it is good to remember that our perception of events is increasingly filtered through our network of friends and amplified by story selection algorithms controlled by others. And it is perhaps comforting to see in these images some explanation for why otherwise seemingly sensible people can hold such shockingly different viewpoints: we are likely building our understanding of events from completely different sets of “facts” and narratives.
The folks at LittleSis (the opposite of Big Brother) have just released a nice tool for creating “powermaps” using the relationships between entities in their database. Powermaps are an informal term for a type of network graph illustrating various types of relationships between (often multiple types) of people or institutions
The maps are quite lovely, built as zoomable SVG objects embedded in the webpage with elegant highlighting and mouse-over label reveals. The entities on screen supporting clicking through to the corresponding page in the LittleSis database. From peeking at the Oiligrapher source code on github it appears that the tool makes heavy use of d3 (of course) and some of the force-directed network layout code. They cite Mark Lombardi as a strong influence for the visual aesthetic. Not sure about speed/performance issues on larger networks, but this seems like a great tool for these types of relatively sparse illustrations.
ProPublica published an interesting example of a hand-drawn sociogram / mind-map of the relationships of a person of interested to the former East German secret police.
The graphic shows forty-six connections, linking a target to various people (an “aunt,” “Operational Case Jentzsch,” presumably Bernd Jentzsch, an East German poet who defected to the West in 1976), places (“church”), and meetings (“by post, by phone, meeting in Hungary”).
The article links to a version of the document that provides english translations on mouseover.
Reminds me of similar diagrams I’ve seen in police files related to Black Panther activists.
I had several conversations at the INSNA conference that made me realize it might helpful to blog some really short examples of lesser-known features and hard-to-remember tricks for the R packages network, networkDynamic, statnet, etc.
Finally got the update to the R dynamic network visualization package ndtv 0.5.1 out the door and up on CRAN. This is part of the yearly flurry of statnet package releases (we also posted new versions of network, networkDynamic, ergm, etc, over the last week) in preparation for running workshops at the INSNA Sunbelt social network analysis conference. This year will be a first for me, we will be running a pre-conference ndtv workshop on 2/18/14, so I’ve been working to pull tutorial materials together.
One of the new experimental features in this release is a “proximity.timeline” function, a first stab at doing relationship timelines. The horizontal axis is simulation timesteps and the vertical dimension is geodesic proximity collapsed to 1D. Below is a proximity.timeline plot for the short.stergm.sim example object, showing a changing component with four isolates which eventually breaks into two components around time 20.
While trawling for interesting dynamic network datasets, I bumped into one about U.S. airport passenger traffic aggregated by Zachary Neal.. I lifted this image from his slides (p.9):
These data contain annual U.S. air traffic flow networks from 1993 to 2011. They were constructed from Bureau of Transportation Statistics’ Origin and Destination Surveys using the AIRNET program
What I thought was cool is that he constructs the network in two ways: one is the passenger flow between specific airports, the other is total passenger movement between metropolitan areas (if I’m reading his data correctly). He claims the first approach yields a hub-spoke network driven by airline hubs, while the second highlights travel between dense population areas. Both are derived from the same data. I think it shows how important it is to think carefully about how to construct networks that correspond well to the phenomena being studied. Are we interested in relative traffic between cities, or in the the actual flow of people (via roads, airports) between the cities? In hindsight, its obvious that these are very different networks (the first one for example should be nearly fully connected, right?).
I’m assuming that there is some thresholding going on in these images, ’cause the dataset he provides seems to have lots more edges in it.