通过使用字符类型变量dateChr,OP 选择了一个离散 x 轴。
scale_x_discrete() 函数可用于自定义离散轴的外观。根据help("discrete_scale"),它需要一个break 参数来控制中断(和标签)。 break 的一种可能输入类型是
一个函数,当使用单个参数调用时,一个字符
给出尺度范围的向量,返回一个字符向量
指定要显示的中断。
所以,额外调用scale_x_discrete()
library(ggplot2)
ggplot() +
geom_line(data = Data, aes(x = dateChr, y = val1, group=1), color = "red") +
geom_line(data = Data, aes(x = dateChr, y = val2, group=1), color = "blue") +
theme_bw() +
xlab("Date") +
ylab("Value") +
scale_x_discrete(breaks = function(x) x[seq(1, length(x), by = 4*24)])
我们得到
每 4 天显示一次休息和标签。
现在,OP 已要求仅显示日期(无小时或时间戳)。这需要操作dateChr,但仅用于绘制标签:
# define named functions for breaks
my_breaks <- function(x) x[seq(1, length(x), by = 4*24)]
library(ggplot2)
ggplot() +
geom_line(data = Data, aes(x = dateChr, y = val1, group=1), color = "red") +
geom_line(data = Data, aes(x = dateChr, y = val2, group=1), color = "blue") +
theme_bw() +
xlab("Date") +
ylab("Value") +
scale_x_discrete(breaks = my_breaks,
labels = my_breaks(stringr::str_sub(Data$dateChr, 1, 10)))
数据
不幸的是,OP 没有提供数据来重现图表。所以,我必须自己制作模拟 OP 数据的样本数据集。
df1 <- data.table::fread("https://tidesandcurrents.noaa.gov/api/datagetter?product=wind&application=NOS.COOPS.TAC.MET&begin_date=20150101&end_date=20150114&station=8594900&time_zone=GMT&units=metric&interval=h&format=csv")
df2 <- data.table::fread("https://tidesandcurrents.noaa.gov/api/datagetter?product=wind&application=NOS.COOPS.TAC.MET&begin_date=20150101&end_date=20150114&station=8638999&time_zone=GMT&units=metric&interval=h&format=csv")
Data <- data.frame(dateChr = format(as.POSIXct(df1$`Date Time`), "%d/%m%/%Y %H:%M"),
val1 = df1$Speed, val2 = df2$Speed, stringsAsFactors = FALSE)
str(Data)
'data.frame': 336 obs. of 3 variables:
$ dateChr: chr "01/01/2015 00:00" "01/01/2015 01:00" "01/01/2015 02:00" "01/01/2015 03:00" ...
$ val1 : num 1.42 0.51 0.91 2.08 1.3 1.27 2.08 2.33 1.7 1.95 ...
$ val2 : num 1.1 0.1 2.7 3.5 4 4.1 4.1 4 3.8 4.4 ...