Добавьте заголовок легенды для l oop с ggplot2 - PullRequest
0 голосов
/ 30 марта 2020

У меня есть следующий код для построения моих в списке . Участок имеет 18 кадров данных. Соглашение об именах для информационных фреймов выглядит следующим образом: 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.

Пример кадра данных из списка приведен ниже. Все кадры данных имеют одинаковый формат и размер:

 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

Я использую следующий код

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)
}

В настоящее время я удаляю заголовок легенды, потому что в противном случае он будет читать заголовок столбца «Имена». Я хотел бы добавить заголовок легенды в l oop так, чтобы в каждом заголовке легенды было указано «UG», а затем имя информационного кадра, для которого создается график. Пример UG84-9.

1 Ответ

2 голосов
/ 30 марта 2020

Ваши данные, вероятно, не помогают полностью воспроизвести вашу проблему. Я бы вообще старался избегать создания всех oop графиков, когда в этом нет необходимости! Возможно, есть лучшие варианты для визуализации отдельных групп. Подумайте о гранении

с опцией l oop (я бы не хотел этого делать)

Ps Я сократил код вашего сюжета в какой-то более важный момент.

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)

или, возможно, лучше и более прямолинейно, просто используя огранку

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)

Создано в 2020-03-30 с помощью представительного пакета (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")
...