Репликация графика трендов с помощью ggplot

Недавно я увидел диаграмму, которую хочу воспроизвести в R. Диаграмма показывает оценку или другое измерение для нескольких записей в виде цветного прямоугольника, объединенного, скажем, в один из четырех цветов. На моем изображении это красный, светло-красный, светло-зеленый и зеленый. Таким образом, каждая запись получает по одной ячейке за каждый набранный ими балл. Идея состоит в том, что каждая запись имеет один балл за данный момент времени в течение нескольких моментов времени. В моем примере я буду использовать результаты тестов учащихся с течением времени, например, у нас будет 4 студента и 8 тестов в течение года (в хронологическом порядке), у нас будет 8 блоков для каждого студента, в результате чего получится 32 блока. Каждый ряд (студент) будет иметь 8 ящиков.

попытка взлома графика

Вот как я создал пример данных:

totallynotrealdata <- data.frame(Student = c(rep("A",8),rep("B",8),rep("C",8),rep("D",8)),Test = rep(1:8,4), Score = sample(1:99,32,replace = TRUE), BinnedScore = cut(totallynotrealdata$TB,breaks = c(0,25,50,75,100),labels = c(1,2,3,4)))

Что мне интересно, так это как я могу воссоздать этот график в ggplot? На какие камни я должен смотреть?

1 ответ

Решение

Вы могли бы поиграть с geom_rect(), Это очень просто, но я думаю, вы можете легко оптимизировать его для своих целей:

df <- data.frame(Student = c(rep(1,8),rep(2,8),rep(3,8),rep(4,8)),
                 Test = rep(1:8,4),
                 Score = sample(1:99,32,replace = TRUE)) 

df$BinnedScore <- cut(df$Score,breaks = c(0,25,50,75,100),labels = c(1,2,3,4))
df$Student     <- factor(df$Student, labels = LETTERS[1:length(unique(df$Student))])

library(ggplot2)

colors   <- c("#f23d2e", "#e39e9c", "#bbd3a8", "#68f200")    
numStuds <- length(levels(df$Student))
numTests <- max(df$Test)

ggplot() + geom_rect(data = df, aes(xmin = Test-1, xmax = Test, ymin = as.numeric(Student)-1, ymax = as.numeric(Student)), fill = colors[df$BinnedScore], col = grey(0.5)) +
  xlab("Test") + ylab("Student") +
  scale_y_continuous(breaks = seq(0.5, numStuds, 1), labels = levels(df$Student)) +
  scale_x_continuous(breaks = seq(0.5, numTests, 1), labels = 1:numTests)

Другие вопросы по тегам