динамический сюжет с использованием plot_ly из пакета R-plotly - PullRequest
1 голос
/ 09 июля 2019

Я использую блестящий и plot_ly для построения data frame.

Цель : реализовать динамический сюжет в зависимости от выбора пользователей в GUI.

Рассмотрим следующее data.table с именем pl.d

Group   OS  NP  own.OS  own.SCR  HY9    WS8
A       34  54    27      76     56     82
B       15  45    0       84     89     48
C        0  36    7       92     91     22

в server.R я использовал

 plot_ly(pl.d, x = ~Group, y = ~OS, type = 'bar', name = "OS" ) %>% 
layout(showlegend = TRUE)

Пользователь должен иметь возможность расширить график таким образом, чтобы у мог быть произвольный выбор c(OS, NP, own.OS, own.SCR, HY9, WS8). Один неумный возможный подход заключается в расширении функции plot_ly с помощью

    if (input$choice of user =="NP"){
add_trace(y = ~NP, name = "NP") 
}

и if conditions и т. Д.

Есть ли какая-нибудь умная возможность написать умный динамический код для этого?

Это не имеет отношения к "NP". Я имею в виду, что plot_ly или add_trace должны в принципе показывать один или несколько из c(OS, NP, own.OS, own.SCR,HY9,WS8). Я могу написать это следующим образом:

  plot_ly(pl.d, x = ~Group, y = ~OS, type = 'bar', name = "OS" ) %>% 
add_trace(y = ~NP, name = "NP") %>% 
add_trace(y = ~own.OS, name = "own.OS") %>% 
add_trace(y = ~own.SCR, name = "own.SCR") %>% 
add_trace(y = ~HY9, name = "HY9") %>% 
add_trace(y = ~WS8, name = "WS8")%>% 
layout(showlegend = TRUE)

Проблема : Если вы опустите одно из c(OS, NP, own.OS, own.SCR,HY9,WS8), вы получите ошибку!

Одно из возможных решений: разбить фрейм данных на векторы! Использование функции melt делает возможным, однако я не получаю векторы просто еще одну форму таблицы данных! Пожалуйста, примите во внимание, что моя исходящая точка pl.d и не data.frame(Group =c(...), ....)! Итак, я попробовал следующее

pl.d<-data.frame(Group =melt(setDT(d.plot), id.var = 'Group ')[,1],
    model=melt(setDT(d.plot), id.var = 'Group ')[,2],
    value=melt(setDT(d.plot), id.var = 'Group ')[,3])

а затем

  plot_ly(pl.d, x = ~Group, y = ~value, type = 'bar', color= ~model ) %>% 
add_trace(y = ~value, name = "NP") 

Тем не менее, я не получаю, например, столбцы, принадлежащие A близко друг к другу.

Приложение: Моя ошибка заключалась в том, что я использовал color= ~model Мне пришлось использовать color=~Variable as mentioned in the answer! BUT why? I set it in my data frame as модель` !!

1 Ответ

1 голос
/ 09 июля 2019

Похоже, вы на правильном пути.Вы можете использовать melt и filter для создания кадра данных с желаемыми именами столбцов, например, следующим кодом.

data = data.frame(Group = c("a","b","c"),os = c(1,2,3),np = c(4,5,6), ws = c(7,8,9))

plot_cols = function(data, column_names = colnames(data)){
  data%>%
    melt()%>%
    filter(variable %in% column_names) %>%
    plot_ly(x = ~Group,y = ~value,color = ~variable,type = "bar")
}

Вы можете построить все столбцы, вызвав plot_cols(data) или любой столбец выбора, например plot_cols(data,"os") или plot_cols(data,c("os","ws"))

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