我已经解决了整整两天的问题,似乎无法解决问题。我想创建一个图,以显示我的大学在一天中的每个小时和一周中的每一天的教室使用情况,以便我们的教学经理可以很容易地看到未充分利用教室的情况。
我必须使用的数据如下所示:
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')
如果任何人都有一个与我正在做的样地相似,并且不介意共享该样地的代码,我将深表感谢。或者,仅将指针指向正确的方向就足够了。感谢您提供的任何帮助。
答案 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)