使用 geom_tile 作为热图
Using geom_tile for heatmap
我整整两天都在研究一个问题,但似乎无法解决问题。我想创建一个图表来显示 class 我学院的房间使用情况,一天中的每个小时和一周中的每一天,这样我们的教学经理就可以很容易地看到 class 房间的使用情况未充分利用。
我必须处理的数据如下所示:
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 中的每一行代表一个 class 在一个房间里相遇。 "room"是房间号。 "strTime" 和 "endTime" 是那个房间里 class 的开始和结束时间。这些是文本字段,但可以轻松转换为时间或任何其他格式。 "days" 是 class 相遇的星期几。我知道我必须划分 "days" 数据并且相信为每一天创建一个新行是最简单的,因此第一行将分为两行:一个用于星期一,一个用于星期三。 "pctFill" 是该房间的填充百分比(可容纳 20 名学生但包含 15 名学生的房间为 75.00 pctFill)。
我想使用 geom_tile(或 geom_raster 或 geom_rect)创建热图类型的图。我设想该图将沿 x 轴显示星期几,沿 y 轴显示一天中的时间,其中每个相交的块将填充代表 class 房间填充百分比的颜色。我已经完成了几个教程并理解了 geom_tile 的概念并且可以为 mtcars 创建一个 heck-of-a-plot。不幸的是,我使用的数据似乎没有以相同的方式工作,因为它是时间而不是简单的分类变量,我认为。我尝试使用所有三个 geom 创建一个图,但没有取得太大成功。我几乎可以让 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')
如果有人有与我正在做的类似的样例图并且不介意分享该图的代码,我将不胜感激。或者,仅指向正确方向的指针可能就足够了。感谢您提供的任何帮助。
这样的怎么样?
首先,您的示例数据:
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)
我整整两天都在研究一个问题,但似乎无法解决问题。我想创建一个图表来显示 class 我学院的房间使用情况,一天中的每个小时和一周中的每一天,这样我们的教学经理就可以很容易地看到 class 房间的使用情况未充分利用。
我必须处理的数据如下所示:
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 中的每一行代表一个 class 在一个房间里相遇。 "room"是房间号。 "strTime" 和 "endTime" 是那个房间里 class 的开始和结束时间。这些是文本字段,但可以轻松转换为时间或任何其他格式。 "days" 是 class 相遇的星期几。我知道我必须划分 "days" 数据并且相信为每一天创建一个新行是最简单的,因此第一行将分为两行:一个用于星期一,一个用于星期三。 "pctFill" 是该房间的填充百分比(可容纳 20 名学生但包含 15 名学生的房间为 75.00 pctFill)。
我想使用 geom_tile(或 geom_raster 或 geom_rect)创建热图类型的图。我设想该图将沿 x 轴显示星期几,沿 y 轴显示一天中的时间,其中每个相交的块将填充代表 class 房间填充百分比的颜色。我已经完成了几个教程并理解了 geom_tile 的概念并且可以为 mtcars 创建一个 heck-of-a-plot。不幸的是,我使用的数据似乎没有以相同的方式工作,因为它是时间而不是简单的分类变量,我认为。我尝试使用所有三个 geom 创建一个图,但没有取得太大成功。我几乎可以让 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')
如果有人有与我正在做的类似的样例图并且不介意分享该图的代码,我将不胜感激。或者,仅指向正确方向的指针可能就足够了。感谢您提供的任何帮助。
这样的怎么样?
首先,您的示例数据:
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)