R ggvis日期滑块,用于交互式图形
我正在尝试用ggvis制作一个交互式时间序列图,其中有一个默认使用所有数据的滑块,但当向右滑动时,将按月剪切最旧的数据。数据是每月一次的,但我不知道如何使它工作。考虑:R ggvis日期滑块,用于交互式图形,r,data-visualization,ggvis,R,Data Visualization,Ggvis,我正在尝试用ggvis制作一个交互式时间序列图,其中有一个默认使用所有数据的滑块,但当向右滑动时,将按月剪切最旧的数据。数据是每月一次的,但我不知道如何使它工作。考虑: retail <- data.frame(Date = seq.Date(as.Date(parse_date_time("1/1/2007", "%m/%d/%y")) , as.Date(parse_date_time("2/1/2017", "%m/%d/%y"))
retail <- data.frame(Date = seq.Date(as.Date(parse_date_time("1/1/2007", "%m/%d/%y"))
, as.Date(parse_date_time("2/1/2017", "%m/%d/%y")),
by="month"),
Measure = rnorm(122))
u <- melt(retail, id="Date", measure = "Measure")
# Works for static graph
u %>%
ggvis(~Date, ~value)
# Defaults to daily slider, no data displayed
u %>%
ggvis(~Date,~value) %>%
layer_lines(input_slider(min(u$Date), max(u$Date), value=min(u$Date)))
零售%
ggvis(~Date,~value)%>%
图层线(输入滑块(最小值(u$日期),最大值(u$日期),值=最小值(u$日期)))
我无法让滑块控制日期变量,它一直默认为daily。我注意到它在文档中默认为daily,但我找不到一个解决方法来强制它处理非日常数据。为了可读性,让我们在外部创建dataSlider:
library(lubridate) # for ceiling_date()
dateSlider <- input_slider(min=min(u$Date), max=max(u$Date), c(min(u$Date),
max(u$Date)), map = function(x) ceiling_date(x, "month") )
编辑:删除以下前后的空白:
dateSlider2 <- input_slider(min=min(u$Date), max=max(u$Date), c(min(u$Date),
max(u$Date)), map = function(x) floor_date(x, "month") )
u %>%
ggvis(~Date,~value) %>%
layer_lines() %>%
scale_datetime("x", nice="month", expand=0, domain = dateSlider2,
clamp = TRUE, override=TRUE)
dateSlider2%
ggvis(~Date,~value)%>%
层线()%>%
scale_datetime(“x”,nice=“month”,expand=0,domain=dateSlider2,
钳制=真,覆盖=真)
这很完美,但您知道为什么图表默认为我的最早数据点之前的日期吗?(在本例中,最左边的x轴不是从2007年开始的,因此滑块具有误导性)。您是指第一个数据点之前的空白区域吗?这可以通过nice
和expand
控制。请看我的编辑。再次感谢你,这非常有效。我现在遇到了一个问题,当我删除最新数据时,我的系列的最后一个数据点“粘”在绘图的右侧。既然我的问题得到了回答,我接受了,但是如果你知道解决这个问题的任何方法,那就太好了!
dateSlider2 <- input_slider(min=min(u$Date), max=max(u$Date), c(min(u$Date),
max(u$Date)), map = function(x) floor_date(x, "month") )
u %>%
ggvis(~Date,~value) %>%
layer_lines() %>%
scale_datetime("x", nice="month", expand=0, domain = dateSlider2,
clamp = TRUE, override=TRUE)