在底部编辑以包含给定的数据。
我不知道是否有一种方法可以像这样更直观地转换图表的轴。我无法弄清楚这一点。
正如其他人提到的,在代码中包含一些示例数据会很有帮助,以便解决方案可以使用它,而不必猜测和/或编写我们自己的数据。附上一张您拥有和/或想要的东西的图片也很好。
就像是:
R> head(SLEEP2)
...
无论如何,这是一种方法。它一点也不优雅,但很有效。
首先,制作一些在午夜达到峰值的“未转换”数据并将其绘制出来。我猜这看起来有点像你已经拥有的。
library(tidyverse)
library(lubridate)
start <- ymd_hm("20210101-0000")
# Make some pretend data. It's value is zero during the "day" and peaks around midnight.
secsday <- 60*60*12
df <- tibble(date_time = seq(start, start %m+% weeks(2), by=200)) %>%
mutate(time = hms::as_hms(date_time),
date = factor(date(date_time)),
values = jitter(cos(day(date_time)/30+pi*as.numeric(time)/secsday), amount=1/40),
values = ifelse(values>0, values, 0)
)
# Plot original data.
ggplot(df, aes(time, values, colour=date)) +
geom_line() +
scale_x_time(breaks=hours(seq(0,24,6)), labels=c("midnight","6AM","noon","6pm","midnight")) +
ggtitle('pre-transform')
接下来,将 AM 转换为 PM,将 PM 转换为 AM。
# Transform times so AM is PM and PM is AM (swap around noon).
dt <- df %>% mutate(time=
ifelse(time>hm("12:00"), hms::as_hms(time)-secsday, hms::as_hms(time)+secsday)
)
ggplot(dt, aes(time, values, colour=date)) +
geom_line() +
scale_x_time(breaks=hours(seq(0,24,6)), labels=c("noon", "6PM", "midnight", "6AM", "noon")) +
ggtitle('post-transform')
我想知道是否有一种方法可以通过仅调整轴而不是数据来做到这一点。
根据您提供的数据并使用栏:
dat <- data.frame(Jour=1:5,
date=seq.Date(as.Date("2020-10-01"), as.Date("2020-10-05"), "day"),
sleeptime=c("22:30","21:10","23:00","23:00", "23:20"),
waketime= c("6:30", "7:00", "7:30", "6:25","7:10"))
# make fake dates for sleep and wake
dat <- dat %>% mutate(
sleep = ymd_hm(paste(dat[1,]$date, sleeptime)),
wake = ymd_hm(paste(dat[1,]$date, waketime)),
wake = wake + ddays(ifelse(lubridate::hm(waketime)<lubridate::hm(sleeptime), 1, 0))
)
ggplot(dat, aes(xmin=sleep, xmax=wake)) +
scale_x_datetime(breaks=ymd(dat[1,]$date) + hours(seq(12,36,length.out=5)),
labels=c("noon", "6PM", "midnight", "6AM", "noon"),
limits=ymd(dat[1,]$date) + hours(seq(12,36,length.out=2))
) +
geom_rect(ymin=0.25, ymax=0.75, fill='darkgreen') +
ylim(0,1) +
facet_grid(rows = vars(date)) +
theme(axis.title = element_blank()) +
theme(axis.text.y = element_blank(),
axis.ticks = element_blank()
)