【问题标题】:Heatmap (ggplot): time versus date热图(ggplot):时间与日期
【发布时间】:2020-03-10 12:55:56
【问题描述】:

我有一些样本数据(实际上这些是犯罪数据):

randomDatetime <- function(N, st="2018/01/01", et="2018/12/31") {
st <- as.POSIXct(as.Date(st))
et <- as.POSIXct(as.Date(et))
dt <- as.numeric(difftime(et,st,unit="sec"))
ev <- sort(runif(N, 0, dt))
rt <- st + ev
return(rt)
}

df <- data.frame(date=randomDatetime(1000))

现在,我想创建一个像这样的 KDE 绘图/热图:

x 轴上应该有日期(2018-01-01 到 2018-12-31),y 轴上应该有时间(00:00-23:59)。目标是显示特定犯罪类型在一天中的什么时间最常发生,以及不同的犯罪类型之间是否存在差异等。

现在,我的 y 轴有问题,因为我不知道如何只节省时间。例如,我可以计算自午夜以来的分钟数,但这对我来说似乎不是很优雅。

我想应该是这样的:

ggplot(aes(x = date, y = ??) data = df) + 
geom_density_2d()+
scale_x_date(date_breaks = "months", date_labels = "%m", limits=as.Date(c("2018-01-01","2018-12-31"))) 

【问题讨论】:

    标签: r ggplot2 kde


    【解决方案1】:

    一种方法是使用lubridate...

    library(lubridate)
    ggplot(aes(x = date, y = hour(date) + minute(date) / 60), data = df) + 
         geom_density_2d() 
    

    【讨论】:

      【解决方案2】:

      可能有一种更简洁的方法,但这可行:

      library(tidyverse)
      library(lubridate)
      
      randomDatetime <- function(N, st="2018/01/01", et="2018/12/31") {
        st <- as.POSIXct(as.Date(st))
        et <- as.POSIXct(as.Date(et))
        dt <- as.numeric(difftime(et,st,unit="sec"))
        ev <- sort(runif(N, 0, dt))
        rt <- st + ev
        return(rt)
      }
      
      df <- data.frame(date=randomDatetime(1000)) %>% 
        mutate(dt = as.Date(str_sub(date, end=10)),
               time = str_sub(date, start=12),
               tm = as.numeric(hms(str_sub(date, start=12))))
      
      
      ggplot(df, aes(x = dt, y=tm)) +
        stat_density_2d(aes(fill = stat(level)), geom = "polygon") +
        labs(x="Date", y="Time", fill=NULL) +
        scale_y_continuous(labels = function(x) format(as.POSIXct((x), origin = Sys.Date(), tz = "UTC"), "%H:%M:%S")) +
        theme(legend.position = "none")
      

      【讨论】:

      • 干得好!注意你可以直接使用scale_y_time()。如果要修改 x 轴,可以修改隐含的scale_x_date()。另请注意,您可以更直接地投射:mutate(dt = as.Date(date), tm = hms(str_sub(date, start=12))))
      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 2018-08-10
      • 1970-01-01
      • 2010-12-21
      • 2010-10-22
      • 2018-06-25
      • 2020-11-25
      • 2011-05-18
      相关资源
      最近更新 更多