Цикл для нескольких объектов графика на основе фактора - PullRequest
1 голос
/ 10 мая 2019

Я хочу создать отдельные объекты графика на основе фактора, чтобы я мог построить их вместе, используя grid_arrange, а не facet_grid - поскольку я нахожу это неуклюжим.

Я думаю, мне нужен цикл for, но я не совсемпоймите их - если это то, что мне нужно, можете ли вы подробно рассказать, как это работает?

1 Ответ

1 голос
/ 11 мая 2019

Вы можете разделить ваш фрейм данных на Month (используйте group_split), а затем перебрать этот список, используя map & plot_function()

library(tidyverse)
theme_set(theme_minimal(base_size = 14))

plot_function <- function(df) {
  p <- ggplot(df, aes(x = Month, y = value, fill = Type))
  p <- p + geom_col() +
    scale_fill_manual("",
                       values = c('Cargo ship' = '#7570b3',
                                  'Fishing' = '#1b9e77',
                                  'Tanker'='#d95f02'))
  return(p)
}

# Save all plots in a list
plot_list <- All %>% 
  mutate(Month = factor(Month, levels = c("Jan", "Feb", "Mar", "Nov", "Dec"))) %>% 
  group_split(Month) %>% 
  map(~ plot_function(.x))

# Combine all plots into one
cowplot::plot_grid(plotlist = plot_list, 
                   nrow  = 3,
                   align = 'hv',
                   axis  = 'tblr')

Редактировать : оставить только 1 общую легенду

# remove all legends
all_plot <- cowplot::plot_grid(plotlist = 
  lapply(seq_along(plot_list), function(x) {plot_list[[x]] + theme(legend.position = 'none')}), 
                   nrow = 3,
                   align = 'hv',
                   axis = 'tblr')

# extract legend from one plot              
common_legend <- cowplot::get_legend(plot_list[[1]] + theme(legend.position = 'bottom'))

# combine plot and legend
p <- cowplot::plot_grid(all_plot, common_legend, 
                        nrow = 2,
                        rel_heights = c(3, .3))
p

Создано в 2019-05-10 пакетом представить (v0.2.1)

...