【问题标题】:How to Create A Time-Spiral Graph Using R如何使用 R 创建时间螺旋图
【发布时间】:2017-01-21 16:38:17
【问题描述】:

有没有什么方法可以在 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 天的数据

Data1


这是另一个显示时间螺旋的图表...请您将图表更改为螺旋形,而不是圆形?

我从这个链接得到了图表 here

【问题讨论】:

  • 我查看了好问题,搜索了所有可能回答我的问题的帖子,我发现我的问题很好……一开始并不好,但现在就像我看到的其他问题一样……我展示了我的数据,并为我的图表提供了图片,并提供了数据……我还应该做什么?加上我等了 2 天,我做了你让我做的事......所以这不公平......
  • 您不应该删除问题,您应该编辑原始问题。仅供参考。

标签: r datetime ggplot2 lattice


【解决方案1】:

总体方法是将数据汇总到时间箱中(我使用了 15 分钟的箱),其中每个箱的值是该箱内值的平均行程时间。然后我们使用 POSIXct 日期作为 y 值,以便图形随着时间向外螺旋。使用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 分钟的时间段以及每个段的平均行程时间,并创建一个“螺旋时间”变量用作 y 值:

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 分钟小时的 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))

【讨论】:

  • 非常感谢,我想将旅行时间显示为组,时间将是轴,图表上的每个圆圈都是天,请您在图表上显示轴,请 ?找到 TravelTime 会让眼睛更舒服,你会在图片顶部找到我的图表的描述。
  • 例子:如果你看一下我的图表,从早上 8 点到早上 9 点你会发现大部分时间都是绿色的,这意味着 TravelTime 是正常的,这意味着没有拥堵。
  • 拜托,你可以用我的数据吗?我在 R 方面不太好,5 月的传说代表低旅行时间值代表绿色,最高值代表红色。
  • 是圆图吗?
  • 今晚我将更新我的答案,以回应您的问题和 cmets。但是请注意,在您的原始小数据样本中,所有行的时间都在十分钟内。请注意,这些行中每一行的线段都将被绘制在另一行之上。您是否希望以某种方式对这些数据进行分组,例如,15 或 30 分钟街区内的平均行程时间?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 2020-10-04
  • 2015-09-09
相关资源
最近更新 更多