如何使用 R 创建时间螺旋图
How to Create A Time-Spiral Graph Using R
有什么方法可以在 R 中绘制这样的图形,并在其上具有相同的 12 个轴和它们的名称?
这是图表的图片。
这是我的一段数据
Date1 Time TravelTime
1 2016-09-04 13:11 34
2 2016-09-04 13:12 34
3 2016-09-04 13:13 33
4 2016-09-04 13:14 33
5 2016-09-04 13:15 33
6 2016-09-04 13:16 43
7 2016-09-04 13:17 44
8 2016-09-04 13:18 44
9 2016-09-04 13:19 40
10 2016-09-04 13:20 39
这是 dput
的输出
structure(list(Date1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L), .Label = "2016-09-04", class = "factor"), Time = structure(1:10, .Label = c("13:11",
"13:12", "13:13", "13:14", "13:15", "13:16", "13:17", "13:18",
"13:19", "13:20"), class = "factor"), TravelTime = c(34L, 34L,
33L, 33L, 33L, 43L, 44L, 44L, 40L, 39L)), .Names = c("Date1",
"Time", "TravelTime"), row.names = c(NA, -10L), class = "data.frame")
这是我 5 天的数据
这是另一个显示时间螺旋的图表...请将您的图表更改为螺旋形,而不是圆形?
我从这个 link 得到了图表
here
总体方法是将数据汇总到时间 bin 中(我使用 15 分钟 bin),其中每个 bin 的值是该 bin 内值的平均行程时间。然后我们使用 POSIXct 日期作为 y-value 以便图形随时间向外螺旋。使用 geom_rect
,我们将平均行程时间映射到条形高度以创建螺旋形条形图。
首先,加载并处理数据:
library(dplyr)
library(readxl)
library(ggplot2)
dat = read_excel("Data1.xlsx")
# Convert Date1 and Time to POSIXct
dat$time = with(dat, as.POSIXct(paste(Date1, Time), tz="GMT"))
# Get hour from time
dat$hour = as.numeric(dat$time) %% (24*60*60) / 3600
# Get date from time
dat$day = as.Date(dat$time)
# Rename Travel Time and convert to numeric
names(dat)[grep("Travel",names(dat))] = "TravelTime"
dat$TravelTime = as.numeric(dat$TravelTime)
现在,将数据汇总到 15 分钟 time-of-day 的 bin 中,每个 bin 的平均行程时间并创建一个 "spiral time" 变量用作 y-value:
dat.smry = dat %>%
mutate(hour.group = cut(hour, breaks=seq(0,24,0.25), labels=seq(0,23.75,0.25), include.lowest=TRUE),
hour.group = as.numeric(as.character(hour.group))) %>%
group_by(day, hour.group) %>%
summarise(meanTT = mean(TravelTime)) %>%
mutate(spiralTime = as.POSIXct(day) + hour.group*3600)
最后,绘制数据。每个 15 分钟 hour-of-day bin 都有自己的分段,我们使用行程时间来表示颜色渐变和条形高度。如果您愿意,您当然可以将填充颜色和条形高度映射到两个不同的变量(在您的示例中,填充颜色映射到月份;对于您的数据,您可以将填充颜色映射到日期,如果这是您想要突出显示的内容) .
ggplot(dat.smry, aes(xmin=as.numeric(hour.group), xmax=as.numeric(hour.group) + 0.25,
ymin=spiralTime, ymax=spiralTime + meanTT*1500, fill=meanTT)) +
geom_rect(color="grey40", size=0.2) +
scale_x_continuous(limits=c(0,24), breaks=0:23, minor_breaks=0:24,
labels=paste0(rep(c(12,1:11),2), rep(c("AM","PM"),each=12))) +
scale_y_datetime(limits=range(dat.smry$spiralTime) + c(-2*24*3600,3600*19),
breaks=seq(min(dat.smry$spiralTime),max(dat.smry$spiralTime),"1 day"),
date_labels="%b %e") +
scale_fill_gradient2(low="green", mid="yellow", high="red", midpoint=35) +
coord_polar() +
theme_bw(base_size=13) +
labs(x="Hour",y="Day",fill="Mean Travel Time") +
theme(panel.grid.minor.x=element_line(colour="grey60", size=0.3))
下面是另外两个版本:第一个版本使用 geom_segment
,因此,地图旅行时间仅用于填充颜色。第二个使用 geom_tile
并将行程时间映射到填充颜色和图块高度。
geom_segment
版本
ggplot(dat.smry, aes(x=as.numeric(hour.group), xend=as.numeric(hour.group) + 0.25,
y=spiralTime, yend=spiralTime, colour=meanTT)) +
geom_segment(size=6) +
scale_x_continuous(limits=c(0,24), breaks=0:23, minor_breaks=0:24,
labels=paste0(rep(c(12,1:11),2), rep(c("AM","PM"),each=12))) +
scale_y_datetime(limits=range(dat.smry$spiralTime) + c(-3*24*3600,0),
breaks=seq(min(dat.smry$spiralTime), max(dat.smry$spiralTime),"1 day"),
date_labels="%b %e") +
scale_colour_gradient2(low="green", mid="yellow", high="red", midpoint=35) +
coord_polar() +
theme_bw(base_size=10) +
labs(x="Hour",y="Day",color="Mean Travel Time") +
theme(panel.grid.minor.x=element_line(colour="grey60", size=0.3))
geom_tile
版本
ggplot(dat.smry, aes(x=as.numeric(hour.group) + 0.25/2, xend=as.numeric(hour.group) + 0.25/2,
y=spiralTime, yend=spiralTime, fill=meanTT)) +
geom_tile(aes(height=meanTT*1800*0.9)) +
scale_x_continuous(limits=c(0,24), breaks=0:23, minor_breaks=0:24,
labels=paste0(rep(c(12,1:11),2), rep(c("AM","PM"),each=12))) +
scale_y_datetime(limits=range(dat.smry$spiralTime) + c(-3*24*3600,3600*9),
breaks=seq(min(dat.smry$spiralTime),max(dat.smry$spiralTime),"1 day"),
date_labels="%b %e") +
scale_fill_gradient2(low="green", mid="yellow", high="red", midpoint=35) +
coord_polar() +
theme_bw(base_size=12) +
labs(x="Hour",y="Day",color="Mean Travel Time") +
theme(panel.grid.minor.x=element_line(colour="grey60", size=0.3))
有什么方法可以在 R 中绘制这样的图形,并在其上具有相同的 12 个轴和它们的名称?
这是图表的图片。
这是我的一段数据
Date1 Time TravelTime
1 2016-09-04 13:11 34
2 2016-09-04 13:12 34
3 2016-09-04 13:13 33
4 2016-09-04 13:14 33
5 2016-09-04 13:15 33
6 2016-09-04 13:16 43
7 2016-09-04 13:17 44
8 2016-09-04 13:18 44
9 2016-09-04 13:19 40
10 2016-09-04 13:20 39
这是 dput
的输出structure(list(Date1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L), .Label = "2016-09-04", class = "factor"), Time = structure(1:10, .Label = c("13:11",
"13:12", "13:13", "13:14", "13:15", "13:16", "13:17", "13:18",
"13:19", "13:20"), class = "factor"), TravelTime = c(34L, 34L,
33L, 33L, 33L, 43L, 44L, 44L, 40L, 39L)), .Names = c("Date1",
"Time", "TravelTime"), row.names = c(NA, -10L), class = "data.frame")
这是我 5 天的数据
这是另一个显示时间螺旋的图表...请将您的图表更改为螺旋形,而不是圆形?
我从这个 link 得到了图表 here
总体方法是将数据汇总到时间 bin 中(我使用 15 分钟 bin),其中每个 bin 的值是该 bin 内值的平均行程时间。然后我们使用 POSIXct 日期作为 y-value 以便图形随时间向外螺旋。使用 geom_rect
,我们将平均行程时间映射到条形高度以创建螺旋形条形图。
首先,加载并处理数据:
library(dplyr)
library(readxl)
library(ggplot2)
dat = read_excel("Data1.xlsx")
# Convert Date1 and Time to POSIXct
dat$time = with(dat, as.POSIXct(paste(Date1, Time), tz="GMT"))
# Get hour from time
dat$hour = as.numeric(dat$time) %% (24*60*60) / 3600
# Get date from time
dat$day = as.Date(dat$time)
# Rename Travel Time and convert to numeric
names(dat)[grep("Travel",names(dat))] = "TravelTime"
dat$TravelTime = as.numeric(dat$TravelTime)
现在,将数据汇总到 15 分钟 time-of-day 的 bin 中,每个 bin 的平均行程时间并创建一个 "spiral time" 变量用作 y-value:
dat.smry = dat %>%
mutate(hour.group = cut(hour, breaks=seq(0,24,0.25), labels=seq(0,23.75,0.25), include.lowest=TRUE),
hour.group = as.numeric(as.character(hour.group))) %>%
group_by(day, hour.group) %>%
summarise(meanTT = mean(TravelTime)) %>%
mutate(spiralTime = as.POSIXct(day) + hour.group*3600)
最后,绘制数据。每个 15 分钟 hour-of-day bin 都有自己的分段,我们使用行程时间来表示颜色渐变和条形高度。如果您愿意,您当然可以将填充颜色和条形高度映射到两个不同的变量(在您的示例中,填充颜色映射到月份;对于您的数据,您可以将填充颜色映射到日期,如果这是您想要突出显示的内容) .
ggplot(dat.smry, aes(xmin=as.numeric(hour.group), xmax=as.numeric(hour.group) + 0.25,
ymin=spiralTime, ymax=spiralTime + meanTT*1500, fill=meanTT)) +
geom_rect(color="grey40", size=0.2) +
scale_x_continuous(limits=c(0,24), breaks=0:23, minor_breaks=0:24,
labels=paste0(rep(c(12,1:11),2), rep(c("AM","PM"),each=12))) +
scale_y_datetime(limits=range(dat.smry$spiralTime) + c(-2*24*3600,3600*19),
breaks=seq(min(dat.smry$spiralTime),max(dat.smry$spiralTime),"1 day"),
date_labels="%b %e") +
scale_fill_gradient2(low="green", mid="yellow", high="red", midpoint=35) +
coord_polar() +
theme_bw(base_size=13) +
labs(x="Hour",y="Day",fill="Mean Travel Time") +
theme(panel.grid.minor.x=element_line(colour="grey60", size=0.3))
下面是另外两个版本:第一个版本使用 geom_segment
,因此,地图旅行时间仅用于填充颜色。第二个使用 geom_tile
并将行程时间映射到填充颜色和图块高度。
geom_segment
版本
ggplot(dat.smry, aes(x=as.numeric(hour.group), xend=as.numeric(hour.group) + 0.25,
y=spiralTime, yend=spiralTime, colour=meanTT)) +
geom_segment(size=6) +
scale_x_continuous(limits=c(0,24), breaks=0:23, minor_breaks=0:24,
labels=paste0(rep(c(12,1:11),2), rep(c("AM","PM"),each=12))) +
scale_y_datetime(limits=range(dat.smry$spiralTime) + c(-3*24*3600,0),
breaks=seq(min(dat.smry$spiralTime), max(dat.smry$spiralTime),"1 day"),
date_labels="%b %e") +
scale_colour_gradient2(low="green", mid="yellow", high="red", midpoint=35) +
coord_polar() +
theme_bw(base_size=10) +
labs(x="Hour",y="Day",color="Mean Travel Time") +
theme(panel.grid.minor.x=element_line(colour="grey60", size=0.3))
geom_tile
版本
ggplot(dat.smry, aes(x=as.numeric(hour.group) + 0.25/2, xend=as.numeric(hour.group) + 0.25/2,
y=spiralTime, yend=spiralTime, fill=meanTT)) +
geom_tile(aes(height=meanTT*1800*0.9)) +
scale_x_continuous(limits=c(0,24), breaks=0:23, minor_breaks=0:24,
labels=paste0(rep(c(12,1:11),2), rep(c("AM","PM"),each=12))) +
scale_y_datetime(limits=range(dat.smry$spiralTime) + c(-3*24*3600,3600*9),
breaks=seq(min(dat.smry$spiralTime),max(dat.smry$spiralTime),"1 day"),
date_labels="%b %e") +
scale_fill_gradient2(low="green", mid="yellow", high="red", midpoint=35) +
coord_polar() +
theme_bw(base_size=12) +
labs(x="Hour",y="Day",color="Mean Travel Time") +
theme(panel.grid.minor.x=element_line(colour="grey60", size=0.3))