使用geom_tile进行热图

时间:2018-09-05 21:56:51

标签: r ggplot2 heatmap

我已经解决了整整两天的问题,似乎无法解决问题。我想创建一个图,以显示我的大学在一天中的每个小时和一周中的每一天的教室使用情况,以便我们的教学经理可以很容易地看到未充分利用教室的情况。

我必须使用的数据如下所示:

room strTime endTime days pctFill
1101 1345    1500    MW   91.67
1102 1345    1630    MW   95.83
1102 1730    2015    MW   66.67
1104 0915    1200    MW   62.50
1104 1345    1630    MW   45.83

df中的每一行代表一个类,在一个房间中相遇。 “房间”是房间号。 “ strTime”和“ endTime”是该房间中课程的开始和结束时间。这些是文本字段,但可以轻松转换为时间或其他任何格式。 “天”是课程每周的某天。我知道我必须对“天”数据进行划分,并认为每天创建一个新行是最容易的,因此第一行将分为两行:一个为星期一,一个为星期三。 “ pctFill”是该房间的填充百分比(可容纳20个学生但包含15个学生的房间为75.00 pctFill)。

我想使用geom_tile(或geom_raster或geom_rect)创建热图类型的绘图。我设想该图在x轴上是星期几,在y轴上是一天中的时间,其中每个相交的块将用代表教室填充百分比的颜色填充。我已经完成了一些教程,并且了解geom_tile的概念,并且可以为mtcar创建一个十分复杂的图。不幸的是,我认为我正在使用的数据似乎工作方式不同,因为它是时间,而不是简单的分类变量。我试图使用所有三个几何图形创建一个图,但是没有成功。我可以使geom_tile几乎可以工作,但是每个磁贴都以开始时间为中心,而不是开始时间位于框的下边缘。而且,这些框的高度都相同,这很可能是由于y轴刻度所致。我尝试使用geom_raster并使用y轴将网格划分为15分钟的间隔,然后用适当的颜色填充每个网格块。不幸的是,无论我在那个情节上做错了什么,都只会产生一个空的网格。 geom_rect本来可以工作,但我想出了一种方法,可以在不创建每个房间值之间都有一个伪变量的情况下,使矩形变宽。

这是我最接近可行的方法:

ggplot() +
  geom_tile(
    data = df
    ,mapping = aes(x = room
                   ,y = strTime
                   ,fill = pctFill
                   )
    ,color = 'white'
    ,alpha = 0.5
    ) +
  scale_fill_gradient(low = 'white', high = 'steelblue')

如果任何人都有一个与我正在做的样地相似,并且不介意共享该样地的代码,我将深表感谢。或者,仅将指针指向正确的方向就足够了。感谢您提供的任何帮助。

Best geom_tile effort

1 个答案:

答案 0 :(得分:0)

这样的事情怎么样?

首先,您的示例数据:

library(tidyverse)
txt <- 'room strTime endTime days pctFill
1101 1345    1500    MW   91.67
1102 1345    1630    MW   95.83
1102 1730    2015    MW   66.67
1104 0915    1200    MW   62.50
1104 1345    1630    MW   45.83'

df <- read.table(text = txt, header = T)

然后,我们将数据转换为一周中的每一天都在其自己的行中:

df <- read.table(text = txt, header = T) %>% 
  mutate(days = str_split(days, '')) %>% 
  unnest(days)

   room strTime endTime pctFill days
1  1101    1345    1500   91.67    M
2  1101    1345    1500   91.67    W
3  1102    1345    1630   95.83    M
4  1102    1345    1630   95.83    W
5  1102    1730    2015   66.67    M
6  1102    1730    2015   66.67    W
7  1104     915    1200   62.50    M
8  1104     915    1200   62.50    W
9  1104    1345    1630   45.83    M
10 1104    1345    1630   45.83    W

最后,使用geom_rect()进行绘图:

plot.rooms <- ggplot(data = df, aes(xmin = room - 0.33, xmax = room + 0.33,  ymin = strTime, ymax = endTime)) +
  geom_rect(aes(alpha = pctFill)) +
  facet_grid(facets = ~days) +
  scale_x_continuous(breaks = sort(unique(df$room))) +
  scale_alpha_continuous(range = c(0.3, 1))
print(plot.rooms)

enter image description here