легенда ggplot на основе цветов оси

#r #ggplot2 #legend #yaxis #geom-tile

Вопрос:

Я пытаюсь создать легенду в ggplot на основе цвета оси y, которую я установил.

Кто-нибудь знает, есть ли способ вручную создать легенду на основе данных, отсутствующих на самом рисунке?

Ниже приведен игрушечный пример сюжета и кода. На этом графике я изобразил оценки учащихся в 3 разных дня. Имена учащихся окрашиваются в зависимости от того, в каком классе они учатся. Я хотел бы знать, могу ли я добавить дополнительную легенду, показывающую «Класс А» зеленым цветом и «Класс В» фиолетовым. введите описание изображения здесь

В качестве дополнительного примечания я понимаю, что дни не в порядке. Я не беспокоюсь об этом как о моменте.

Спасибо!

 library(tidyverse)

name <- c("Mike", "Mike","Mike",
          "Sam","Sam","Sam", 
          "Max","Max","Max", 
          "Sarah","Sarah","Sarah") 
date <- c("Monday", "Wednesday", "Friday",
          "Monday", "Wednesday", "Friday",
          "Monday", "Wednesday", "Friday",
          "Monday", "Wednesday", "Friday")
grade <- c(100, 98, 93, 
           92, 64, 90, 
           80, 88,70,
           90,94,100)
classroom <- c("Class A", "Class A","Class A", 
               "Class A", "Class A","Class A", 
               "Class B", "Class B","Class B", 
               "Class B", "Class B","Class B")

df <- data.frame(cbind(name, date, grade, classroom)) %>%
  mutate(grade = as.integer(grade),
         classroom = as.factor(classroom))


plot <- ggplot(df, aes(y=name, x=date, fill= grade < 90))   
  geom_tile()  
  scale_fill_manual(name = " ", values = c( "turquoise3","lightgrey"), labels = c("Above 90","At or below 90" ))  
  theme(axis.text.y = element_text(color = ifelse(levels(df$classroom) %in% "Class A", "Green", "Purple")))  
  guides(size = "none", color = "none", alpha = "none") 
 

Комментарии:

1. Возможно, вы сможете использовать ggtext

Ответ №1:

Ты мог бы facet_wrap

 plot <- ggplot(df, aes(y=name, x=date, fill= grade < 90))   
  geom_tile()  
  scale_fill_manual(name = " ", values = c( "turquoise3","lightgrey"), labels = c("Above 90","At or below 90" ))  
  theme(axis.text.y = element_text(color = ifelse(levels(df$classroom) %in% "Class A", "Green", "Purple")))  
  guides(size = "none", color = "none", alpha = "none") 

plot    facet_wrap(~classroom)
 

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

или facet_grid

 plot   facet_grid(rows = vars(classroom))
 

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