如何使用时间变量正确格式化 x 轴?
how to format properly the x axis with a time variable?
考虑这个简单的例子
tibble(date = seq.Date(from = ymd('2019-01-01'),
to = ymd('2019-06-01'),
by = 'days')) %>%
mutate(var = rnorm(n())) %>%
barchart(var ~ date, data = ., horiz = FALSE)
这里显然x轴乱了。标签太多了!如何减少日期刻度数?
理想情况下,可以像 ggplot
那样使用 scales::pretty_breaks()
函数,但在这里我什至无法手动完成:
myseq <- seq.Date(from = ymd('2019-01-01'),
to = ymd('2019-06-01'),
by = '7 days')
tibble(date = seq.Date(from = ymd('2019-01-01'),
to = ymd('2019-06-01'),
by = 'days')) %>%
mutate(var = rnorm(n())) %>%
barchart(var ~ date, data = ., horiz = FALSE,
scales = list(x = list(at = myseq, rot = 45)))
简单地删除所有 x 标签!!
你怎么看?我只需要 lattice
解决方案。
谢谢!
ggplot()
很好地默认了这个,在这种情况下打破了几个月:
library(tidyverse)
library(lubridate)
tibble(
date = seq.Date(
from = ymd('2019-01-01'),
to = ymd('2019-06-01'),
by = 'days')) %>%
mutate(var = rnorm(n())) %>%
ggplot() +
geom_line(mapping = aes(x = date, y = var))
要使用 lattice,首先将你的 tibble 存储为对象,使用 seq()
设置间隔 (at
),然后 as.Date()
设置 labels
并使用相同的 seq()
.
索引日期列
df1 <- tibble(
date = seq.Date(
from = ymd('2019-01-01'),
to = ymd('2019-06-01'),
by = 'days')) %>%
mutate(var = rnorm(n()))
df1 %>%
barchart(var ~ date, data = ., horiz = FALSE,
scales =
list(x =
list(
at = seq(1,152,7),
labels = as.Date(unlist(df1[,'date']), origin = '1970-01-01')[seq(1,152,7)],
rot = 45)
)
)
基于此的潜在格子解决方案:Decrease number of x-axis ticks (labels) in barchart
library(dplyr)
library(lubridate)
library(lattice)
tb <- tibble(date = seq.Date(from = ymd('2019-01-01'),
to = ymd('2019-06-01'),
by = 'days')) %>%
mutate(var = rnorm(n()))
dateLabs <- seq(1, nrow(tb), by=7)
scalesList <- list(x = list(rot = 45, labels = format(tb$date, "%b-%d-%Y")[dateLabs], at = dateLabs))
tb %>%
barchart(var ~ date,
data = .,
horiz = FALSE,
scales = scalesList)
考虑这个简单的例子
tibble(date = seq.Date(from = ymd('2019-01-01'),
to = ymd('2019-06-01'),
by = 'days')) %>%
mutate(var = rnorm(n())) %>%
barchart(var ~ date, data = ., horiz = FALSE)
这里显然x轴乱了。标签太多了!如何减少日期刻度数?
理想情况下,可以像 ggplot
那样使用 scales::pretty_breaks()
函数,但在这里我什至无法手动完成:
myseq <- seq.Date(from = ymd('2019-01-01'),
to = ymd('2019-06-01'),
by = '7 days')
tibble(date = seq.Date(from = ymd('2019-01-01'),
to = ymd('2019-06-01'),
by = 'days')) %>%
mutate(var = rnorm(n())) %>%
barchart(var ~ date, data = ., horiz = FALSE,
scales = list(x = list(at = myseq, rot = 45)))
简单地删除所有 x 标签!!
你怎么看?我只需要 lattice
解决方案。
谢谢!
ggplot()
很好地默认了这个,在这种情况下打破了几个月:
library(tidyverse)
library(lubridate)
tibble(
date = seq.Date(
from = ymd('2019-01-01'),
to = ymd('2019-06-01'),
by = 'days')) %>%
mutate(var = rnorm(n())) %>%
ggplot() +
geom_line(mapping = aes(x = date, y = var))
要使用 lattice,首先将你的 tibble 存储为对象,使用 seq()
设置间隔 (at
),然后 as.Date()
设置 labels
并使用相同的 seq()
.
df1 <- tibble(
date = seq.Date(
from = ymd('2019-01-01'),
to = ymd('2019-06-01'),
by = 'days')) %>%
mutate(var = rnorm(n()))
df1 %>%
barchart(var ~ date, data = ., horiz = FALSE,
scales =
list(x =
list(
at = seq(1,152,7),
labels = as.Date(unlist(df1[,'date']), origin = '1970-01-01')[seq(1,152,7)],
rot = 45)
)
)
基于此的潜在格子解决方案:Decrease number of x-axis ticks (labels) in barchart
library(dplyr)
library(lubridate)
library(lattice)
tb <- tibble(date = seq.Date(from = ymd('2019-01-01'),
to = ymd('2019-06-01'),
by = 'days')) %>%
mutate(var = rnorm(n()))
dateLabs <- seq(1, nrow(tb), by=7)
scalesList <- list(x = list(rot = 45, labels = format(tb$date, "%b-%d-%Y")[dateLabs], at = dateLabs))
tb %>%
barchart(var ~ date,
data = .,
horiz = FALSE,
scales = scalesList)