Maral Dorri
Maral Dorri

Reputation: 478

Add legend title in a for loop with ggplot2

I have the following code to plot my that are in a list . Plot has 18 data frames. The naming convention of the dataframes is as follows: 84-9, 84-12, 84-15, 92-9, 92-12, 92-15, 100-9, 100-12, 100-15, 108-9, 108-12, 108-15, 116-9, 116-12, 116-15, 124-9, 124-12 ,124-15.

A sample dataframe from the list are provided below. All of the dataframes have the same format and size:

 Plot[["84-9"]]
   Names    Type       Shear Moment
   <chr>    <chr>      <dbl>  <dbl>
 1 Baseline ext_multi  0.824  0.614
 2 Baseline ext_single 0.734  0.464
 3 Baseline int_multi  0.727  0.527
 4 Baseline int_single 0.599  0.338
 5 Sample   ext_multi  0.829  0.626
 6 Sample   ext_single 0.737  0.475
 7 Sample   int_multi  0.712  0.512
 8 Sample   int_single 0.595  0.327
 9 Sample   ext_multi  0.823  0.611
10 Sample   ext_single 0.737  0.464
# ... with 34 more rows

I use the following code

library(ggplot2)

for (i in 1:length(Plot)) {
plot.Shear <- ggplot(data = subset(Plot[[i]], Names = "Sample"), aes(x = Type, y = Shear)) + 
  geom_boxplot(outlier.shape = NA) +
  stat_summary(fun = mean, geom="point", shape=23, size=3) + 
  stat_boxplot(geom='errorbar', linetype=1, width=0.5) + 
  geom_point(data = subset(Plot[[i]], Names != "Sample"), aes(colour = Names)) +
  scale_color_manual(values=c("red","green4","black")) + 
  theme(legend.title=element_blank()) + 
  theme(axis.title.x=element_blank()) +
  theme(axis.title.y=element_blank()) +
  labs(title = "Shear Live Load Distribution Factors") + 
  theme(plot.title = element_text(hjust = 0.5))

print(plot.Shear)
}

At the moment, I am removing the legend title because otherwise, it would read the column title "Names". I would like to add the legend title in the loop such that each legend title would say "UG" followed by the name of the dataframe that the plot is generated for. Example UG84-9.

Upvotes: 0

Views: 574

Answers (1)

tjebo
tjebo

Reputation: 23737

Your data probably does not help to fully reproduce your problem. I would generally try to avoid creating a loop of plots when it is not necessary! There are probably better options to visualise separate groups. Think about faceting

option with loop (I'd rather not do that)

P.s. I have stripped down your plot code to some more essential bit.

library(tidyverse)
Plot <- list('84-9' = mydat, '84-12' = mydat) # make fake list - this is repeating your data frame twice for convenience. 

plot_list <- list() #empty list of plots
for (i in 1:length(Plot)) {
  plot_list[[i]] <- ggplot(data = Plot[[i]], aes(x = Type, y = Shear, color = Type)) + 
    geom_point() +
    scale_color_discrete() + 
    labs(title = "Shear Live Load Distribution Factors", 
         color = paste('UG', names(Plot)[i])) #that is the essential bit how to change the legend title. 

}

#now plot the list of plots with e.g. patchwork
patchwork::wrap_plots(plot_list, nrow = 2)

or, arguably better and more direct, just using faceting

data_plot <- Plot %>% bind_rows(.id = 'ID')# bind all data frames

ggplot(data = data_plot, aes(x = Type, y = Shear, color = Type)) + 
  geom_point() +
  scale_color_discrete() + 
  labs(title = "Shear Live Load Distribution Factors") +
  facet_wrap(~ID, nrow = 2)

Created on 2020-03-30 by the reprex package (v0.3.0)

data

#devtools::install_github("alistaire47/read.so")
mydat <- read.so::read_so("Names    Type       Shear Moment
   <chr>    <chr>      <dbl>  <dbl>
 1 Baseline ext_multi  0.824  0.614
 2 Baseline ext_single 0.734  0.464
 3 Baseline int_multi  0.727  0.527
 4 Baseline int_single 0.599  0.338
 5 Sample   ext_multi  0.829  0.626
 6 Sample   ext_single 0.737  0.475
 7 Sample   int_multi  0.712  0.512
 8 Sample   int_single 0.595  0.327
 9 Sample   ext_multi  0.823  0.611
10 Sample   ext_single 0.737  0.464")

Upvotes: 2

Related Questions