Переключение между двумя участками с группами в Plotly - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть фрейм данных с 2 столбцами, один из которых я хочу использовать в качестве переключателя (для отображения grp1 или grp2), а другой - где я хочу разбить данные на разные строки. Кажется, я не могу понять, как заставить его работать должным образом, я думаю, что должен быть простой и простой способ сделать это, но я не могу заставить себя прекратить смешивать группы. 1001 *

library(tidyverse)
library(plotly)
library(ggplot2)
# example data my group 1 would be social, group 2 would be grp
df1 = data.frame(grp = "A", social = "Facebook",
            days = c("2020-01-01","2020-01-02","2020-01-03","2020-01-04"),
            yval = c(0.1, 0.2, 0.3, 0.4))
df2 = df1
df2$grp = "B"
df2$yval = df2$yval + 0.2
df3 = df1
df3$grp = "C"
df3$yval = df3$yval + 0.4
df = rbind(df1, df2, df3)
aux = df
aux$social = "Twitter"
aux$yval = aux$yval + 0.1
df = rbind(aux, df)
rm(aux, df1, df2, df3)
df$days = as.Date(df$days)
df$social_group = paste(df$social, df$grp)

ggplot(data = df, mapping = aes(x = days, y = yval, color = social)) + geom_point() + geom_line() + facet_wrap(facets = ~social)

ggplot visualization aid

Итак, я пытаюсь создать сюжет, который позволяет мне переключаться между фасетами ggplot, переключая Facebook или Кнопка Twitter.

Это то, что я сейчас получил, что хорошо запускает , но как только я нажимаю кнопки, группы, кажется, смешиваются, чего не должно быть, если я Фильтрую по другому столбцу ...

facebook_annotations <- list(
  data=df %>% filter(social=="Facebook"),
  x=~days, 
  y=~yval,
  color = ~grp,
  hovertemplate = paste('%{x}', '<br>Hover text: %{text}<br>'),
  text=~days
)

twitter_annotations <- list(
  data=df %>% filter(social=="Twitter"),
  x=~days, 
  y=~yval,
  color = ~grp,
  hovertemplate = paste('%{x}', '<br>Hover text: %{text}<br>'),
  text=~days
)

# updatemenus component
updatemenus <- list(
  list(
    active = 0,
    type = "buttons",
    buttons = list(
      list(
        label = "Facebook",
        method = "update",
        args = list(list(visible = c(TRUE, FALSE)),
                    list(title = "Facebook",
                      annotations = list(facebook_annotations, c())))),
      list(
        label = "Twitter",
        method = "update",
        args = list(list(visible = c(FALSE, TRUE)),
                    list(title = "Twitter",
                         annotations = list(c(), twitter_annotations)))))
  )
)

fig <- df %>% plot_ly(type="scatter", mode="lines") 

fig <- fig %>% add_lines( 
  data=df %>% filter(social=="Facebook"),
  x=~days, 
  y=~yval,
  color = ~grp,
  hovertemplate = paste('%{x}', '<br>Hover text: %{text}<br>'),
  text=~days
) 

fig <- fig %>% add_lines(
  data=df %>% filter(social=="Twitter"),
  x=~days, 
  y=~yval,
  color = ~grp,
  hovertemplate = paste('%{x}', '<br>Hover text: %{text}<br>'),
  text=~days,
  visible=FALSE
) 

fig <- fig %>% layout(title="Facebook",
                      xaxis=list(title=""),
                      yaxis = list(range = c(0, 1), title = "My Title"),
                      updatemenus=updatemenus)

fig

Initial figure before interaction

When I click When I click the other

Что мне не хватает? Это сводит меня с ума, я даже рассматриваю возможность добавления каждой группы в качестве отдельного следа, но это не очень практично, когда в моем конкретном примере 8 групп ...

...