R:在ggplot时间序列图中的x轴(日期)中添加中断

时间:2018-02-21 16:19:19

标签: r date ggplot2 axis-labels

对于每一天(两周:2015-01-01 - 2015-01-15),我有24个(小时值)使用R ggplot2包进行绘图。日期列dateChrcharacter 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")

情节如下:

plot

x-axis看起来很糟糕。我想在x-axis中添加中断,以便它只显示4天休息日期(没有小时或时间戳),即2015-01-01,2015-01-04,2015-01-08等等上。有人可以建议我如何添加这样的休息时间吗?

1 个答案:

答案 0 :(得分:1)

通过使用字符类型变量dateChr,OP已选择离散 x轴。

scale_x_discrete()功能可用于自定义离散轴的外观。根据{{​​1}},它需要一个help("discrete_scale")参数来控制中断(和标签)。 break的一种可能输入类型是

  

一个函数,当用一个参数调用时,一个字符   矢量给出比例的限制,返回一个字符向量   指定要显示的中断。

因此,额外调用break

scale_x_discrete()

我们得到了

enter image description here

每隔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

enter image description here

数据

不幸的是,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)