Как манипулировать (используя манипулирование pkg) ggplot2 с осью с отметкой времени?

Я хотел бы создать интерактивный график (используя пакет манипулирования, который поставляется с RStudio), который имеет время как ось X. Пользователь должен иметь возможность использовать ползунки на этой оси для изменения x-пределов графика, но я не могу этого добиться. Код, воспроизводящий ошибку:

require(manipulate)  
df <- data.frame(time=seq(ISOdate(2000,1,1),by="month",length.out=100),y=rnorm(100))

# This would do a standard - non interactive - ggplot
#ggplot(df,aes(x=time,y=y))+  
#geom_line()+  
#scale_x_datetime(limits=c(min(time),max(time)))

# This tries to do the interactive plot
manipulate(  
{ggplot(df,aes(x=time,y=y))+  
geom_line()+  
scale_x_datetime(limits=c(x.min,x.max))},  
x.min=slider(min(time),max(time)),  
x.max=slider(min(time),max(time))
)

который возвращает error in slider(min(time), max(time)) : min, max, and initial must all be numeric values

Если у кого-нибудь есть идеи о том, как сделать такой сюжет, помощь будет оценена по достоинству.


person Jehol    schedule 23.03.2014    source источник


Ответы (1)


Кажется, что manipulate() и slider() не могут напрямую использовать данные дат. Обходным решением было бы преобразовать минимальное и максимальное значения time внутри функции slider() в числовые. Потом в scale_x_datetime() сделать наоборот - преобразовать x.min и x.max в POSIXct. Ползунок будет отображать числовые значения (не даты), но на графике вы получите даты по оси X.

manipulate(  
{ggplot(df,aes(x=time,y=y))+  
   geom_line()+  
   scale_x_datetime(limits=c(as.POSIXct(x.min,origin = "1970-01-01"),
                             as.POSIXct(x.max,origin = "1970-01-01")))},  
x.min=slider(as.numeric(min(df$time)),as.numeric(max(df$time))),  
x.max=slider(as.numeric(min(df$time))+2,as.numeric(max(df$time)))
)
person Didzis Elferts    schedule 23.03.2014
comment
Оно работает. Подождем обычно принятой 24-часовой задержки, прежде чем проголосовать за этот ответ, но он определенно выполняет свою работу. Спасибо. - person Jehol; 23.03.2014