ggvis 图上的交互式日期时间输入
Interactive datetime input on ggvis plots
假设您想要在 X 轴上使用日期时间数据制作交互式 ggvis
图:即您希望能够放大图中的特定时间。
这是否 a) 可能 b) 有任何解决方法或 c) 由另一个软件包更好地解决?
以本例数据和绘图为例:
library(ggvis)
df <- data.frame(time = rep(as.POSIXct("2013-10-10")+(1:100)*60^2,2),
treatment = c(rep("a",100),rep("b",100)), rate = rnorm(200,0.3,.01),
upper = rnorm(200,0.4,.01), lower = rnorm(200,0.2,.01))
df %>%
group_by(treatment) %>%
ggvis(~time,~rate,stroke=~treatment) %>%
layer_ribbons(y=~upper,y2=~lower,fill=~treatment,opacity:=0.2) %>%
layer_lines() %>%
scale_datetime("x", nice = "hour")
我认为这个问题最好用另一个包来解决,因为 ggvis
不能很好地处理这个任务。作为替代方案,我们可以使用 dygraphs
和 dyRangeSelector()
首先,我们以宽格式重塑数据:
library(tidyr)
x <- df %>%
gather(key, value, -(time:treatment)) %>%
unite(t, treatment, key) %>%
spread(t, value)
这会给你:
> head(x)
# time a_lower a_rate a_upper b_lower b_rate b_upper
#1 2013-10-10 01:00:00 0.1988794 0.2903746 0.4031802 0.2089536 0.2851947 0.3850488
#2 2013-10-10 02:00:00 0.1997263 0.3012017 0.4030821 0.1935425 0.3103502 0.4047333
#3 2013-10-10 03:00:00 0.1999701 0.2908635 0.3992913 0.1996834 0.2978400 0.3904020
#4 2013-10-10 04:00:00 0.2045941 0.2947663 0.4140974 0.2184334 0.2969331 0.3979316
#5 2013-10-10 05:00:00 0.1801551 0.3167674 0.4180428 0.1842388 0.2974034 0.3987412
#6 2013-10-10 06:00:00 0.1986528 0.2946848 0.3887903 0.1992093 0.3093617 0.4051101
然后,我们创建一个xts
对象:
library(xts)
y <- xts(x[-1], order.by = x$time)
最后,我们生成绘图。
library(dygraphs)
dygraph(y, main = "A nice dygraph with range selector") %>%
dyAxis("x", drawGrid = FALSE) %>%
dySeries(c("a_lower", "a_rate", "a_upper"), label = "a") %>%
dySeries(c("b_lower", "b_rate", "b_upper"), label = "b") %>%
dyRangeSelector()
您可以使用鼠标选择或范围选择器进行缩放
假设您想要在 X 轴上使用日期时间数据制作交互式 ggvis
图:即您希望能够放大图中的特定时间。
这是否 a) 可能 b) 有任何解决方法或 c) 由另一个软件包更好地解决?
以本例数据和绘图为例:
library(ggvis)
df <- data.frame(time = rep(as.POSIXct("2013-10-10")+(1:100)*60^2,2),
treatment = c(rep("a",100),rep("b",100)), rate = rnorm(200,0.3,.01),
upper = rnorm(200,0.4,.01), lower = rnorm(200,0.2,.01))
df %>%
group_by(treatment) %>%
ggvis(~time,~rate,stroke=~treatment) %>%
layer_ribbons(y=~upper,y2=~lower,fill=~treatment,opacity:=0.2) %>%
layer_lines() %>%
scale_datetime("x", nice = "hour")
我认为这个问题最好用另一个包来解决,因为 ggvis
不能很好地处理这个任务。作为替代方案,我们可以使用 dygraphs
和 dyRangeSelector()
首先,我们以宽格式重塑数据:
library(tidyr)
x <- df %>%
gather(key, value, -(time:treatment)) %>%
unite(t, treatment, key) %>%
spread(t, value)
这会给你:
> head(x)
# time a_lower a_rate a_upper b_lower b_rate b_upper
#1 2013-10-10 01:00:00 0.1988794 0.2903746 0.4031802 0.2089536 0.2851947 0.3850488
#2 2013-10-10 02:00:00 0.1997263 0.3012017 0.4030821 0.1935425 0.3103502 0.4047333
#3 2013-10-10 03:00:00 0.1999701 0.2908635 0.3992913 0.1996834 0.2978400 0.3904020
#4 2013-10-10 04:00:00 0.2045941 0.2947663 0.4140974 0.2184334 0.2969331 0.3979316
#5 2013-10-10 05:00:00 0.1801551 0.3167674 0.4180428 0.1842388 0.2974034 0.3987412
#6 2013-10-10 06:00:00 0.1986528 0.2946848 0.3887903 0.1992093 0.3093617 0.4051101
然后,我们创建一个xts
对象:
library(xts)
y <- xts(x[-1], order.by = x$time)
最后,我们生成绘图。
library(dygraphs)
dygraph(y, main = "A nice dygraph with range selector") %>%
dyAxis("x", drawGrid = FALSE) %>%
dySeries(c("a_lower", "a_rate", "a_upper"), label = "a") %>%
dySeries(c("b_lower", "b_rate", "b_upper"), label = "b") %>%
dyRangeSelector()
您可以使用鼠标选择或范围选择器进行缩放