#r #ggplot2 #geom-bar #facet-grid
#r #ggplot2 #геометрическая панель #фасет-сетка
Вопрос:
У меня есть facet_grid
график, который суммирует распределение генов по категориям, как показано ниже. Я хочу изменить цвет меток фасета / strip.background
(с красными полями и «Категориями» в коде), чтобы сделать его похожим на соответствующий график.
Как мне также увеличить расстояние между полосами (а не между гранями), чтобы сделать его более читаемым? Поскольку на метках оси y (покрытых черными прямоугольниками) много данных, они сжимаются, и метки становятся нечитаемыми.
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)
Что мы делаем, так это находим объект сетки, который содержит каждую полосу, и изменяем его атрибут заливки вручную, используя цвета, извлеченные из графика.