Отсутствующие элементы легенды при использовании common.legend в ggarrange с ggplot2 - PullRequest
1 голос
/ 13 июня 2019

При такой настройке, как:

require(ggplot2)
require(ggpubr)

size = 20
s = 0.2
d = seq(0,2*pi, length.out=size)
df = data.frame(
  d=d + runif(size)*s,
  a=sin(d) + runif(size)*s,
  b=sin(d-10) + runif(size)*s,
  c=cos(2*d) + runif(size)*s
)

при попытке построить линии с ggarrange

ggarrange(
  (
    ggplot(df, aes(x=d, palette="Set1"))
    + geom_smooth(aes(y=a, color="A"), se=FALSE)
    + scale_color_manual(values=c("#999999"))
  ),
  (
    ggplot(df, aes(x=d, palette="Set2"))
    + geom_smooth(aes(y=b, color="B"), se=FALSE)
    + geom_smooth(aes(y=c, color="C"), se=FALSE)
  ),
  common.legend=TRUE
)

общая легенда показывает только элементы из первого аргумента ggplot, в данном случае это строка A. Как получить общую легенду, включающую все строки без переформатирования кадра данных и использования facet?

ggarrange line plots

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

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

Например, вы можете добавить

 scale_color_manual(limits = c("A", "B", "C"),
                             values = c("#999999",hcl(c(15, 195), 100, 65)))

к первому сюжету вашего примера.

ggarrange(
    (
        ggplot(df, aes(x=d, palette="Set1"))
        + geom_smooth(aes(y=a, color="A"), se=FALSE)
        + scale_color_manual(limits = c("A", "B", "C"),
                             values = c("#999999",hcl(c(15, 195), 100, 65)))
    ),
    (
        ggplot(df, aes(x=d, palette="Set2"))
        + geom_smooth(aes(y=b, color="B"), se=FALSE)
        + geom_smooth(aes(y=c, color="C"), se=FALSE)
    ),
    common.legend=TRUE
)

enter image description here

0 голосов
/ 13 июня 2019

Я думаю, что вам лучше перестроить ваши данные в длинный формат, чтобы a, b и c были собраны в одном столбце и создавали фиктивный столбец группировки для фасетирования.Таким образом, вы можете использовать «естественный» подход ggplot2 для отображения одного столбца в colour, чтобы получить легенду, которую вы хотите.Это также уменьшает объем кода и позволяет избежать головной боли при многосюжетной компоновке.

library(tidyverse)

# Starting data
size = 20
s = 0.2
d = seq(0,2*pi, length.out=size)
set.seed(2)
df = data.frame(
  d=d + runif(size)*s,
  a=sin(d) + runif(size)*s,
  b=sin(d-10) + runif(size)*s,
  c=cos(2*d) + runif(size)*s
)

# Reshape to long format and add dummy grouping column
df = df %>% 
  gather(key, value, -d) %>% 
  mutate(group = key != "a")

ggplot(df, aes(x=d, y=value, colour=key)) +
  geom_smooth(se=FALSE) +
  facet_grid(. ~ group) +
  theme(strip.background=element_blank(),
        strip.text=element_blank(),
        legend.position="top") +
  scale_colour_manual(values=c("grey40", hcl(c(15,195),100,65))) +
  labs(colour="")

enter image description here

...