Load the libraries
library(tidyverse)
library(tidymodels)
tidymodels_prefer()
#library(nberwp)
library(extrafont)
#fonts()
library(RColorBrewer)
library(patchwork)
Load the datasets
papers <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-09-28/papers.csv')
authors <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-09-28/authors.csv')
programs <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-09-28/programs.csv')
paper_authors <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-09-28/paper_authors.csv')
paper_programs <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-09-28/paper_programs.csv')
Joining sets
authors <- authors %>% select(author,name)
programs <- programs %>% drop_na()
df <- papers %>% #count(paper) # 29434 4
inner_join(paper_authors, by ="paper") %>% # 67090 2
full_join(paper_programs, by = "paper") %>% # 53996 2
inner_join(authors, by = "author") %>% # 15437 2
full_join(programs, by = "program") %>% # 20 3
drop_na()
Make a dataframe with programs category and proportions
df_cat <- df %>%
count(program_desc,program_category,sort=T) %>%
mutate(prop = n/sum(n)*100) %>%
pivot_wider(names_from = program_category, values_from = program_desc)
head(df_cat,3)
## # A tibble: 3 × 5
## n prop Micro `Macro/International` Finance
## <int> <dbl> <chr> <chr> <chr>
## 1 14084 11.0 Labor Studies <NA> <NA>
## 2 13967 10.9 Public Economics <NA> <NA>
## 3 13113 10.2 <NA> Economic Fluctuations and Growth <NA>
Make three tibbles as to be used in the legends
leg_fin <- tibble("Finance"=paste(df_cat$Finance,"-",round(df_cat$prop,2),"%"))%>%filter(!str_detect(Finance,"NA"))
leg_mic <- tibble("Micro"=paste(df_cat$Micro, "-",round(df_cat$prop,2),"%"))%>%filter(!str_detect(Micro,"NA"))
leg_mac <- tibble("Macro/International"=paste(df_cat$`Macro/International`,"-",round(df_cat$prop,2),"%"))%>%filter(!str_detect(`Macro/International`,"NA"))
leg_fin;leg_mic;leg_mac
## # A tibble: 2 × 1
## Finance
## <chr>
## 1 Asset Pricing - 5.29 %
## 2 Corporate Finance - 4.79 %
## # A tibble: 14 × 1
## Micro
## <chr>
## 1 Labor Studies - 10.95 %
## 2 Public Economics - 10.86 %
## 3 Health Economics - 5.19 %
## 4 Productivity, Innovation, and Entrepreneurship - 4.73 %
## 5 Health Care - 3.64 %
## 6 Children - 3.5 %
## 7 Industrial Organization - 3.49 %
## 8 Economics of Education - 3.35 %
## 9 Economics of Aging - 3.3 %
## 10 Development Economics - 2.99 %
## 11 Political Economics - 2.77 %
## 12 Development of the American Economy - 2.62 %
## 13 Environment and Energy Economics - 2.4 %
## 14 Law and Economics - 2.17 %
## # A tibble: 4 × 1
## `Macro/International`
## <chr>
## 1 Economic Fluctuations and Growth - 10.2 %
## 2 International Finance and Macroeconomics - 6.67 %
## 3 International Trade and Investment - 5.54 %
## 4 Monetary Economics - 5.54 %
Set the data ready to use in the plot function
df_plot <- df %>% count(year,program_category,program_desc)
plot_fin_df <- df_plot %>% filter(program_category == "Finance")
plot_mic_df <- df_plot %>% filter(program_category == "Micro")
plot_mac_df <- df_plot %>% filter(program_category == "Macro/International")
Set all the specifications for the plot function to build
require(RColorBrewer)
#Set the `color` option for the plot function:
# color
cut_colors1 <- setNames(brewer.pal(2, "Set1"), levels(plot_fin_df$program_desc))
cut_colors2 <- setNames(brewer.pal(4, "Paired"), levels(plot_mac_df$program_desc))
cut_colors3 <- setNames(c(brewer.pal(name = "Set3", n = 12), brewer.pal(name = "Pastel1", n = 2)), levels(plot_mic_df$program_desc))
# Unlist legends-dataframe to be used in the legends
# leg_lab
leg_fin <- unlist(leg_fin$Finance)
leg_mac <- unlist(leg_mac$`Macro/International`)
leg_mic <- unlist(leg_mic$Micro)
# leg_pos
set1 = c(0.73,0.78)
set2 = c(0.7,0.8)
set3 = c(0.55,0.8)
Make a ggcombo() plot building a function for plotting the program categories
ggcombo <- function(data1,data2,data3){
ggbar_cat <- function(data,leg_pos,leg_lab,leg_col,color){
data %>%
ggplot(aes(x = year,y = n,group = program_desc,fill = program_desc)) +
geom_col() +
facet_wrap(vars(program_category), ncol = 1, strip.position = "right") +
scale_fill_manual(values = color, label = leg_lab, name = paste(data[[1,2]],"category Impact proportion")) +
scale_y_continuous(position = "right") +
guides(fill = guide_legend(ncol = leg_col,title.position = "top", title.hjust = 0.5)) +
ggthemes::theme_fivethirtyeight() +
theme(text = element_text(family = "Roboto Condensed"),
axis.text.x = element_text(face = "bold",size = 8),
axis.text.y = element_text(),
legend.text = element_text(size = 8),
legend.key.size = unit(0.3, 'cm'),
legend.title = element_text(face = "bold"),
legend.position = leg_pos,
legend.background = element_blank(),
strip.placement = "outside",
strip.text = element_text(face = "bold",size = 14))
}
plot_fin <- ggbar_cat(data1,set1,leg_fin,1,cut_colors1)
plot_mac <- ggbar_cat(data2,set2,leg_mac,1,cut_colors2)
plot_mic <- ggbar_cat(data3,set3,leg_mic,2,cut_colors3)
require(patchwork)
plot_fin <- plot_fin +
labs(title = "\n",subtitle = "\n")
plot_fin/plot_mac/plot_mic
}
Assign a name to the ggcombo
plot <- ggcombo(plot_fin_df,plot_mac_df,plot_mic_df)
Make a pie_chart logo
pie_colors <- brewer.pal(name = "Set2", n = 3)
pie_df <- df %>%
count(program_desc,program_category,sort = T) %>%
mutate(prop = n/sum(n)*100)
par_prop <- pie_df %>%
group_by(program_category) %>%
summarize(par_prop = round(sum(prop),0))
pie_plot <- pie_df %>%
left_join(par_prop,by = "program_category") %>%
ggplot(aes(x = "", y = prop, fill = program_category)) +
geom_col(width = 1, stat = "identity") +
scale_fill_manual(values = pie_colors,name = "NBER Programs Category") +
guides(fill = guide_legend(ncol = 1,title.position = "top", title.hjust = 0.5)) +
ggthemes::theme_fivethirtyeight() +
theme(text = element_text(family = "Roboto Condensed"),
panel.grid = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.text = element_blank(),
#plot.background = element_blank(),
legend.text = element_text(size = 14),
legend.key.size = unit(0.5, 'cm'),
legend.title = element_text(face = "bold",size = 16),
legend.position = "none",#c(0.21,0.9),
legend.background = element_blank(),
strip.placement = "outside") +
annotate(geom = "text", label = "Micro\n62%", x = 1.1, y = 20, colour = "grey20", size = 14, family = "Roboto Condensed") +
annotate(geom = "text", label = "Macro\n28%", x = 1.2, y = 80, colour = "grey20",size = 14, family = "Roboto Condensed") +
annotate(geom = "text", label = "Finance\n10%", x = 1.2, y = 95, colour = "grey20", size = 11,family = "Roboto Condensed") +
coord_polar("y", start = 0)
# save the pie_chart_logo
ragg::agg_png(here::here("w40/w40_pie_ep.png"),
res = 320, width = 8, height = 8, units = "in")
pie_plot
dev.off()
## quartz_off_screen
## 2
Annotate the figure first with adding top and bottom information to have it framed with ggarrange()
#------------finish touches
library(ggimage)
library(magick)
library(cowplot)
library(ggpubr)
graphics <- ggarrange(plot)
# annotate the plot
final_plot <- annotate_figure(graphics,
top = text_grob("NBER National Bureau of Economic Research",
color = c("grey28"), face = "bold", size = 34,
family = "Roboto Condensed"),
bottom = text_grob("Infographics Federica Gazzelloni DataSource: NBER - TidyTuesday week40\n",
color = "grey28",family = "Roboto Condensed",
hjust = 0.5, x = 0.58, face = "bold.italic", size = 16)
)
Finally, add some other information with more annotations
library(gridExtra)
final_plot <-
final_plot +
annotate(geom = 'segment',y = 0.87, yend = 0.93, x = 0.9,xend = 0.9, color = "#1E90FF", size = 10) +
annotate(geom = "text", label = "All three Program Categories reached the top level in 2020 with
the highest number of paper publications due to Covid19",
x = 0.58, y = 0.90,colour = "grey20",size = 6,family = "Roboto Condensed",fontface = "bold") +
annotate(geom = "text", label = "Finance topic started in 1978
but with lack of success since late 1990
when started its continuous growth",
x = 0.25, y = 0.7,colour = "grey20",size = 5,family = "Roboto Condensed") +
annotate(geom = "text", label = "Macro/International topic started in 1975
reaching the highest level among the other
categories, after the first decrease in early 1990 decade,
most probably for the increased interest in other topics,
maintained a steady growth along the years",
x = 0.28, y = 0.5,colour = "grey20",size = 4,family = "Roboto Condensed") +
annotate(geom = "text", label = "Micro topic is the most varied one,
and maintained little but steady increase
along the whole period",
x = 0.24, y = 0.15,colour = "grey20",size = 5,family = "Roboto Condensed")
# add the logos
img_pie <- image_read(here::here("w40/w40_pie_ep.png"))
imglogo <- image_read(here::here("w40/w40_nber-logo.png"))
final <- ggdraw() +
draw_plot(final_plot) +
draw_image(img_pie, x = 0.05, y = 0.35,width = 0.22) +
draw_image(imglogo, x = 0.01, y = -0.48,width = 0.2)
## save final plot ----
ragg::agg_png(here::here("w40/w40_ep.png"),
res = 320, width = 10, height = 12, units = "in")
final
dev.off()
## quartz_off_screen
## 2
Read the image, attach the Tidytuesday logo and save it
tidy_logo <- image_read("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/static/plot_logo.png") %>%
image_resize("300x300")
tidy_final <- image_read(here::here("w40/w40_ep.png"))
attached_logo <- image_composite(tidy_final, tidy_logo,
operator = "atop",
gravity = "southeast")
image_write(attached_logo, path = "w40_ep.png", format = "png")
See final result
NBER Programs Category from 1975 to 2021