knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
library(SDGsR)
library(tidyverse)

To create a circular frequency plot of data from the SDGs using the SDGs colour palette you can adapt this code.

First we simulate some data

# simulate data
Goals<-SDGsR::get_SDGs_goals_titles()
Goals=Goals %>% 
  rowid_to_column() %>% 
  rowwise() %>% 
  mutate(Papers=sample(c(0:100),1#,prob =c(0.3,0.19,0.08, 0.07,
  #                      0.06,
  #                      0.05,
  #                      0.05,
  #                      0.05,
  #                      0.05,
  #                      0.05,
  #                      0.05
  # )
  )
  )

Then we can plot this data using {ggplot2}.

# define the colours
clr=SDGsR::SDGs_cols(paste0("Goal",Goals$rowid))

# Make the plot
p <- ggplot(Goals, aes(x=as.factor(rowid), y=Papers)) +       # Note that id is a factor. If x is numeric, there is some space between the first bar

  # This add the bars with a blue color
  geom_bar(stat="identity", fill=clr) +

  # Limits of the plot = very important. The negative value controls the size of the inner circle, the positive one is useful to add size over each bar
  ylim(-100,120) +

  # Custom the theme: no axis title and no cartesian grid
  theme_minimal() +
  theme(
    axis.text = element_blank(),
    axis.title = element_blank(),
    panel.grid = element_blank(),
    plot.margin = unit(rep(-2,4), "cm")     # This remove unnecessary margin around plot
  ) +

  # This makes the coordinate polar instead of cartesian.
  coord_polar(start = 0)
p


label_data <- Goals

# calculate the ANGLE of the labels
number_of_bar <- nrow(label_data)
angle <-  90 - 360 * (label_data$rowid-0.5) /number_of_bar     # I substract 0.5 because the letter must have the angle of the center of the bars. Not extreme right(1) or extreme left (0)

# calculate the alignment of labels: right or left
# If I am on the left part of the plot, my labels have currently an angle < -90
label_data$hjust<-ifelse( angle < -90, 1, 0)

# flip angle BY to make them readable
label_data$angle<-ifelse(angle < -90, angle+180, angle)
# ----- ------------------------------------------- ---- #


# Start the plot
p <- ggplot(Goals, aes(x=as.factor(rowid), y=Papers)) +       # Note that id is a factor. If x is numeric, there is some space between the first bar

  # This add the bars with a blue color
  geom_bar(stat="identity", fill=clr, colour="black") +

  # Limits of the plot = very important. The negative value controls the size of the inner circle, the positive one is useful to add size over each bar
  ylim(-100,120) +

  # Custom the theme: no axis title and no cartesian grid
  theme_minimal() +
  theme(
    axis.text = element_blank(),
    axis.title = element_blank(),
    panel.grid = element_blank(),
    plot.margin = unit(rep(-1,4), "cm")      # Adjust the margin to make in sort labels are not truncated!
  ) +

  # This makes the coordinate polar instead of cartesian.
  coord_polar(start = 0) +

  # Add the labels, using the label_data dataframe that we have created before
  geom_text(data=label_data, aes(x=rowid, y=Papers+10, label=paste0("Goal ",rowid), hjust=hjust), color="black", fontface="bold",alpha=0.7, size=2.5, angle= label_data$angle, inherit.aes = FALSE ) 

p


# ggplot(Goals, aes(x = datcall1.title, y = Papers,
#                                fill = clr)) + 
#   geom_bar(width = 0.9, stat="identity") + 
#   coord_polar(theta = "y") +
#   xlab("") + ylab("") +
#   ylim(c(0,100)) +
#   #ggtitle("Top Product Categories Influenced by Internet") +
#   geom_text(data = Goals, hjust = 1, size = 3,
#             aes(x = datcall1.title, y = 0, label = paste0("Goal ", rowid))) +
#   theme_minimal() +
#   theme(legend.position = "none",
#         panel.grid.major = element_blank(),
#         panel.grid.minor = element_blank(),
#         axis.line = element_blank(),
#         axis.text.y = element_blank(),
#         axis.text.x = element_blank(),
#         axis.ticks = element_blank())


DrMattG/SDGsR documentation built on April 3, 2025, 2:13 p.m.