Могут ли легенды ggplot свободно перемещаться за пределы сюжета? - PullRequest
0 голосов
/ 09 мая 2018

У меня есть проблема, что график, нарисованный с помощью cowplot ::: plot_grid, сокращает легенду о левом графике всего на несколько мм. Размер легенды уже находится на абсолютном минимуме читабельности, а пробел между двумя графиками в порядке (поэтому я не хочу использовать поля, которыми я хочу манипулировать). Однако даже при justification = "left", легенда немного больше, чем панель сюжета, и затем обрезается после

plot_grid(px, p2, align="h", nrow=1, rel_widths = c(1,0.675))

ggsave("plot.tiff", width=8.27, height=11.69/4)

enter image description here

Слева все еще достаточно. Я знаю, что легенды можно свободно перемещать внутри сюжета, но можно ли переместить легенду всего в нескольких сантиметрах от якоря обоснования, если ее нарисовать за пределами сюжета?

Этот пример воссоздает проблему и содержит множество аргументов, характерных для моих реальных примеров (например, построение сетки с двумя разными значениями ширины), но мне пришлось увеличить размер шрифта легенды, а в примере нет дополнительные пробелы слева от легенды.

bp <- ggplot(data=PlantGrowth, aes(x=group, y=weight, fill=group)) +
  geom_boxplot() + theme_bw() +
  theme(legend.text = element_text(size=20), # IRL the font size is much smaller
        axis.text.y=element_blank(),
        legend.key.size = unit(0.2, "cm"),
        legend.position = "bottom",
        legend.justification="left")+
  guides(fill=guide_legend(nrow=3)) +
  coord_flip() 
bp
bp1 <- bp + scale_fill_discrete("",labels=c("reallyreallyreallylongstring", 
                                         "evenlongerstring", 
                                         "youcannotbelievehowlongthisstringis!!11!"))


library(cowplot)
plot_grid(bp1, bp, align="h", nrow=1, rel_widths = c(1,0.675))
ggsave("test.tiff", width=8.27, height=11.69/4)

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

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Это может выглядеть как ошибка в Cowplot, но это не так, и это не произошло бы с темой Cowplot. Проблема заключается в theme_bw(): второй график имеет белый фон, который рисуется поверх первого графика. Если вы удалите белый фон, легенда может пересекаться с одного сюжета на другой.

library(ggplot2)
bp <- ggplot(data=PlantGrowth, aes(x=group, y=weight, fill=group)) +
  geom_boxplot() + theme_bw() +
  theme(legend.text = element_text(size=20), # IRL the font size is much smaller
        axis.text.y=element_blank(),
        legend.key.size = unit(0.2, "cm"),
        legend.position = "bottom",
        legend.justification="left",
        # here we're removing plot background, legend background,
        # and legend box background, to be sure
        plot.background = element_blank(),
        legend.background = element_blank(),
        legend.box.background = element_blank())+
  guides(fill=guide_legend(nrow=3)) +
  coord_flip() 
bp
bp1 <- bp + scale_fill_discrete("",labels=c("reallyreallyreallylongstring", 
                                            "evenlongerstring", 
                                            "youcannotbelievehowlongthisstringis!!11!"))


library(cowplot)
plot_grid(bp1, bp, align="h", nrow=1, rel_widths = c(1,0.675))

enter image description here

(В настоящее время я работаю над версией разработки ggplot2, и мне нужно понять, почему легенда заканчивается слева от сюжета, но это отдельная проблема.)

0 голосов
/ 09 мая 2018

вы можете попробовать

# get legend
legend_p1 <- get_legend(bp1)
legend_p2 <- get_legend(bp)

# remove legend
bp1_wl <- bp1 + theme(legend.position='none')
bp_wl <- bp + theme(legend.position='none')

# plot
plot_grid(plot_grid(bp1_wl, bp_wl, align="h", rel_widths = c(1,0.675)),
          plot_grid(legend_p1,legend_p2, rel_widths = c(1,0.675)), nrow=2, rel_heights = c(1,0.4))

enter image description here

...