Как автоматически объединить две легенды ggplot в одну с метками из третьей переменной - PullRequest
0 голосов
/ 19 марта 2020

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

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

library(tidyverse)
library(plotly)

data(mtcars)
mtcars <- mtcars[c(1,3,4,5,8,30),c("cyl","disp","hp")] %>% 
  as_tibble(rownames="car") %>%
  group_by(cyl) %>% 
  mutate(cylindex=rank(cyl,ties.method="first")) %>%
  ungroup() %>%
  # removed because 'car' is available from the row name
  # but this was used in the original question and one answer
  #mutate(brand=letters[1:nrow(.)]) %>% 
  mutate_at(c("cyl","cylindex"),as_factor) %>%
  mutate(legend=paste(cyl,cylindex,sep=" - "))

mtcars %>% 
  ggplot(aes(x=disp, y=hp, color=cyl, shape=cylindex)) +
  geom_point(size=10) -> g
print(g)
ggplotly(g)

mtcars %>% 
  ggplot(aes(x=disp, y=hp, color=legend, shape=legend)) +
  geom_point(size=10) +
  scale_color_manual(values=c("red","red","blue","blue","blue","green")) + 
  scale_shape_manual(values=c(16,17,16,17,15,16))

ggplot2 производит следующее: ![ggplot2 output

С ggplotly легенда находится на наименее вместе взятые, однако я изо всех сил пытаюсь изменить метки автоматически на соответствующий автомобиль. ![ggplotly output

Используя ответ @ dc37, мне удалось создать легенду, похожую на ggplotly, но жестко запрограммированную. Я написал рядом с каждой записью, как бы я хотел ярлыки с надписями. Информация из автомобильного столбца, который был добавлен из имен строк. enter image description here

Как я могу

- объединить обе легенды с ggplot2 (аналогично ggploty) без жесткого кодирования количества данных

- Измените метки легенды автоматически на значение в другой переменной (в этом примере бренд)

Ваша помощь очень важна.

1 Ответ

2 голосов
/ 19 марта 2020

Для объединения легенд вы можете создать новый категориальный столбец, объединяющий обе переменные:

mtcars %>% 
  filter(as.numeric(cylindex)<=2) %>%
  mutate(Legend = paste(cyl,cylindex, sep = ",")) %>% 
  ggplot(aes(x=disp, y=hp, color=Legend, shape=Legend)) +
  geom_point(size=10) +
  scale_color_manual(values = rep(c("red","blue","green"), each = 2))+
  scale_shape_manual(values = rep(c(16,18),3))

enter image description here

Если вы хотите, чтобы переменные бренда были ярлык, просто используйте brand в вашем aes:

mtcars %>% 
  filter(as.numeric(cylindex)<=2) %>%
  ggplot(aes(x=disp, y=hp, color=brand, shape=brand)) +
  geom_point(size=10) +
  scale_color_manual(values = rep(c("red","blue","green"), each = 2))+
  scale_shape_manual(values = rep(c(16,18),3))

enter image description here

или используя scale_color_manual и scale_shape_manual, вы можете свяжите каждый уровень новых переменных «Легенда» со значениями «бренда»:

mtcars %>% 
  filter(as.numeric(cylindex)<=2) %>%
  mutate(Legend = paste(cyl,cylindex, sep = ",")) %>% 
  ggplot(aes(x=disp, y=hp, color=Legend, shape=Legend)) +
  geom_point(size=10) +
  scale_color_manual(values = rep(c("red","blue","green"), each = 2), 
                     labels = c(`6,1` = "a",`6,2` = "b", `4,1` = "c",`4,2` = "h",`8,1` = "e", `8,2` = "g"))+
  scale_shape_manual(values = rep(c(16,18),3),
                     labels = c(`6,1` = "a",`6,2` = "b", `4,1` = "c",`4,2` = "h",`8,1` = "e", `8,2` = "g"))

enter image description here

Отвечает ли он на ваш вопрос?

...