Как я могу изменить цвет моей метки фасета (strip.background), чтобы он совпадал с его полосами?

#r #ggplot2 #geom-bar #facet-grid

#r #ggplot2 #геометрическая панель #фасет-сетка

Вопрос:

У меня есть facet_grid график, который суммирует распределение генов по категориям, как показано ниже. Я хочу изменить цвет меток фасета / strip.background (с красными полями и «Категориями» в коде), чтобы сделать его похожим на соответствующий график.

Как мне также увеличить расстояние между полосами (а не между гранями), чтобы сделать его более читаемым? Поскольку на метках оси y (покрытых черными прямоугольниками) много данных, они сжимаются, и метки становятся нечитаемыми.

график facet_grid

 ggplot(allVFs, aes(x=Dist,y=genes))   
  geom_bar(stat="identity", width = 0.75, size = 0.05 )  
  facet_grid(Categories ~., scales = "free", space = "free")  
  labs( x = "Distribution (%)", y = "Genes", title = "VFs per category" )  
  theme( strip.text = element_text( size = 8, color = "white", hjust = 0.5),
         strip.text.y = element_text(angle=0),
         strip.background = element_rect( fill = "#5675D6"), # I tried changing this but couldn't make it similar to the bar colors
         panel.background = element_rect( fill = "#efefef"),
         panel.grid.major.x = element_blank(),
         panel.grid.minor.x = element_blank(),
         panel.grid.minor.y = element_blank(),
         panel.grid.major.y = element_line( color = "#C0C0C0" ),
         panel.spacing.x = unit( 0.8, "cm" ),
         panel.spacing.y = unit( 0.5, "cm" ),
         legend.position = "none" )  
  geom_text(aes( label = paste0( Dist, "%" ), y = genes),
            vjust = 0, size = 2, color = "black" )  
  aes(fill = as.factor(Categories)) #This gives the color to each facet that I want to replicate with the facet labels
 

Любые предложения по улучшению этого графика будут с благодарностью приняты!

Ответ №1:

Это невозможно «из коробки ggplot2 «, но мы можем углубиться в gtable объект для достижения результата.

Я буду использовать пример графика и данных. Но это должно сработать и на вашем примере:

 library(ggplot2)
g <- ggplot(iris, aes(x = Sepal.Length, fill = Species))  
  geom_bar()  
  facet_grid(Species ~ .)

# Find the colors used
fill_colors <- unique(ggplot_build(g)$data[[1]]$fill)

# Find strips glob
gt<-ggplot_gtable(ggplot_build(g))
strips <- which(startsWith(gt$layout$name,'strip'))

# Change the fill color of each strip
for (s in seq_along(strips)) {
  gt$grobs[[strips[s]]]$grobs[[1]]$children[[1]]$gp$fill <- fill_colors[s]
}

plot(gt)
 

Создано 2020-11-26 пакетом reprex (версия 0.3.0)

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