Есть ли способ использовать facet_grid с интерактивным plot_ly в R? - PullRequest
1 голос
/ 13 марта 2020

Я ищу несколько советов о том, как использовать facet_grid или subplot в моем примере ниже. Желаемый результат будет: сетка отдельных гистограмм с выпадающим списком переменной "pra c". Я пробовал оба subplot() и facet_grid, но еще не получил создать соответствующий вывод. Ниже показано, как я пытался включить facet_grid(). Любые советы?

library(tidyverse)
library(plotly)


period <- c('201901', '201901', '201904', '201905')
spec <- c('alpha', 'bravo','bravo', 'charlie')
prac <- c('mine','yours','yours','mine')
c <-  c(5,6,3,8)
e <- c(1,2,4,5)

df <- data.frame(period, spec,prac, c,e)


spec.val <- unique(df$spec)
ggplot(plot_ly(
  df %>% pivot_longer(-c(period, spec, prac)),
  x = ~period, y = ~value, color = ~name,
  type = "bar",
  transforms = list(
    list(
      type = "filter",
      target = ~spec,
      operation = "=",
      value = spec.val[1]))) %>%
  layout(
    updatemenus = list(
      list(
        type = "drowdown",
        active = 0,
        buttons = map(spec.val, ~list(
          method = "restyle",
          args = list("transforms[0].value", .x),
          label = .x))))) + facet_grid(~prac))

РЕДАКТИРОВАТЬ:

Я пытался добавить al oop, чтобы создать несколько графиков. Это не работает, но концептуально я думаю, что это может решить мою проблему. Есть идеи, что я делаю не так? Ниже не генерируется вывод (или ошибки).

spec.val <- unique(df$spec)
for (p in unique(df$prac)) {
  x <- subset(df, prac == p)
    (plot_ly(
      df %>% pivot_longer(-c(period, spec, prac)),
      x = ~period, y = ~value, color = ~name,
      type = "bar",
      transforms = list(
        list(
          type = "filter",
          target = ~spec,
          operation = "=",
          value = spec.val[1]))) %>%
      layout(
        updatemenus = list(
          list(
            type = "drowdown",
            active = 0,
            buttons = map(spec.val, ~list(
              method = "restyle",
              args = list("transforms[0].value", .x),
              label = .x)))))
      )  
}

1 Ответ

1 голос
/ 13 марта 2020

Вы можете сделать два отдельных графика и объединить их с subplot:

library(tidyverse)
library(plotly)


period <- c('201901', '201901', '201904', '201905')
spec <- c('alpha', 'bravo','bravo', 'charlie')
prac <- c('mine','yours','yours','mine')
c <-  c(5,6,3,8)
e <- c(1,2,4,5)

df <- data.frame(period, spec,prac, c,e)

spec.val <- unique(df$spec)

df.m <- dplyr::filter(df, prac=="mine") %>% pivot_longer(-c(period, spec, prac)) 
df.y <- dplyr::filter(df, prac=="yours") %>% pivot_longer(-c(period, spec, prac))


p1 <- plot_ly(
    df.m,
    x = ~period, y = ~value, color = ~name,
    type = "bar",
    transforms = list(
        list(
            type = "filter",
            target = ~spec,
            operation = "=",
            value = spec.val[1]))) %>%
    layout(
        updatemenus = list(
            list(
                type = "drowdown",
                active = 0,
                buttons = map(spec.val, ~list(
                    method = "restyle",
                    args = list("transforms[0].value", .x),
                    label = .x)))))

p2 <- plot_ly(
    df.y,
    x = ~period, y = ~value, color = ~name,
    type = "bar",
    transforms = list(
        list(
            type = "filter",
            target = ~spec,
            operation = "=",
            value = spec.val[1]))) %>%
    layout(
        updatemenus = list(
            list(
                type = "drowdown",
                active = 0,
                buttons = map(spec.val, ~list(
                    method = "restyle",
                    args = list("transforms[0].value", .x),
                    label = .x)))))

subplot(p1, p2)

Смотрите здесь, чтобы узнать больше: Сюжет в r с сюжетом

Редактировать: В более общем плане вы можете создать список графиков и графиков, используя субплот:


library(tidyverse)
library(plotly)


period <- c('201901', '201901', '201904', '201905')
spec <- c('alpha', 'bravo','bravo', 'charlie')
prac <- c('mine','yours','yours','mine')
c <-  c(5,6,3,8)
e <- c(1,2,4,5)

df <- data.frame(period, spec, prac, c,e)

spec.val <- unique(df$spec)

getPlots <- function(x){
    df.m <- dplyr::filter(df, prac==x) %>% pivot_longer(-c(period, spec, prac)) 
    plot_ly(
        df.m,
        x = ~period, y = ~value, color = ~name,
        type = "bar",
        transforms = list(
            list(
                type = "filter",
                target = ~spec,
                operation = "=",
                value = spec.val[1]))) %>%
        layout(
            updatemenus = list(
                list(
                    type = "drowdown",
                    active = 0,
                    buttons = map(spec.val, ~list(
                        method = "restyle",
                        args = list("transforms[0].value", .x),
                        label = .x)))))

}

plotlist <- lapply(levels(df$prac), getPlots)

subplot(plotlist)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...