Home > database >  Alluvial plot for three variabes
Alluvial plot for three variabes

Time:12-11

From a dataframe like this:

data.frame(status = c("open", "close", "close", "open/close","close"), 
           stock = c("google", "amazon", "amazon", "yahoo", "amazon"), 
           newspaper = c("times", "newyork", "london", "times", "times"))

How do I need to transform the data in order to have an alluvial plot like this

where the two columns are stock and newspaper and the link is the frequency of status column

CodePudding user response:

With the data provided, it is difficult to know exactly what has to be plotted. I was inspired by this blog and suggest this answer

library(ggalluvial)
library(ggplot2)
library(dplyr)

df <- data.frame(status = c("open", "close", "close", "open/close", "close"), 
                 stock = c("google", "amazon", "amazon", "yahoo", "amazon"), 
                 newspaper = c("times", "newyork", "london", "times", "times"))

# Count the number of occurance for each alluvial
df <- df %>% dplyr::group_by(stock, newspaper, status) %>% 
  summarise(n = n()) 

# Define the factors
df$status <- factor(df$status, levels = c("open", "open/close", "close"))
df$stock <- factor(df$stock, levels = c("google", "amazon", "yahoo"))
df$newspaper <- factor(df$newspaper, levels = c("times", "newyork", "london"))

# Plot the alluvial as in https://cran.r-project.org/web/packages/ggalluvial/vignettes/ggalluvial.html#alluvia-wide-format
ggplot2::ggplot(df.2, aes(y = n, axis1 = stock, axis2 = newspaper))  
  ggalluvial::geom_alluvium(aes(fill = status), width = 1/12)  
  ggalluvial::geom_stratum(width = 1/12, fill = "black", color = "grey")  
  ggplot2::geom_label(stat = "stratum", aes(label = after_stat(stratum)))  
  ggplot2::scale_x_discrete(limits = c("stock", "newspaper"), expand = c(.05, .05))  
  ggplot2::scale_fill_brewer(type = "qual", palette = "Set1")  
  ggplot2::ggtitle("Alluvial-Test")
  • Related