直方图ggplotly-无法使其正常工作

时间:2018-09-26 15:26:49

标签: r animation histogram ggplotly

我正在尝试使用看起来像这样的代码通过ggplotly使用覆盖密度函数对直方图进行动画处理

ggplot() +
   geom_point(data_1 = aes(..some aesthetic.., frame = step)) +
   geom_hist(data_2 = aes(..some other aesthetic.., frame = step))

该代码不起作用,但是在我看来,一般直方图不适用于ggplotly。我想知道你们中的任何一个都可以帮忙。

数据

这里是一个例子; frame是用于定义动画索引的变量

# Some data (points) for the first aes
df_1 = data.frame(x = 1:10, y = 1:10, frame = 1:10)

# Other data (for each frame multiple values from 3 groups)
df_2 = lapply(1:10, function(w)
         data.frame(
            val = runif(10, min = w, max = w + 1),  # Value
            code = sample(1:3, 10, replace = TRUE), # Color for fill
            frame = w)
         )
df_2 = Reduce(rbind, df_2)

积分 ggplots具有完美的渲染效果,动画ggplotly(pl)也具有完美的渲染效果。

pl = ggplot() + 
   geom_point(data = df_1, aes(x, y, frame = frame)) 

# OK!
print(pl)
plotly::ggplotly(pl)

直方图

ggplots呈现完美。

gg_pl = ggplot() +
   geom_histogram(data = df_2, aes(
       val, 
       fill = factor(code), 
       frame = frame)) +
    scale_fill_brewer()

# OK
print(gg_pl)

但是通过ggplotly进行的渲染会崩溃

# Error!
plotly::ggplotly(gg_pl)
  

-data $ group中的错误:一元运算符的参数无效

直方图+点

和以前一样,ggplot有效,但动画无效。

pl = ggplot() + 
   geom_point(data = df_1, aes(x, y, frame = frame)) + 
   geom_histogram(data = df_2, 
        aes(val, fill = factor(code), frame = frame))

# OK!
print(pl)

# Errors as before
plotly::ggplotly(pl)

1 个答案:

答案 0 :(得分:0)

这并不是您要寻找的,但这只是一个开始,也许有帮助。这是使用plot_ly的动画直方图。

library(plotly)
p = df_2 %>% 
  plot_ly(x=~val, 
          type='histogram', 
          color=~code,
          frame=~frame, 
          alpha=0.7)
p 

我无法使这些点与直方图进行动画处理,但是上面的点却是相同的。如果取消注释#frame=~frame线,则这些点将产生动画,但直方图将消失,除了第一帧和最后一帧。

  p = plot_ly() %>%
  add_histogram(data=df_2, 
                x=~val, 
                color=~code, 
                frame=~frame)%>%
  add_trace(data=df_1, 
            x=~x, 
            y=~y, 
            frame=~frame, 
            type='scatter', 
            mode='markers')
p %>% animation_opts(easing='linear')