R 'cowplot' аккуратно создает сеточный сюжет с общими (общими) легендами и уникальными легендами
Смотрите мой связанный вопрос и принятый ответ здесь.
Я пытаюсь создать сюжет, похожий на сюжет в принятом ответе, то есть сюжет в сетке с общей общей легендой и уникальной легендой, прикрепленной к каждому графику в сетке.
В частности, я хочу сетку из 3 строк и 1 столбца с 1 графиком в каждой строке. Как это:
Который был произведен со следующим кодом:
library (ggplot2)
library(gridExtra)
library (grid)
library(cowplot)
diamonds2 <- diamonds[sample(nrow(diamonds), 500), ]
# 3 ggplot plot objects with multiple legends 1 common legend and 3 unique legends
p1<- ggplot(diamonds2, aes(x=price, y= depth, color= clarity , shape= cut )) +
geom_point(size=5) + labs (shape = "unique legend", color = "common legend")
p2 <- ggplot(diamonds2, aes(x=price, y= depth, color= clarity , shape= color )) +
geom_point(size=5) + labs (shape = "unique legend", color = "common legend")
p3 <- ggplot(diamonds2, aes(x=price, y= depth, color= clarity , shape= clarity )) +
geom_point(size=5) + labs (shape = "unique legend", color = "common legend")
cowplot::plot_grid(
cowplot::plot_grid(
p1 + scale_color_discrete(guide = FALSE),
p2 + scale_color_discrete(guide = FALSE),
p3 + scale_color_discrete(guide = FALSE),
nrow=3, ncol = 1))
Но с общей легендой, которая относится к color =
аргумент каждого сюжета объекта.
Я пробовал много вариантов приведенного ниже кода и добавил / скорректировал / удалил различные аргументы / параметры в консультации с cowplot
документацию, но я не могу получить аккуратный график, подобный приведенному выше, с общей легендой внизу (или где-нибудь полезным!) - все, что я пробовал, возвращает переполненный график, как показано ниже.
Адаптация приведенного выше кода для включения общей легенды:
cowplot::plot_grid(
cowplot::plot_grid(
p1 + scale_color_discrete(guide = FALSE),
p2 + scale_color_discrete(guide = FALSE),
p3 + scale_color_discrete(guide = FALSE),
nrow=3, ncol = 1
),
cowplot::get_legend(p1 + scale_shape(guide = FALSE) + theme(legend.position = "bottom")), nrow=3)
В результате получается многолюдный сюжет с большим количеством пустого пространства:
Кто-нибудь может подсказать, где я могу пойти не так?
1 ответ
Каждый звонок plot_grid
разбивает вашу область построения. Здесь вы вкладываете два вызова plot_grid
, и вы просите 3 строки в каждой. cowplot
поэтому разделяет область построения на две равные части:
- в верхней части помещается ваш точечный график
- в нижней части ваша легенда занимает первый ряд, а в двух нижних рядах ничего не создается, создавая много пустого пространства, в то же время раздавливая ваши точечные диаграммы.
Вы можете указать относительную высоту каждой области построения, предоставляя больше места для точечных диаграмм и меньше места для легенды внизу. Например, для 85% сюжетов и 15% легенд:
cowplot::plot_grid(
cowplot::plot_grid(
p1 + scale_color_discrete(guide = FALSE),
p2 + scale_color_discrete(guide = FALSE),
p3 + scale_color_discrete(guide = FALSE),
ncol = 1, align = "v"
),
cowplot::get_legend(p1 + scale_shape(guide = FALSE) +
theme(legend.position = "bottom")),
ncol=1, rel_heights=c(.85, .15))
который производит: