2016-07-26 6 views
1

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

hacked-up attempt of the chart

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

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) 

enter image description here

+0

Я смотрел на geom_rect(), но делает эстетическое отображение под функцией ggplot, а не функции GeoM ! Мне придется играть еще немного с этим – user2784067

+0

Кстати, ваш окончательный результат очень приятен на глаз! – user2784067