对于每一天(两周:2015-01-01
- 2015-01-15
),我有24个(小时值)使用R ggplot2包进行绘图。日期列dateChr
(character format
)如下所示:
> str(Data$dateChr)
chr [1:360] "1/1/2015 2:00" "1/1/2015 3:00" "1/1/2015 4:00" "1/1/2015 5:00"
"1/1/2015 6:00" "1/1/2015 7:00" ...
以下是我正在使用的代码:
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")
情节如下:
x-axis
看起来很糟糕。我想在x-axis
中添加中断,以便它只显示4天休息日期(没有小时或时间戳),即2015-01-01,2015-01-04,2015-01-08等等上。有人可以建议我如何添加这样的休息时间吗?
答案 0 :(得分:1)
通过使用字符类型变量dateChr
,OP已选择离散 x轴。
scale_x_discrete()
功能可用于自定义离散轴的外观。根据{{1}},它需要一个help("discrete_scale")
参数来控制中断(和标签)。 break
的一种可能输入类型是
一个函数,当用一个参数调用时,一个字符 矢量给出比例的限制,返回一个字符向量 指定要显示的中断。
因此,额外调用break
scale_x_discrete()
我们得到了
每隔4天显示一次断裂和标签。
现在,OP已要求仅显示日期(无小时或时间戳)。这需要操纵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)])
,但仅用于绘制标签:
dateChr
不幸的是,OP没有提供数据来重现图表。因此,我必须编制自己的样本数据集来模拟OP的数据。
# 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)))
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)