library(igraph)
library(tidyverse)
library(RefManageR)
library(gt)
library(networkD3)
This is post was largely inspired by the advent of code 2023 day 25 puzzle which largely involved network analysis. I thought it would be a fun visualization to visualize the network of inter-connected co-authors among the publications I have been a part of.
We start off with using the RefManageR
package to query pubmed for all publications with my name and Cedars-Sinai as an affiliation. We then use tidyverse
to wrangle the data into a format that can be used by networkD3
.
<- '(Michael Luu) AND (Cedars-Sinai[Affiliation])'
q
<- RefManageR::ReadPubMed(q, retmax = 999)
data
<- data |> as_tibble()
data
<- data |>
data select(author) |>
mutate(i = row_number(), .before = author) |>
separate_wider_delim(
author,delim = ' and ',
names = paste0('author', 1:30),
too_few = 'align_start'
|>
) pivot_longer(2:31) |>
filter(!is.na(value))
data
# A tibble: 761 × 3
i name value
<int> <chr> <chr>
1 1 author1 Vinicius F Calsavara
2 1 author2 Norah L Henry
3 1 author3 Ron D Hays
4 1 author4 Sungjin Kim
5 1 author5 Michael Luu
6 1 author6 Márcio A Diniz
7 1 author7 Gillian Gresham
8 1 author8 Reena S Cecchini
9 1 author9 Greg Yothers
10 1 author10 Patricia A Ganz
# ℹ 751 more rows
Now that we have the data in a tidy format, let’s construct a tibble, where all co-authors are connected to all other co-authors for a given publication. Since the list of interconnected co-authors are so large, for simplicity sake we are going to randomly sample 5 publications and visualize the network of co-authors for those publications only.
<- data |>
nd group_nest(i) |>
deframe() |>
map(\(x) {
<- x |> pull(value)
authors
<- tidyr::crossing(
data from = authors,
to = authors
)
<- data |>
data filter(from != to)
return(data)
|>
}) bind_rows(.id = 'id')
<- nd |> pull(id) |> unique() |> sample(5)
selected_publications
<- nd |> filter(id %in% selected_publications) |> select(-id) nd
The following is the interactive network of co-authors for the selected publications!
<- graph_from_data_frame(nd)
ig
<- networkD3::igraph_to_networkD3(ig)
n
forceNetwork(
Links = n$links,
Nodes = n$nodes,
Source = 'source',
Target = 'target',
NodeID = 'name',
Group = 'name',
zoom = TRUE,
opacity = .9,
charge = -100,
height = 800,
fontSize = 20
)
Reuse
Citation
@online{luu2024,
author = {Luu, Michael},
title = {Co-Author {Network} {Analysis} with {networkD3}},
date = {2024-01-23},
langid = {en}
}