library(tidyverse)
library(DT)
library(igraph)
library(rtweet)
library(visNetwork)
library(graphTweets) # This package turns twitter data into edge & node data
- Get the last couple hundred tweets from each member of the list.
governors <- lists_members(slug = "us-governors", owner_user = "TwitterGov")
governors_tweets <- get_timeline(cabinet$screen_name, n = 300)
Here I got the last 300 tweets from each member.
- Decide on whether you want to create a network of retweets or mentions, and create the network.
# This creates the network with some commands from graphTweets
# The variables in the parentheses of gt_edges() are used, so in this case we're using retweets
# We're also keeping text of the tweets
governors_retweets_network <- governors_tweets %>%
gt_edges(screen_name, retweet_screen_name, text) %>%
gt_graph()
# This next line gets the nodes
governors_retweets_nodes <- as_data_frame(governors_retweets_network, what = "vertices")
# This adds some additional info to the nodes, so we get the names on hover
# and the size of the node is based on its degree, etc.
governors_retweets_nodes <- governors_retweets_nodes %>%
mutate(id = name) %>%
mutate(label = name) %>%
mutate(title = name) %>%
mutate(degree = degree(governors_retweets_network)) %>%
mutate(value = degree)
# This gets the edges, similar to how we got the nodes above
governors_retweets_edges <- as_data_frame(governors_retweets_network, what = "edges")
# This puts the text of the tweet itself into the edge
# so when you hover over a line in the diagram it will show the tweet
governors_retweets_edges <- governors_retweets_edges %>%
mutate(title = text)
# Creates the diagram
visNetwork(governors_retweets_nodes, governors_retweets_edges, main = "Retweet network of US governors") %>%
visIgraphLayout(layout = "layout_nicely") %>%
visEdges(arrows = "to")
This is the network showing of US governor’s retweets.
- Get a count of nodes and edges, and get the density of the network.
governors_retweets_network %>%
vcount()
[1] 6
This is the number of nodes.
governors_retweets_network%>%
ecount()
[1] 4
This is the number of edges.
governors_retweets_network%>%
edge_density()
[1] 0.1333333
This is the edge density.
- Create a data table of the list members, showing only their names and degree.
governors_retweets_nodes%>%
select(name, degree)%>%
datatable()
This is a datatable showing retweets just by name and degree.
- Find communities and make a network diagram showing the communities. (You may make two diagrams, one with the communities and one without.)
governors_retweets_nodes <- governors_retweets_nodes %>%
mutate(group = membership(infomap.community(governors_retweets_network)))
Modularity is implemented for undirected graphs only.
visNetwork(governors_retweets_nodes, governors_retweets_edges, main = "US governors retweet network") %>%
visIgraphLayout(layout = "layout_nicely") %>%
visEdges(arrows = "to") %>%
visOptions(highlightNearest = T, nodesIdSelection = T, selectedBy = "group")
NA
NA
Here is a network diagram showing the communities.
# This creates the network with some commands from graphTweets
# The variables in the parentheses of gt_edges() are used, so in this case we're using retweets
governors_retweets_network <- governors_tweets %>%
filter(retweet_screen_name %in% governors$screen_name) %>% # <- This is a new line and important.
gt_edges(screen_name, retweet_screen_name, text) %>% # It only keep retweets of other cabinet members
gt_graph()
# This next line gets the nodes
governors_retweets_nodes <- as_data_frame(governors_retweets_network, what = "vertices")
# This adds some additional info to the nodes, so we get the names on hover
# and the size of the node is based on its degree, etc.
governors_retweets_nodes <- governors_retweets_nodes %>%
mutate(id = name) %>%
mutate(label = name) %>%
mutate(title = name) %>%
mutate(degree = degree(governors_retweets_network)) %>%
mutate(value = degree)
# This gets the edges, similar to how we got the nodes above
governors_retweets_edges <- as_data_frame(governors_retweets_network, what = "edges")
# This puts the text of the tweet itself into the edge
# so when you hover over a line in the diagram it will show the tweet
governors_retweets_edges <- governors_retweets_edges %>%
mutate(title = text)
# Creates the diagram
visNetwork(governors_retweets_nodes, governors_retweets_edges, main = "US governors retweet network") %>%
visIgraphLayout(layout = "layout_nicely") %>%
visEdges(arrows = "to")
Here is a network diagram without communities.
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShEVCkKbGlicmFyeShpZ3JhcGgpCmxpYnJhcnkocnR3ZWV0KQpsaWJyYXJ5KHZpc05ldHdvcmspCmxpYnJhcnkoZ3JhcGhUd2VldHMpICAgICAgICAgICAgIyBUaGlzIHBhY2thZ2UgdHVybnMgdHdpdHRlciBkYXRhIGludG8gZWRnZSAmIG5vZGUgZGF0YQoKYGBgCgoKMS4gR2V0IHRoZSBsYXN0IGNvdXBsZSBodW5kcmVkIHR3ZWV0cyBmcm9tIGVhY2ggbWVtYmVyIG9mIHRoZSBsaXN0LiAgCgpgYGB7cn0KZ292ZXJub3JzIDwtIGxpc3RzX21lbWJlcnMoc2x1ZyA9ICJ1cy1nb3Zlcm5vcnMiLCBvd25lcl91c2VyID0gIlR3aXR0ZXJHb3YiKQoKZ292ZXJub3JzX3R3ZWV0cyA8LSBnZXRfdGltZWxpbmUoY2FiaW5ldCRzY3JlZW5fbmFtZSwgbiA9IDMwMCkKCmBgYAoKSGVyZSBJIGdvdCB0aGUgbGFzdCAzMDAgdHdlZXRzIGZyb20gZWFjaCBtZW1iZXIuCgoKCgoyLiBEZWNpZGUgb24gd2hldGhlciB5b3Ugd2FudCB0byBjcmVhdGUgYSBuZXR3b3JrIG9mIHJldHdlZXRzIG9yIG1lbnRpb25zLCBhbmQgY3JlYXRlIHRoZSBuZXR3b3JrLgoKYGBge3J9CiMgVGhpcyBjcmVhdGVzIHRoZSBuZXR3b3JrIHdpdGggc29tZSBjb21tYW5kcyBmcm9tIGdyYXBoVHdlZXRzCiMgVGhlIHZhcmlhYmxlcyBpbiB0aGUgcGFyZW50aGVzZXMgb2YgZ3RfZWRnZXMoKSBhcmUgdXNlZCwgc28gaW4gdGhpcyBjYXNlIHdlJ3JlIHVzaW5nIHJldHdlZXRzCiMgV2UncmUgYWxzbyBrZWVwaW5nIHRleHQgb2YgdGhlIHR3ZWV0cwpnb3Zlcm5vcnNfcmV0d2VldHNfbmV0d29yayA8LSBnb3Zlcm5vcnNfdHdlZXRzICU+JSAKICBndF9lZGdlcyhzY3JlZW5fbmFtZSwgcmV0d2VldF9zY3JlZW5fbmFtZSwgdGV4dCkgJT4lIAogIGd0X2dyYXBoKCkKCgojIFRoaXMgbmV4dCBsaW5lIGdldHMgdGhlIG5vZGVzCmdvdmVybm9yc19yZXR3ZWV0c19ub2RlcyA8LSBhc19kYXRhX2ZyYW1lKGdvdmVybm9yc19yZXR3ZWV0c19uZXR3b3JrLCB3aGF0ID0gInZlcnRpY2VzIikKCiMgVGhpcyBhZGRzIHNvbWUgYWRkaXRpb25hbCBpbmZvIHRvIHRoZSBub2Rlcywgc28gd2UgZ2V0IHRoZSBuYW1lcyBvbiBob3ZlcgojIGFuZCB0aGUgc2l6ZSBvZiB0aGUgbm9kZSBpcyBiYXNlZCBvbiBpdHMgZGVncmVlLCBldGMuCmdvdmVybm9yc19yZXR3ZWV0c19ub2RlcyA8LSBnb3Zlcm5vcnNfcmV0d2VldHNfbm9kZXMgJT4lIAogIG11dGF0ZShpZCA9IG5hbWUpICU+JSAKICBtdXRhdGUobGFiZWwgPSBuYW1lKSAlPiUgCiAgbXV0YXRlKHRpdGxlID0gbmFtZSkgJT4lIAogIG11dGF0ZShkZWdyZWUgPSBkZWdyZWUoZ292ZXJub3JzX3JldHdlZXRzX25ldHdvcmspKSAlPiUgCiAgbXV0YXRlKHZhbHVlID0gZGVncmVlKQoKIyBUaGlzIGdldHMgdGhlIGVkZ2VzLCBzaW1pbGFyIHRvIGhvdyB3ZSBnb3QgdGhlIG5vZGVzIGFib3ZlCmdvdmVybm9yc19yZXR3ZWV0c19lZGdlcyA8LSBhc19kYXRhX2ZyYW1lKGdvdmVybm9yc19yZXR3ZWV0c19uZXR3b3JrLCB3aGF0ID0gImVkZ2VzIikKCiMgVGhpcyBwdXRzIHRoZSB0ZXh0IG9mIHRoZSB0d2VldCBpdHNlbGYgaW50byB0aGUgZWRnZQojIHNvIHdoZW4geW91IGhvdmVyIG92ZXIgYSBsaW5lIGluIHRoZSBkaWFncmFtIGl0IHdpbGwgc2hvdyB0aGUgdHdlZXQKZ292ZXJub3JzX3JldHdlZXRzX2VkZ2VzIDwtIGdvdmVybm9yc19yZXR3ZWV0c19lZGdlcyAlPiUgCiAgbXV0YXRlKHRpdGxlID0gdGV4dCkKCiMgQ3JlYXRlcyB0aGUgZGlhZ3JhbQp2aXNOZXR3b3JrKGdvdmVybm9yc19yZXR3ZWV0c19ub2RlcywgZ292ZXJub3JzX3JldHdlZXRzX2VkZ2VzLCBtYWluID0gIlJldHdlZXQgbmV0d29yayBvZiBVUyBnb3Zlcm5vcnMiKSAlPiUgCiAgdmlzSWdyYXBoTGF5b3V0KGxheW91dCA9ICJsYXlvdXRfbmljZWx5IikgJT4lIAogIHZpc0VkZ2VzKGFycm93cyA9ICJ0byIpCmBgYAoKVGhpcyBpcyB0aGUgbmV0d29yayBzaG93aW5nIG9mIFVTIGdvdmVybm9yJ3MgcmV0d2VldHMuCgoKCjMuIEdldCBhIGNvdW50IG9mIG5vZGVzIGFuZCBlZGdlcywgYW5kIGdldCB0aGUgZGVuc2l0eSBvZiB0aGUgbmV0d29yay4gIAoKYGBge3J9CmdvdmVybm9yc19yZXR3ZWV0c19uZXR3b3JrICU+JSAKICB2Y291bnQoKQpgYGAKClRoaXMgaXMgdGhlIG51bWJlciBvZiBub2Rlcy4KCmBgYHtyfQpnb3Zlcm5vcnNfcmV0d2VldHNfbmV0d29yayU+JQogIGVjb3VudCgpCmBgYAoKVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGVkZ2VzLiAKCmBgYHtyfQpnb3Zlcm5vcnNfcmV0d2VldHNfbmV0d29yayU+JQogIGVkZ2VfZGVuc2l0eSgpCmBgYAoKVGhpcyBpcyB0aGUgZWRnZSBkZW5zaXR5LgoKCgoKNC4gQ3JlYXRlIGEgZGF0YSB0YWJsZSBvZiB0aGUgbGlzdCBtZW1iZXJzLCBzaG93aW5nIG9ubHkgdGhlaXIgbmFtZXMgYW5kIGRlZ3JlZS4gIAoKYGBge3J9CmdvdmVybm9yc19yZXR3ZWV0c19ub2RlcyU+JQogIHNlbGVjdChuYW1lLCBkZWdyZWUpJT4lCiAgZGF0YXRhYmxlKCkKYGBgCgpUaGlzIGlzIGEgZGF0YXRhYmxlIHNob3dpbmcgcmV0d2VldHMganVzdCBieSBuYW1lIGFuZCBkZWdyZWUuCgoKCgoKNS4gRmluZCBjb21tdW5pdGllcyBhbmQgbWFrZSBhIG5ldHdvcmsgZGlhZ3JhbSBzaG93aW5nIHRoZSBjb21tdW5pdGllcy4gKFlvdSBtYXkgbWFrZSB0d28gZGlhZ3JhbXMsIG9uZSB3aXRoIHRoZSBjb21tdW5pdGllcyBhbmQgb25lIHdpdGhvdXQuKQoKYGBge3J9CmdvdmVybm9yc19yZXR3ZWV0c19ub2RlcyA8LSBnb3Zlcm5vcnNfcmV0d2VldHNfbm9kZXMgJT4lIAogIG11dGF0ZShncm91cCA9IG1lbWJlcnNoaXAoaW5mb21hcC5jb21tdW5pdHkoZ292ZXJub3JzX3JldHdlZXRzX25ldHdvcmspKSkKCnZpc05ldHdvcmsoZ292ZXJub3JzX3JldHdlZXRzX25vZGVzLCBnb3Zlcm5vcnNfcmV0d2VldHNfZWRnZXMsIG1haW4gPSAiVVMgZ292ZXJub3JzIHJldHdlZXQgbmV0d29yayIpICU+JSAKICB2aXNJZ3JhcGhMYXlvdXQobGF5b3V0ID0gImxheW91dF9uaWNlbHkiKSAlPiUgCiAgdmlzRWRnZXMoYXJyb3dzID0gInRvIikgJT4lICAgCiAgdmlzT3B0aW9ucyhoaWdobGlnaHROZWFyZXN0ID0gVCwgbm9kZXNJZFNlbGVjdGlvbiA9IFQsIHNlbGVjdGVkQnkgPSAiZ3JvdXAiKQoKCmBgYAoKSGVyZSBpcyBhIG5ldHdvcmsgZGlhZ3JhbSBzaG93aW5nIHRoZSBjb21tdW5pdGllcy4gCgpgYGB7cn0KIyBUaGlzIGNyZWF0ZXMgdGhlIG5ldHdvcmsgd2l0aCBzb21lIGNvbW1hbmRzIGZyb20gZ3JhcGhUd2VldHMKIyBUaGUgdmFyaWFibGVzIGluIHRoZSBwYXJlbnRoZXNlcyBvZiBndF9lZGdlcygpIGFyZSB1c2VkLCBzbyBpbiB0aGlzIGNhc2Ugd2UncmUgdXNpbmcgcmV0d2VldHMKZ292ZXJub3JzX3JldHdlZXRzX25ldHdvcmsgPC0gZ292ZXJub3JzX3R3ZWV0cyAlPiUgCiAgZmlsdGVyKHJldHdlZXRfc2NyZWVuX25hbWUgJWluJSBnb3Zlcm5vcnMkc2NyZWVuX25hbWUpICU+JSAgICAgIyA8LSBUaGlzIGlzIGEgbmV3IGxpbmUgYW5kIGltcG9ydGFudC4KICBndF9lZGdlcyhzY3JlZW5fbmFtZSwgcmV0d2VldF9zY3JlZW5fbmFtZSwgdGV4dCkgJT4lICAgICAgICAgICAgICMgSXQgb25seSBrZWVwIHJldHdlZXRzIG9mIG90aGVyIGNhYmluZXQgbWVtYmVycwogIGd0X2dyYXBoKCkKCgojIFRoaXMgbmV4dCBsaW5lIGdldHMgdGhlIG5vZGVzCmdvdmVybm9yc19yZXR3ZWV0c19ub2RlcyA8LSBhc19kYXRhX2ZyYW1lKGdvdmVybm9yc19yZXR3ZWV0c19uZXR3b3JrLCB3aGF0ID0gInZlcnRpY2VzIikKCiMgVGhpcyBhZGRzIHNvbWUgYWRkaXRpb25hbCBpbmZvIHRvIHRoZSBub2Rlcywgc28gd2UgZ2V0IHRoZSBuYW1lcyBvbiBob3ZlcgojIGFuZCB0aGUgc2l6ZSBvZiB0aGUgbm9kZSBpcyBiYXNlZCBvbiBpdHMgZGVncmVlLCBldGMuCmdvdmVybm9yc19yZXR3ZWV0c19ub2RlcyA8LSBnb3Zlcm5vcnNfcmV0d2VldHNfbm9kZXMgJT4lIAogIG11dGF0ZShpZCA9IG5hbWUpICU+JSAKICBtdXRhdGUobGFiZWwgPSBuYW1lKSAlPiUgCiAgbXV0YXRlKHRpdGxlID0gbmFtZSkgJT4lIAogIG11dGF0ZShkZWdyZWUgPSBkZWdyZWUoZ292ZXJub3JzX3JldHdlZXRzX25ldHdvcmspKSAlPiUgCiAgbXV0YXRlKHZhbHVlID0gZGVncmVlKQoKIyBUaGlzIGdldHMgdGhlIGVkZ2VzLCBzaW1pbGFyIHRvIGhvdyB3ZSBnb3QgdGhlIG5vZGVzIGFib3ZlCmdvdmVybm9yc19yZXR3ZWV0c19lZGdlcyA8LSBhc19kYXRhX2ZyYW1lKGdvdmVybm9yc19yZXR3ZWV0c19uZXR3b3JrLCB3aGF0ID0gImVkZ2VzIikKCiMgVGhpcyBwdXRzIHRoZSB0ZXh0IG9mIHRoZSB0d2VldCBpdHNlbGYgaW50byB0aGUgZWRnZQojIHNvIHdoZW4geW91IGhvdmVyIG92ZXIgYSBsaW5lIGluIHRoZSBkaWFncmFtIGl0IHdpbGwgc2hvdyB0aGUgdHdlZXQKZ292ZXJub3JzX3JldHdlZXRzX2VkZ2VzIDwtIGdvdmVybm9yc19yZXR3ZWV0c19lZGdlcyAlPiUgCiAgbXV0YXRlKHRpdGxlID0gdGV4dCkKCiMgQ3JlYXRlcyB0aGUgZGlhZ3JhbQp2aXNOZXR3b3JrKGdvdmVybm9yc19yZXR3ZWV0c19ub2RlcywgZ292ZXJub3JzX3JldHdlZXRzX2VkZ2VzLCBtYWluID0gIlVTIGdvdmVybm9ycyByZXR3ZWV0IG5ldHdvcmsiKSAlPiUgCiAgdmlzSWdyYXBoTGF5b3V0KGxheW91dCA9ICJsYXlvdXRfbmljZWx5IikgJT4lIAogIHZpc0VkZ2VzKGFycm93cyA9ICJ0byIpCmBgYAoKSGVyZSBpcyBhIG5ldHdvcmsgZGlhZ3JhbSB3aXRob3V0IGNvbW11bml0aWVzLgoKCgoKCgoKCgoKCgoKCgoKCgo=