R 在变化的绘图动画中映射颜色

R 在变化的绘图动画中映射颜色,r,plotly,R,Plotly,我想生成一个plot\u ly plot,在这里我使用按钮更改plot的内容。 如果我定义单个轨迹的颜色(如下所示),这一切都很好: Mn <- rnorm(100, 100, 10) Fe <- rnorm(100, 20000, 1000) In <- rnorm(100, 5000, 400) n <- c(1:100) df <- tibble(n, Mn, Fe, In, ) df <- mutate(df, name=if_else(n <

我想生成一个plot\u ly plot,在这里我使用按钮更改plot的内容。 如果我定义单个轨迹的颜色(如下所示),这一切都很好:

Mn <- rnorm(100, 100, 10)
Fe <- rnorm(100, 20000, 1000)
In <- rnorm(100, 5000, 400)
n <- c(1:100)
df <- tibble(n, Mn, Fe, In, )

df <- mutate(df, name=if_else(n < 30, "stage1", if_else(30<n & n<73, "stage2", "stage3")))

p <- plot_ly(df, x= ~n) %>%
  add_markers(y = ~Mn, visible = F) %>% 
  add_markers(y = ~Fe, visible = F) %>% 
  add_markers(y = ~In, visible = F) %>% 
    layout(
      updatemenus = list(
        list(
          yanchor = 'auto',
          buttons = list(
            list(method = "rescale",
                 args = list("visible", list(T, F,F)),
                 label = 'Mn'),
            list(method = "rescale",
                 args = list("visible", list(F,T,F)),
                 label = 'Fe'),
            list(method = "rescale",
                 args = list("visible", list(F,F,T)),
                 label = 'In')
          ))))

Mn让我们试试这个。希望它在你的R上也能起作用

p <- plot_ly(df, x=~n, color = ~as.factor(name)) %>%
  add_markers(y = ~Mn)  %>% 
  add_markers(y = ~Fe, visible = F) %>%
  add_markers(y = ~In, visible = F) %>% 
  layout(
    updatemenus = list(
      list(
        yanchor = "auto",
        buttons = list(
          list(method = "rescale",
               args = list("visible", list(T, T, T, F, F, F, F, F, F, T, F, F)),
               label = 'Mn'),
          list(method = "rescale",
               args = list("visible", list(F, F, F, T, T, T, F, F, F, F, T, F)),
               label = 'Fe'),
          list(method = "rescale",
               args = list("visible", list(F, F, F, F, F, F, T, T, T, F, F, T)),
               label = 'In')
        ))))
p%
添加_标记(y=~Mn)%>%
添加_标记(y=~Fe,visible=F)%>%
添加_标记(y=~In,可见=F)%>%
布局(
updatemenus=列表(
名单(
yanchor=“自动”,
按钮=列表(
列表(method=“rescale”,
args=list(“可见”,list(T,T,T,F,F,F,F,F,F,T,F,F)),
标签='Mn'),
列表(method=“rescale”,
args=list(“可见”,list(F、F、F、T、T、F、F、F、F、T、F)),
标签='Fe'),
列表(method=“rescale”,
args=list(“可见”,list(F,F,F,F,F,T,T,T,F,F,F,T)),
标签='In')
))))
诀窍在于
args=list(“可见”,list(T,F,F))
。假设有三个层,因为有三个图。但每一种颜色或阶段也是一层。所以实际上你必须在“可见”参数中定义12层。因此,您需要
args=list(“可见”,list(T、T、T、F、F、F、F、F、T、F、F))

前三层(T/F)是第一个图中的三个阶段,后三层是第二个图中的阶段。接下来的三层是第三个情节的三个阶段。每个图至少有三层

因此
args=list(“可见”,list(T,T,T,F,F,F,F,T,F,F))
意味着显示第一个图中的三个阶段(T,T,T),不显示第二个和第三个图中的三个阶段(F,F,F,F,F),并显示第一个图的标记,但不显示第二个和第三个图(T,F,F,F)


编辑:我刚刚发现,您可能不必为绘图指定最后三个图层。如果只指定九个阶段就足够了,这样就可以删除最后三个逻辑。

效果很好。感谢我的最后一个情节,我有14个不同的“样本”,也就是说有14种不同的颜色。在那里,可见的论点变得相当混乱,但它是有效的。
p <- plot_ly(df) %>%
  add_markers(x=~n, y = ~Mn, visible = F, color = ~name)  %>% 
  add_markers(x=~n, y = ~Fe, visible = F, color = ~name) %>%
  add_markers(x=~n, y = ~In, visible = F, color = ~name) %>% 
layout(
    updatemenus = list(
      list(
        yanchor = 'auto',
        buttons = list(
          list(method = "rescale",
               args = list("visible", list(T, F,F)),
               label = 'Mn'),
          list(method = "rescale",
               args = list("visible", list(F,T,F)),
               label = 'Fe'),
          list(method = "rescale",
               args = list("visible", list(F,F,T)),
               label = 'In')
        ))))
p <- plot_ly(df, x=~n, color = ~as.factor(name)) %>%
  add_markers(y = ~Mn)  %>% 
  add_markers(y = ~Fe, visible = F) %>%
  add_markers(y = ~In, visible = F) %>% 
  layout(
    updatemenus = list(
      list(
        yanchor = "auto",
        buttons = list(
          list(method = "rescale",
               args = list("visible", list(T, T, T, F, F, F, F, F, F, T, F, F)),
               label = 'Mn'),
          list(method = "rescale",
               args = list("visible", list(F, F, F, T, T, T, F, F, F, F, T, F)),
               label = 'Fe'),
          list(method = "rescale",
               args = list("visible", list(F, F, F, F, F, F, T, T, T, F, F, T)),
               label = 'In')
        ))))