Добавить легенду ggplot для комбинации функций - PullRequest
0 голосов
/ 14 января 2019

Как добавить легенду с метками для каждой из следующих строк:

lty=1, lwd=2, color='black', label='Litigating'
lty=2, lwd=2, color='black', label='Non-litigating'
lty=1, lwd=1, color='gray', label='Reference'

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

enter image description here

Вот один из подходов, который я попытался сделать, но легенда взорвана функцией, в результате чего шесть значков вместо трех:

# Make a data.frame with 10 points and the aesthetics associated wit each
D_legend = data.frame(
  x = 1:10,
  y = rnorm(10),
  lwd = factor(c(2,2,2,2,2,2,1,1,1,1)),
  lty = factor(c(1,1,1,2,2,2,1,1,1,1)),
  color=c(rep('black', 6), rep('gray', 4))
)

# Plot it. I want a nice legend here!
ggplot(D_legend, aes(x=x, y=y, lty=lty, lwd=lwd, color=color)) + 
  geom_line() + 
  theme(legend.position="top")

enter image description here

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Альтернативным решением может быть создание столбца метки и использование geom_dl для создания чего-то похожего на ваше изображение.

library(directlabels)
D_legend = data.frame(
  x = 1:10,
  y = rnorm(10),
  lwd = factor(c(2,2,2,2,2,2,1,1,1,1)),
  lty = factor(c(1,1,1,2,2,2,1,1,1,1)),
  color=c(rep('black', 6), rep('gray', 4))
)

D_legend$label<- case_when(
  D_legend$lwd==2 &D_legend$lty==1 ~ 'Litigating',
  D_legend$lwd==2 &D_legend$lty==2 ~ 'Non-litigating',
  D_legend$lwd==1 &D_legend$lty==1 ~ 'Reference')

ggplot(D_legend, aes(x=x, y=y, lty=lty, lwd=lwd, color=label)) + 
  geom_line(size=1) +
  theme_pvs_helvetica+
  scale_x_continuous(limits = c(0,12))+
  scale_color_manual(values =c('black','black','gray'))+
  theme(legend.position = 'none')+
  geom_dl(aes(x=x+0.1,label =label,color=label), method = 'last.points')

enter image description here

0 голосов
/ 14 января 2019

Давайте просто создадим переменную взаимодействия, которая определяет тип строки:

D_legend$type <- droplevels(with(D_legend, interaction(lty, lwd, color)))
# Giving better names
levels(D_legend$type) <- c("Litigating", "Non-litigating", "Reference")

Теперь мы можем иметь дело с каждой из трех эстетик в отдельности:

ggplot(D_legend, aes(x = x, y = y, lty = type, lwd = type, color = type)) + 
  geom_line() + theme(legend.key.width = unit(2, "cm")) +
  scale_linetype_manual(
    NULL, 
    values = c("Litigating" = 1, "Non-litigating" = 2, "Reference" = 1)
  ) +
  scale_size_manual(
    NULL, 
    values = c("Litigating" = 2, "Non-litigating" = 2, "Reference" = 1)
  ) +
  scale_color_manual(
    NULL, 
    values = c("Litigating" = "black", "Non-litigating" = "black", "Reference" = "gray")
  )

enter image description here

Я увеличил legend.key.width, так как в противном случае не было видно, что второй тип строки штриховой. Если вы хотите, чтобы легенда имела имя, замените type на нее, и таким образом вы также можете отбросить все NULL.

...