Как построить диаграмму, используя список данных в R - PullRequest
0 голосов
/ 28 мая 2018

У меня есть несколько фреймов данных (40) внутри списка, и мне нужен способ создать диаграмму, которую можно изменить в соответствии с выбранным фреймом данных, используя plotly или ggplot2

.пример шаблона того, как я сейчас работаю над созданием диаграммы.

aa <- c("José", "Sue")
ab <- c(10, 40)
a <- data.frame(aa,ab)

ba <- c("Marie", "Pablo")
bb <- c(25, 20)
b <- data.frame(ba,bb)

ca <- c("Elizabeth", "Mike")
cb <- c(50, 20)
c <- data.frame(ca,cb)

abc <- list(a,b,c)

names(abc) <- c("a","b","c")



p <- plot_ly() %>%
  add_trace(type = 'bar', x = abc$a$aa,
            y = abc$a$ab, visible=T, marker = list(color = 'blue'))  %>%

  add_trace(type = 'bar',x = abc$b$ba,
            y = abc$b$bb, visible=F, marker = list(color = 'red')) %>%

  add_trace(type = 'bar', x = abc$b$ba,
            y = abc$c$cb, visible=F, marker = list(color = 'yellow'))  %>%

  layout(
    updatemenus = list(
      list(
        yanchor = 'auto',
        buttons = list(
          list(method = "restyle",
               args = list("visible", list(T, F,F)),
               label = 'a'),

          list(method = "restyle",
               args = list("visible", list(F,T, F)),
               label = 'b'),

          list(method = "restyle",
               args = list("visible", list(F, F,T)),
               label = 'c')
        ))))
p

Пример: (p) Ссылка на графику

Мне нужен способпереопределить создание нескольких add_trace, используя x = abc $ a $ aa и y = abc $ a $ ab, для каждого кадра данных, к которому осуществляется доступ в списке.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Я настроил ваш код для запуска в цикле

library(plotly)

p <- plot_ly() 
layout_buttons <- list()
color_list <- palette()  #color list - you may define your own list of colors here
visible_default_layout <- c(T, rep(F, length(abc)-1))    

for (i in seq_along(abc)){
  p <- p %>% add_trace(x = abc[[i]][[1]], y = abc[[i]][[2]], 
                       type = 'bar', visible=visible_default_layout[i], marker = list(color = color_list[i]))

  visible_layout <- rep(F, length(abc))
  visible_layout[i] <- T
  layout_buttons[[i]] <- list(method = "restyle",
                              args = list("visible", as.list(visible_layout)),
                              label = names(abc)[i])
  }

p <- p %>%
  layout(updatemenus = list(list(yanchor = 'auto', buttons = layout_buttons)))
p

Надеюсь, это поможет!

Пример данных:

abc <- structure(list(a = structure(list(aa = structure(1:2, .Label = c("José", 
"Sue"), class = "factor"), ab = c(10, 40)), .Names = c("aa", 
"ab"), row.names = c(NA, -2L), class = "data.frame"), b = structure(list(
    ba = structure(1:2, .Label = c("Marie", "Pablo"), class = "factor"), 
    bb = c(25, 20)), .Names = c("ba", "bb"), row.names = c(NA, 
-2L), class = "data.frame"), c = structure(list(ca = structure(1:2, .Label = c("Elizabeth", 
"Mike"), class = "factor"), cb = c(50, 20)), .Names = c("ca", 
"cb"), row.names = c(NA, -2L), class = "data.frame")), .Names = c("a", 
"b", "c"))
0 голосов
/ 28 мая 2018

Построение всех данных из списка data.frames может быть выполнено с помощью базовых функций.

par(mfrow = c(1, length(abc)))    # optional, divides plotting area
lapply(abc, FUN = function(x) barplot(x[, 2], names.arg = x[, 1]))

Однако для переопределения существующего графика необходим шаг выбора требуемых data.frame

i <- readline("Enter the name of the data: ")

или цикл, который ожидает, пока пользователь не просмотрит данные

for(i in 1:length(abc)){
   ...
   waiting <- readline("Press enter to view next plot")
}

В обеих альтернативах i будет содержать имя или номер списка с соответствующим data.frame.Затем мы можем использовать его для выбора данных для построения графика.Обратите внимание, что элементы из списка извлекаются в двойных квадратных скобках и из data.frame с одинарными квадратными скобками.

# finds plotting area limits
lims <- max(unlist(lapply(abc, function(x) x[,2])))
# plots chosen data
barplot(abc[[i]][,2], names.arg = abc[[i]][,1], ylim = c(0, lims))
...