Social Network Visualization: A History of Philosophy

Tl;dr: I made a map graphing “Influenced” and “Influenced By” relationships for all philosophers in Wikipedia.

I don’t know a lot about philosophy. As a political science major, I absorbed a lot of ideas that were obviously distilled from a variety of different influential philosophers, but outside of a (really, really great) summer seminar on Machiavelli to Montesquieu and a quarter on East Asian philosophy that I quite literally didn’t attend, I spent very little time actually pursuing philosophy and understanding different traditions. I just sort of cherry picked from here and there until I cobbled together a belief system that mostly made sense to me.

I’d like to change that and more rigorously explore my ideas, but I find the world of philosophy a bit impenetrable, and I don’t think I’m the only one. I know most the big names and have a basic sense of what a lot of them argued, but the works that they produced were made in a specific context, to address a specific conversation among the thinkers that preceded them and to which they were contemporary. It would be bordering on disrespect for me to try to jump in to any of them without a guide and act as though I’ve understood what is being said. So we need a map. What I imagined is something like a tree arranged down a timeline. More influential philosophers would be bigger nodes, and the size of the lines between the nodes would perhaps be variable by strength of influence. Of course strength of influence needs a metric, but we’ll get there. I know that Wikipedia pages for academics and thinkers tend to have a field for “Influenced by” and “Influenced”, and it struck me that we could use Wikipedia’s semantic companion dbpedia to build our little map.

Since this is a pretty intuitive idea, I figured some other enterprising data scientist would have done it, and sure enough I was correct. An unfortunately named guy named Simon Raper went ahead and put together something very similar to what I was imagining back in 2012. That chart is right here:

This is cool, no doubt, but not particularly useful. First of all, it’s a damn mess. Try to actually follow any of those lines between nodes and you find yourself in a weird little web of lines. Smaller philosophers don’t even show up, and we’re not getting any sense of chronology here. I want to be able to see not only who these people were influencing, but who was writing at the same time. If they exist in the same time and general area, but influenced different people, it’s reasonable to guess that their ideas compliment or contradict each other in ways that are important.

I thought we could fix this problem with something interactive. I aped Raper’s code to start and went to work using the SPARQL package.

## Loading required package: XML
## Loading required package: RCurl
## Loading required package: bitops
endpoint <- ""

query <- "SELECT *
?p a <> .
?p <> ?influenced.

d00ds <- SPARQL(endpoint, query)

philosophers <- d00ds$results
colnames(philosophers) <- c("From", "To")

philosophers$From <- gsub("<", "", philosophers$From)

philosophers$To <- gsub("<", "", philosophers$To)

philosophers$From <- gsub(">", "", philosophers$From)
philosophers$From <- gsub("_", " ", philosophers$From)

philosophers$To <- gsub(">", "", philosophers$To)
philosophers$To <- gsub("_", " ", philosophers$To)

From To
Giordano Bruno Molière
Giordano Bruno Arthur Schopenhauer
Giordano Bruno Baruch Spinoza
Giordano Bruno Gottfried Wilhelm Leibniz
Giordano Bruno James Joyce
Montesquieu David Hume

Et viola, a nice clean little table of influence and influencers. We also want to get a label for what type of philosophy a given philosopher worked in. This will help later for classification purposes. We can run that with another query:

endpoint <- ""

query <- "SELECT *
?p a <> .
?p <> ?era.

elements <- SPARQL(endpoint, query)

elements <- elements$results
colnames(elements) <- c("Label", "Type")

elements$Label <- gsub("<", "", elements$Label)

elements$Type <- gsub("<", "", elements$Type)

elements$Label <- gsub(">", "", elements$Label)
elements$Label <- gsub("_", " ", elements$Label)

elements$Type <- gsub(">", "", elements$Type)
elements$Type <- gsub("_", " ", elements$Type)
Label Type
Giordano Bruno Renaissance philosophy
Montesquieu Age of Enlightenment
Socrates Ancient philosophy
A. J. Ayer 20th-century philosophy
Adam Weishaupt Age of Enlightenment
Albert Camus 20th-century philosophy

Great. Write both of those as .csvs labeled “connections.csv” and “elements.csv” respectively. Now, we move to Kumu. Kumu is a neat little application that streamlines the process of making interactive network graphs. It’s a pretty powerful tool – if a little finicky – with a lot going on, so I’ll highlight what I think the most useful features are. Here’s the principle map:


Each node is one philosopher. Each line is a connection from an influencer to an influencee (?). The thickness of those connections is determined by the number of other philosophers for whom that philosopher is listed as an influence. That’s a lot of nonsense, so to make this simple: the more influential the philosopher, the thicker and more numerous the lines emanating from him. You can click on any one of these nodes to see which philosopher it represents. If you click and hold, it will display the network of philosophers he has been influenced by, and has influenced. Each line has an arrow at the end to denote the direction of the relationship.

Since it becomes a bit of a mess where people have more connections, I think one of the best ways to explore it is using the search bar, which is right here at the top. Let’s go for someone with a big impact, good ol’ Karl Marx.


If we search, he’ll be highlighted with this red circle. This can take a quick second because there’s a lot going on in the backend for this map, so just be a little patient and let it do it’s thing.


Click and hold the node and then hit the fit screen button and we get this nice little view here.


We can then build the network out to secondary and tertiary connections. If we click secondary, we’ll see the networks of the people Marx influenced.


And then if we select tertiary, we’ll see the networks of people in that network.


WHOA! THAT’S A BIG NETWORK! Another fun way to look at it is to pull up a philosopher’s network, let’s say David Hume this time:


Then click and hold on one of the philosophers in his network.


BAM! Now you see their network, and you can build out that way endlessly if you want to see the inheritance of a particular strain of thought.

Lastly, if we move over to settings, you can control which philosophers appear based on their type/era of philosophy per Wikipedia.


Simply select none and click the ones that you want to see.


The map has some weaknesses of course. Kumu does a poor job of rendering accents and foreign characters, so regrettably non-Latin alphabet philosophers are short thrifted. Doubly so, when you consider that an English language encyclopedia is going to have an inherent bias toward English speakers. Hopefully based on context you should be able to figure out who these people are with a little bit of google. It can be a little difficult to navigate the network without applying filters just because there are so many datapoints and because they are so interconnected, but ultimately I think that’s fine. The point of this exercise is to help identify non-obvious connections, so I’m willing to sacrifice a little bit of ease of use for data richness. Finally, older philosophers like Socrates and Aristotle have much smaller networks than one might imagine. I think this is simply because the people who created their article thought it would be unnecessary and nearly impossible to list all the philosophers that they influenced. While it’s a little different from what I initially imagined, I think it accomplishes exactly what I was looking to accomplish and is actually better in a lot of ways.


Looking forward, I’d like to explore scraping the introductory paragraph for each of these philosophers from their Wikipedia articles and automatically inputing it into the description on the map. An even more ambitious goal would be to scrape the body of each article, count the number of references to other philosophers in the dataset, and then scale the size of the influence arrows by those numbers. I have some more pressing projects for now but I will return to this later. In addition, this method is totally reproducible for any given field. Economists, historians, mathematicians, hell, musicians, painters and poets can be graphed similarly. Feel free to steal the method and code and do as you wish (attributions to me and Mr. Raper would be appreciated though!) Happy hunting!


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s