使用 ggplot 复制趋势图

Replicating a trending chart with ggplot

我最近看到了一张我想在 R 中复制的图表。该图表将多个记录的分数或其他度量显示为一个彩色框,并分为 4 种颜色之一。在我的图像中,它是红色、浅红色、浅绿色和绿色。因此,每条记录的每个分数都有一个框 - 这个想法是每条记录在多个时间点的给定时间点都有一个分数。在我的示例中,我将随时间使用学生考试成绩,假设我们全年有 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 中重新创建此图表?我应该看什么几何?

你可以玩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)