This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.
library(tidyverse)
library(DT)
library(igraph)
library(rtweet)
library(visNetwork)
library(graphTweets) # This package turns twitter data into edge & node data
token <- create_token(
app = "",
consumer_key = "",
consumer_secret = "",
access_token = "",
access_secret = "")
get_token("") # this shows the token. make sure key is the same as consumer_key above
- First, gather the last 200 tweets from senators.
senate <- lists_members(slug = "us-senate", owner_user = "TwitterGov")
senate_tweets <- get_timeline(senate$screen_name, n = 200)
- Next, create a network of senator retweets and create a diagram.
senate_retweets_network <- senate_tweets %>%
filter(retweet_screen_name %in% senate$screen_name) %>% # <- This is a new line and important.
gt_edges(screen_name, retweet_screen_name, text) %>% # It only keep retweets of other senate members
gt_graph()
# This next line gets the nodes
senate_retweets_nodes <- as_data_frame(senate_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.
senate_retweets_nodes <- senate_retweets_nodes %>%
mutate(id = name) %>%
mutate(label = name) %>%
mutate(title = name) %>%
mutate(degree = degree(senate_retweets_network)) %>%
mutate(value = degree)
# This gets the edges, similar to how we got the nodes above
senate_retweets_edges <- as_data_frame(senate_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
senate_retweets_edges <- senate_retweets_edges %>%
mutate(title = text)
# Creates the diagram
visNetwork(senate_retweets_nodes, senate_retweets_edges, main = "US senate
retweet network") %>%
visIgraphLayout(layout = "layout_nicely") %>%
visEdges(arrows = "to")
- Find the edges, nodes, and density of the senate retweet network.
senate_retweets_network %>%
vcount()
[1] 164
senate_retweets_network %>%
ecount()
[1] 736
senate_retweets_network %>%
edge_density()
[1] 0.02753255
- Create a datatable that only shows the name and degree of the senators. Then, I placed it in descending order by degree.
senate_retweets_nodes %>%
select(name, degree) %>%
datatable()
- Finally, find the communities within the network, and create an iGraph.
senate_retweets_nodes <- senate_retweets_nodes %>%
mutate(group = membership(infomap.community(senate_retweets_network)))
Modularity is implemented for undirected graphs only.
visNetwork(senate_retweets_nodes, senate_retweets_edges, main = "US senate retweet network") %>%
visIgraphLayout(layout = "layout_nicely") %>%
visEdges(arrows = "to") %>%
visOptions(highlightNearest = T, nodesIdSelection = T, selectedBy = "group")
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoRFQpCmxpYnJhcnkoaWdyYXBoKQpsaWJyYXJ5KHJ0d2VldCkKbGlicmFyeSh2aXNOZXR3b3JrKQpsaWJyYXJ5KGdyYXBoVHdlZXRzKSAgICAgICAgICAgICMgVGhpcyBwYWNrYWdlIHR1cm5zIHR3aXR0ZXIgZGF0YSBpbnRvIGVkZ2UgJiBub2RlIGRhdGEKCmBgYAoKYGBge3J9CnRva2VuIDwtIGNyZWF0ZV90b2tlbigKICBhcHAgPSAiIiwKICBjb25zdW1lcl9rZXkgPSAiIiwKICBjb25zdW1lcl9zZWNyZXQgPSAiIiwKICBhY2Nlc3NfdG9rZW4gPSAiIiwKICBhY2Nlc3Nfc2VjcmV0ID0gIiIpCgpnZXRfdG9rZW4oIiIpICAgICAgICAjIHRoaXMgc2hvd3MgdGhlIHRva2VuLiBtYWtlIHN1cmUga2V5IGlzIHRoZSBzYW1lIGFzIGNvbnN1bWVyX2tleSBhYm92ZQpgYGAKCjEuIEZpcnN0LCBnYXRoZXIgdGhlIGxhc3QgMjAwIHR3ZWV0cyBmcm9tIHNlbmF0b3JzLgoKYGBge3J9CnNlbmF0ZSA8LSBsaXN0c19tZW1iZXJzKHNsdWcgPSAidXMtc2VuYXRlIiwgb3duZXJfdXNlciA9ICJUd2l0dGVyR292IikKCnNlbmF0ZV90d2VldHMgPC0gZ2V0X3RpbWVsaW5lKHNlbmF0ZSRzY3JlZW5fbmFtZSwgbiA9IDIwMCkKCmBgYAoKMi4gTmV4dCwgY3JlYXRlIGEgbmV0d29yayBvZiBzZW5hdG9yIHJldHdlZXRzIGFuZCBjcmVhdGUgYSBkaWFncmFtLgoKYGBge3J9CnNlbmF0ZV9yZXR3ZWV0c19uZXR3b3JrIDwtIHNlbmF0ZV90d2VldHMgJT4lIAogIGZpbHRlcihyZXR3ZWV0X3NjcmVlbl9uYW1lICVpbiUgc2VuYXRlJHNjcmVlbl9uYW1lKSAlPiUgICAgIAogIGd0X2VkZ2VzKHNjcmVlbl9uYW1lLCByZXR3ZWV0X3NjcmVlbl9uYW1lLCB0ZXh0KSAlPiUgICAgICAgICAgICAgCiAgZ3RfZ3JhcGgoKQoKCgpzZW5hdGVfcmV0d2VldHNfbm9kZXMgPC0gYXNfZGF0YV9mcmFtZShzZW5hdGVfcmV0d2VldHNfbmV0d29yaywgd2hhdCA9ICJ2ZXJ0aWNlcyIpCgoKc2VuYXRlX3JldHdlZXRzX25vZGVzIDwtIHNlbmF0ZV9yZXR3ZWV0c19ub2RlcyAlPiUgCiAgbXV0YXRlKGlkID0gbmFtZSkgJT4lIAogIG11dGF0ZShsYWJlbCA9IG5hbWUpICU+JSAKICBtdXRhdGUodGl0bGUgPSBuYW1lKSAlPiUgCiAgbXV0YXRlKGRlZ3JlZSA9IGRlZ3JlZShzZW5hdGVfcmV0d2VldHNfbmV0d29yaykpICU+JSAKICBtdXRhdGUodmFsdWUgPSBkZWdyZWUpCgoKc2VuYXRlX3JldHdlZXRzX2VkZ2VzIDwtIGFzX2RhdGFfZnJhbWUoc2VuYXRlX3JldHdlZXRzX25ldHdvcmssIHdoYXQgPSAiZWRnZXMiKQoKCnNlbmF0ZV9yZXR3ZWV0c19lZGdlcyA8LSBzZW5hdGVfcmV0d2VldHNfZWRnZXMgJT4lIAogIG11dGF0ZSh0aXRsZSA9IHRleHQpCgoKdmlzTmV0d29yayhzZW5hdGVfcmV0d2VldHNfbm9kZXMsIHNlbmF0ZV9yZXR3ZWV0c19lZGdlcywgbWFpbiA9ICJVUyBzZW5hdGUgCnJldHdlZXQgbmV0d29yayIpICU+JSAKICB2aXNJZ3JhcGhMYXlvdXQobGF5b3V0ID0gImxheW91dF9uaWNlbHkiKSAlPiUgCiAgdmlzRWRnZXMoYXJyb3dzID0gInRvIikKYGBgCgozLiBGaW5kIHRoZSBlZGdlcywgbm9kZXMsIGFuZCBkZW5zaXR5IG9mIHRoZSBzZW5hdGUgcmV0d2VldCBuZXR3b3JrLgoKYGBge3J9CnNlbmF0ZV9yZXR3ZWV0c19uZXR3b3JrICU+JQogIHZjb3VudCgpCmBgYAoKYGBge3J9CnNlbmF0ZV9yZXR3ZWV0c19uZXR3b3JrICU+JQogIGVjb3VudCgpCmBgYAoKYGBge3J9CnNlbmF0ZV9yZXR3ZWV0c19uZXR3b3JrICU+JQogIGVkZ2VfZGVuc2l0eSgpCmBgYAoKNC4gQ3JlYXRlIGEgZGF0YXRhYmxlIHRoYXQgb25seSBzaG93cyB0aGUgbmFtZSBhbmQgZGVncmVlIG9mIHRoZSBzZW5hdG9ycy4gVGhlbiwgSSBwbGFjZWQgaXQgaW4gZGVzY2VuZGluZyBvcmRlciBieSBkZWdyZWUuCgpgYGB7cn0Kc2VuYXRlX3JldHdlZXRzX25vZGVzICU+JQogIHNlbGVjdChuYW1lLCBkZWdyZWUpICU+JQogIGRhdGF0YWJsZSgpCmBgYAoKNS4gRmluYWxseSwgZmluZCB0aGUgY29tbXVuaXRpZXMgd2l0aGluIHRoZSBuZXR3b3JrLCBhbmQgY3JlYXRlIGFuIGlHcmFwaC4KCmBgYHtyfQpzZW5hdGVfcmV0d2VldHNfbm9kZXMgPC0gc2VuYXRlX3JldHdlZXRzX25vZGVzICU+JSAKICBtdXRhdGUoZ3JvdXAgPSBtZW1iZXJzaGlwKGluZm9tYXAuY29tbXVuaXR5KHNlbmF0ZV9yZXR3ZWV0c19uZXR3b3JrKSkpCgp2aXNOZXR3b3JrKHNlbmF0ZV9yZXR3ZWV0c19ub2Rlcywgc2VuYXRlX3JldHdlZXRzX2VkZ2VzLCBtYWluID0gIlVTIHNlbmF0ZSByZXR3ZWV0IG5ldHdvcmsiKSAlPiUgCiAgdmlzSWdyYXBoTGF5b3V0KGxheW91dCA9ICJsYXlvdXRfbmljZWx5IikgJT4lIAogIHZpc0VkZ2VzKGFycm93cyA9ICJ0byIpICU+JSAgIAogIHZpc09wdGlvbnMoaGlnaGxpZ2h0TmVhcmVzdCA9IFQsIG5vZGVzSWRTZWxlY3Rpb24gPSBULCBzZWxlY3RlZEJ5ID0gImdyb3VwIikKYGBgCgoKCgo=