R 控制geom_line()图表中的日期(x轴)间隔

R 控制geom_line()图表中的日期(x轴)间隔,r,datetime,ggplot2,R,Datetime,Ggplot2,我已经成功地将股票市场的日期和时间数据转换成POSIXct并绘制出来。但是,由于市场在特定时间开盘和收盘,我的图表看起来很尴尬,下面的长线将收盘时间连接起来 我希望我的图表如下所示,关闭的时段不可见,日期从周一开始 我很感激你能帮我做这件事。这是我的代码和一些示例数据 hongkongstocks <- read.csv(file="Data/hong-kong-stocks-copy.csv", stringsAsFactors = FALSE) dateOnly

我已经成功地将股票市场的日期和时间数据转换成POSIXct并绘制出来。但是,由于市场在特定时间开盘和收盘,我的图表看起来很尴尬,下面的长线将收盘时间连接起来

我希望我的图表如下所示,关闭的时段不可见,日期从周一开始

我很感激你能帮我做这件事。这是我的代码和一些示例数据

hongkongstocks <- read.csv(file="Data/hong-kong-stocks-copy.csv", stringsAsFactors = FALSE)
dateOnlyhongkongstocks <- as.POSIXct(hongkongstocks$Date, format="%m/%d/%y %H:%M" #format time)
ggplot(hongkongstocks, aes(x=dateOnlyhongkongstocks, y=Hang.Seng)) + geom_line()

Sample data
Date Hang.Seng
5/25/20 9:30    100.00
5/25/20 9:35     98.28
5/25/20 9:40     98.46
5/25/20 9:45     99.11

正如其他人所评论的,一种方法是从使日期时间数据连续开始。通过为一天中的所有时间创建记录,这最终将有助于图形输出。当
Hang.Seng
值不存在时,
Hang.Seng
NA
且不会显示任何数据(而不是用直线将这些间隙随时间链接)

您可以使用(非常有用的)软件包
padr
轻松地完成这项工作,该软件包将在开始数据集中以最小时间步长“填充”或填写您的时间序列,为您提供一个完整、规则间隔的连续时间记录

library(tidyverse)
library(lubridate)
library(padr)

hongkongstocks %>% 
  pad() %>%
  ggplot(aes(x=Date, y=Hang.Seng)) + 
  geom_line()+
  scale_x_datetime(limits = c(as_datetime("2020-05-25 00:00:00"), as_datetime("2020-05-26 23:55:00")), 
                   date_breaks = 'day', 
                   date_labels = '%a')

但是,即使在白天,当市场开放时,这个图表也有缺口。创建连续数据集会暴露数据中的其他缺口。如果希望以原始图形自动完成的方式(通过在可用数据点之间绘制直线)闭合这些间隙,可以。一种选择是创建一个额外的变量来定义市场何时“开放”和“关闭”(我选择了9:00-16:00),然后只删除那些
Hang.Seng
NA
但市场开放的记录。这样一来,
ggplot
将只填补开放时间内的空白,而不会在市场应该关闭的一夜之间连接数据点

library(hms)
library(zoo)

hongkongstocks %>% 
  pad() %>%
  mutate(Time = as_hms(Date), #create a separate Time variable
         market_status = if_else((Time >= as_hms("09:00:00") & Time <= as_hms("16:00:00")), "open", "closed")) %>% # create a new market_status variable based on Time
  filter((market_status == "open" & !is.na(Hang.Seng)) | market_status == "closed") %>% # remove records where Hang.Seng is NA, but only when market is open
  ggplot(aes(x=Date, y=Hang.Seng)) + 
  geom_line()+
  scale_x_datetime(limits = c(as_datetime("2020-05-25 00:00:00"), as_datetime("2020-05-26 23:55:00")), 
                   date_breaks = 'day', 
                   date_labels = '%a') +
  labs(x = "Day")
库(hms)
图书馆(动物园)
香港股票%>%
pad()%>%
mutate(Time=as_hms(Date))#创建一个单独的时间变量
market_status=if_else((Time>=as_hms(“09:00:00”)&Time%#基于时间创建一个新的market_status变量
过滤器((市场_状态==“打开”&!is.na(恒生))|市场_状态==“关闭”)%>%#删除恒生为na的记录,但仅在市场打开时删除
ggplot(aes(x=日期,y=恒生))+
geom_线()+
比例x日期时间(限制=c(如日期时间(“2020-05-25 00:00:00”)、日期时间(“2020-05-26 23:55:00”),
date_breaks=‘day’,
日期标签=“%a”)+
实验室(x=“日”)


资料
hongkongstocks你不能用
scale\u x_datetime
x轴来做这件事,因为x值是不连续的。我认为你最好的选择是将时间重新缩放为数值,然后用自定义标签的比例来绘图。@AllanCameron-日期比例,比如
scale\u x_datetime
是连续的,不是吗?啊,我想你不需要o从您的数据中删除数据下降的时段。由于这是在结算期间,因此这应该是一个设定的时段,因此,似乎通过一些代码,您可以剪切或过滤掉这段时间之间的数据。您能在这里与我们共享几天的数据吗?如果数据不太大,则首选sh是
dput的输出(香港股票)
直接在您的问题中,粘贴/格式化为代码。@chemdork123我在问题中添加了几天的数据。我花了一个周末的大部分时间试图解决这个问题,所以感谢您的关注。在R中,Excel或Google Sheets处理非连续数据的能力似乎要复杂得多。(我上面的第二张图表使用了相同的数据。)再次感谢-非常感谢
library(hms)
library(zoo)

hongkongstocks %>% 
  pad() %>%
  mutate(Time = as_hms(Date), #create a separate Time variable
         market_status = if_else((Time >= as_hms("09:00:00") & Time <= as_hms("16:00:00")), "open", "closed")) %>% # create a new market_status variable based on Time
  filter((market_status == "open" & !is.na(Hang.Seng)) | market_status == "closed") %>% # remove records where Hang.Seng is NA, but only when market is open
  ggplot(aes(x=Date, y=Hang.Seng)) + 
  geom_line()+
  scale_x_datetime(limits = c(as_datetime("2020-05-25 00:00:00"), as_datetime("2020-05-26 23:55:00")), 
                   date_breaks = 'day', 
                   date_labels = '%a') +
  labs(x = "Day")
hongkongstocks <- structure(list(Date = structure(c(1590399000, 1590399300, 1590399600, 
1590399900, 1590400200, 1590400500, 1590400800, 1590401100, 1590401400, 
1590402000, 1590402300, 1590402600, 1590403200, 1590403500, 1590403800, 
1590404100, 1590404400, 1590404700, 1590405000, 1590405300, 1590405600, 
1590406200, 1590406800, 1590407100, 1590407400, 1590408000, 1590411900, 
1590412200, 1590412500, 1590412800, 1590413100, 1590413400, 1590413700, 
1590414600, 1590414900, 1590415200, 1590415500, 1590415800, 1590416100, 
1590416700, 1590417000, 1590417300, 1590417600, 1590417900, 1590418200, 
1590418500, 1590418800, 1590419100, 1590419400, 1590419700, 1590421200, 
1590421500, 1590421800, 1590422100, 1590422400, 1590422700, 1590485700, 
1590486000, 1590486300, 1590486600, 1590486900, 1590487200, 1590487500, 
1590487800, 1590488100, 1590488400, 1590488700, 1590489600, 1590490200, 
1590490500, 1590490800, 1590491100, 1590491400, 1590491700, 1590492000, 
1590492900, 1590493200, 1590494100, 1590498300, 1590498600, 1590498900, 
1590499200, 1590499800, 1590500100, 1590500400, 1590500700, 1590501000, 
1590501300, 1590501600, 1590501900, 1590502200, 1590502800, 1590503100, 
1590503400, 1590503700, 1590504000, 1590504300, 1590504600, 1590505200, 
1590506400, 1590507900, 1590508500), tzone = "UTC", class = c("POSIXct", 
"POSIXt")), Hang.Seng = c(100, 98.28, 98.46, 99.11, 99.74, 100.04, 
99.63, 99.77, 99.34, 99.37, 99.06, 99.13, 98.76, 98.72, 98.62, 
98.74, 98.64, 98.71, 98.93, 99.23, 98.99, 99.09, 99.02, 99.05, 
99.04, 99, 99.24, 99.19, 99.27, 99.32, 99.3, 99.33, 99.49, 99.26, 
99.21, 99.35, 99.53, 99.48, 99.51, 99.5, 99.57, 99.61, 99.76, 
99.75, 99.83, 99.97, 100.08, 99.96, 99.88, 99.87, 99.94, 99.98, 
99.99, 100.06, 100.12, 100.1, 101.41, 101.78, 102.05, 101.83, 
101.6, 101.82, 101.77, 101.92, 101.9, 101.98, 101.97, 101.86, 
101.61, 101.79, 101.8, 101.93, 101.99, 101.84, 101.74, 101.85, 
101.88, 101.94, 102.18, 102.09, 102.01, 102.02, 101.95, 101.96, 
102.06, 102.12, 102.1, 102.22, 102.17, 102.26, 102.23, 102.24, 
102.27, 102.3, 102.39, 102.36, 102.34, 102.25, 102.21, 102.13, 
102.04, 102.14)), class = c("spec_tbl_df", "tbl_df", "tbl", "data.frame"
), row.names = c(NA, -102L), spec = structure(list(cols = list(
    Date = structure(list(), class = c("collector_character", 
    "collector")), `Hang Seng` = structure(list(), class = c("collector_double", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
"collector")), skip = 1), class = "col_spec"))