Как уменьшить границы между легендами в коровьем заговоре

Расположение нескольких легенд - распространенная проблема при подготовке графиков в R. Функция theme() в пакете ggplot2 позволяет расположить несколько легенд в горизонтальном или вертикальном направлении. Однако в некоторых случаях одни легенды длинные, а другие короткие. Предпочтительно складывать короткие легенды в ряд или столбец, а длинные легенды оставлять в другой отдельной строке или столбце. Единственные два варианта: горизонтальный или вертикальный в функции theme() неудовлетворительны.

Другой способ - извлекать легенды из графиков с помощью функции get_legend() в пакете cowplot. Однако поля между надписями не могут быть уменьшены после упорядочивания функцией plot_grid(). Как я могу уменьшить границы (серую зону) между легендами?

Воспроизводимые примеры показаны ниже:

p1 <- ggplot(mtcars) +
  geom_bar(aes(x=as.factor(am), fill=as.factor(am))) +
  theme(legend.margin = margin(0,unit="pt"))
p2 <- ggplot(mtcars) +
  geom_bar(aes(x=as.factor(vs), fill=as.factor(vs))) +
  theme(legend.margin = margin(0,unit="pt"))
p3 <- ggplot(mtcars) +
  geom_bar(aes(x=as.factor(carb),fill=as.factor(carb))) +
  scale_fill_manual(breaks = c(1,2,3,4,5,6,7,8),values = c('#f7fcfd','#e5f5f9','#ccece6','#99d8c9','#66c2a4','#41ae76','#238b45','#005824'))+
  theme(legend.margin = margin(0,unit="pt"))
leg1 <- get_legend(p1+theme(legend.background = element_rect(fill="white")))
leg2 <- get_legend(p2+theme(legend.background = element_rect(fill="white")))
leg3 <- get_legend(p3+theme(legend.background = element_rect(fill = "white")))
leg12 <- plot_grid(leg1,leg2,nrow=2)+theme(plot.background = element_rect(fill="grey"))
leg123 <- plot_grid(leg3,leg12,nrow = 1)+theme(plot.background = element_rect(fill="grey"))
ggdraw(leg123)

результат

Я бы хотел, чтобы это выглядело так:

Я хочу:


person Yiwei Zhu    schedule 22.06.2020    source источник


Ответы (1)


Вывод ggplot2 и любого другого приложения R, использующего графическое устройство, напрямую связан с разрешением и размером вашего графического окна. По сути, текст и некоторые другие нарисованные слои масштабируются по-разному, а это означает, что если вы измените размер окна, результат изменится. Если я возьму ваш код, вы сможете увидеть эффект, отправив различные аргументы width= и height= в ggsave():

# kind of the default output for me
ggsave('a0.png', width=8, height=5)

введите описание изображения здесь

# this gets you something like what you wanted
ggsave('a.png', width=3, height=2)

введите описание изображения здесь

Теперь, если вы поместите это вместе с сюжетом ... используйте ту же общую идею, и вы сможете прийти к чему-то, что работает.

person chemdork123    schedule 22.06.2020