我有一個像這樣的資料框(一個小標題):
library(tidyverse)
library(lubridate)
x = tibble(date=c("2022-04-25 07:04:07", "2022-04-25 07:09:07", "2022-04-25 07:14:07", "2022-04-26 07:04:07"),
value=c("on", "off", "on", "off"))
x$day<- as.factor(day(x$date))
x$time <- paste0(str_pad(hour(x$date),2,pad="0"),":",str_pad(minute(x$date),2,pad="0"))
當我繪制資料時:
x %>% ggplot() geom_col(aes(x=day,y=time, fill=value))

y 軸上的時間不跟隨條形。每次資料都應該與每個條形段并排。我嘗試使用as.factor(time)但沒有解決。我還嘗試添加數字刻度:
x = tibble(date=c("2022-04-25 07:04:07", "2022-04-25 07:09:07", "2022-04-25 07:14:07", "2022-04-26 07:04:07"),
fake_y=c(1,1,1,1)
value=c("on", "off", "on", "off"))
x %>% ggplot() geom_col(aes(x=day,y=fake_y, fill=value))
但隨后開/關條的順序丟失了。
我怎樣才能解決這個問題?
uj5u.com熱心網友回復:
由于您正在尋找時間線,因此您最好使用geom_segment而不是geom_col. 原因是由于您可能在一天內有多個“開”或“關”值,因此很難讓這些值正確疊加。您還需要diff開關時間才能讓它們堆疊起來。此外,如果“關閉”表示從開啟狀態變為關閉狀態的時間,則使用列的標簽將是錯誤的。
在 R 中處理時間時,通常最好將它們保持為時間格式以進行繪圖。如果在繪圖之前將時間轉換為字串,它們將被解釋為因子水平,因此不會按比例正確間隔。
由于您想讓一天沿著一個軸,您將需要相當多的資料操作來確保您記錄每天開始和結束時的狀態,但可以通過執行以下操作來實作:
p <- x %>%
mutate(date = as.POSIXct(date)) %>%
mutate(day = as.factor(day(date))) %>%
group_by(day) %>%
group_modify(~ add_row(.x,
date = floor_date(as.POSIXct(first(.x$date)), 'day'),
value = ifelse(first(.x$value) == 'on', 'off', 'on'),
.before = 1)) %>%
group_modify(~ add_row(.x,
date = ceiling_date(as.POSIXct(last(.x$date)), 'day') - 1,
value = last(.x$value))) %>%
mutate(ends = lead(date)) %>%
filter(!is.na(ends)) %>%
mutate(date = hms::as_hms(date), ends = hms::as_hms(ends)) %>%
ggplot(aes(x = day, y = date))
geom_segment(aes(xend = day, yend = ends, color = value),
size = 20)
coord_cartesian(ylim = c(25120, 26500))
labs(y = 'time')
guides(color = guide_legend(override.aes = list(size = 8)))
p

當然,如果您愿意,您可以輕松翻轉坐標,并應用主題元素使情節更具吸引力:
p coord_flip(ylim = c(25120, 26500))
scale_color_manual(values = c('deepskyblue4', 'orange'))
theme_light(base_size = 16)

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/466716.html
下一篇:如何避免重疊注釋?
