I'm trying to create an alluvial plot in ggplot2 with the ggalluvial package. Here are the two helpful websites I've been using to create the plot: site 1 and site 2.
My goal is to use the same code found on site 1 but apply it to my own df, as shown below. However, everytime I try to do that I get the following error:
Error in data.frame(first_row, curve_data): arguments imply differing number of rows: 1, 12
This is my df:
t1 <- c("college", "college", "college", "university", "university")
t2 <- c("law", "law", "business", "business", "business")
t3 <- c("public", "private", "private", "private", "public")
t4 <- c(2,4,6,8,10)
df <- data.frame(cbind(t1,t2,t3,t4))
names(df) <- c("Undergrad", "Grad_School", "Sector", "Freq")
This is the original code, as copied from site 1:
library(ggalluvial)
vaccinations
ggplot(data = vaccinations,
aes(axis1 = survey,
axis2 = response,
axis3 = survey,
y = freq))
geom_alluvium(aes(fill = response))
geom_stratum()
geom_text(stat = "stratum",
aes(label = after_stat(stratum)))
scale_x_discrete(limits = c("Survey", "Response"),
expand = c(0.15, 0.05))
theme_void()
This is my code with my df substituted in.
ggplot(data = df,
aes(axis1 = Undergrad,
axis2 = Grad_School,
y = Freq))
geom_alluvium(aes(fill = Sector))
geom_stratum()
geom_text(stat = "stratum",
aes(label = after_stat(stratum)))
scale_x_discrete(limits = c("Undergrad", "Grad_School"),
expand = c(0.15, 0.05))
theme_void()
CodePudding user response:
When you cbind() your vectors, you create a matrix which (unlike a data.frame) cannot contain different data types. Therefore, the Freq gets converted to a character. If you just directly create the data.frame without cbind() it works fine.
library(tidyverse)
library(ggalluvial)
t1 <- c("college", "college", "college", "university", "university")
t2 <- c("law", "law", "business", "business", "business")
t3 <- c("public", "private", "private", "private", "public")
t4 <- c(2,4,6,8,10)
df <- data.frame(t1,t2,t3,t4)
names(df) <- c("Undergrad", "Grad_School", "Sector", "Freq")
ggplot(data = df,
aes(axis1 = Undergrad,
axis2 = Grad_School,
y = Freq))
geom_alluvium(aes(fill = Sector))
geom_stratum()
geom_text(stat = "stratum",
aes(label = after_stat(stratum)))
scale_x_discrete(limits = c("Undergrad", "Grad_School"),
expand = c(0.15, 0.05))
theme_void()

Created on 2022-07-18 by the reprex package (v2.0.1)
