Visualizing Wikipedia article histories

Revision trees

Article histories are linear.

import graphviz
linear = graphviz.Digraph(graph_attr={'rankdir': 'LR'})
linear.node('t0')
linear.node('t1')
linear.node('t2')
linear.edges([
        ('t0', 't1'),
        ('t1', 't2')
    ])
linear

But in reality there are a lot of reversions.

reversions = graphviz.Digraph(
    graph_attr={'rankdir': 'LR'},
    node_attr={'style': 'filled', 'fontcolor': 'white'},
)
reversions.node('t0', label='v0', color='#66c2a5')
reversions.node('t1', label='v1', color='#fc8d62')
reversions.node('t2', label='v2', color='#8da0cb')
reversions.node('t3', label='v1', color='#fc8d62')
reversions.edges([
        ('t0', 't1'),
        ('t1', 't2'),
        ('t2', 't3'),
    ])
reversions

A better way to show article histories is as a tree.

full_tree = graphviz.Digraph(
    graph_attr={'rankdir': 'LR'},
    node_attr={'style': 'filled', 'fontcolor': 'white'},
)
full_tree.node('v0', color='#66c2a5')
full_tree.node('v1')
full_tree.node('v2', color='#fc8d62')
full_tree.node('v3', color='#8da0cb')
full_tree.node('v4')
full_tree.node('v5')
full_tree.node('v6', color='#e78ac3')
full_tree.node('v7', color='#a6d854')

full_tree.edges([
        ('v0', 'v1'),
        ('v1', 'v0'),
        ('v0', 'v2'),
        ('v2', 'v3'),
        ('v3', 'v4'),
        ('v4', 'v3'),
        ('v3', 'v5'),
        ('v5', 'v3'),
        ('v3', 'v6'),
        ('v6', 'v7'),
    ])
full_tree

What does a real Wikipedia article look like?

To draw a real revision tree, first we need to get all of the revisions to an article.

import wikivision
revisions = wikivision.get_article_revisions('splendid_fairywren')
revisions.head(n=4)
rev_id parent_id timestamp wikitext rev_sha1 parent_sha1 rev_version parent_version rev_type
0 129420980 0 2007-05-09 02:59:16 {{Taxobox\n| color = pink\n| name = Splendid F... 0860c6aa51c866f79dcc1e54ec994f09c01b37bf False 0 NaN root
1 129422530 129420980 2007-05-09 03:07:36 {{Taxobox\n| color = pink\n| name = Splendid F... f21f402dd42b893f8301f22cf51063afe8f65e48 0860c6aa51c866f79dcc1e54ec994f09c01b37bf 1 0 branch
2 129539246 129422530 2007-05-09 15:41:56 {{Taxobox\n| color = pink\n| name = Splendid F... 552a572722c7527358db0a7274fe61ef759306e1 f21f402dd42b893f8301f22cf51063afe8f65e48 2 1 branch
3 129712279 129539246 2007-05-10 02:21:32 {{Taxobox\n| color = pink\n| name = Splendid F... 833667d437fbe3b2f7aefc538a6acdc9f0b33f5a 552a572722c7527358db0a7274fe61ef759306e1 3 2 branch
splendid_fairywren = wikivision.graph_article_revisions('splendid_fairywren')
splendid_fairywren
deepmind = wikivision.graph_article_revisions('Google_DeepMind')
deepmind
shepseskare = wikivision.graph_article_revisions('Shepseskare')
shepseskare

What do edit wars look like?

Wikipedia’s lamest edit wars.

preteen = wikivision.graph_article_revisions('Preadolescence')
preteen
street_fighter = wikivision.graph_article_revisions('Balrog_(Street_Fighter)')
street_fighter

Counting edits

This is how edits should be counted.

simple = graphviz.Graph(
    graph_attr={'rankdir': 'LR'},
    node_attr={'style': 'filled', 'fontcolor': 'white'},
)
simple.node('v0', label='1', color='#66c2a5')
simple.node('v1', label='')
simple.node('v2', label='2', color='#fc8d62')
simple.node('v3', label='3', color='#8da0cb')
simple.node('v4', label='')
simple.node('v5', label='')
simple.node('v6', label='4', color='#e78ac3')
simple.node('v7', label='5', color='#a6d854')

simple.edges([
        ('v0', 'v1'),
        ('v0', 'v2'),
        ('v2', 'v3'),
        ('v3', 'v4'),
        ('v3', 'v5'),
        ('v3', 'v6'),
        ('v6', 'v7'),
    ])
simple
shepseskare = wikivision.graph_article_revisions('Shepseskare', highlight=True)
shepseskare
preteen = wikivision.graph_article_revisions('Preadolescence', highlight=True)
preteen
preteen.render('visualizing-article-histories-files/preteen.gv')
shepseskare.render('visualizing-article-histories-files/shepseskare.gv')
'visualizing-article-histories-files/shepseskare.gv.pdf'