使用R-plotly包中的plot_ly进行动态图

时间:2019-07-09 08:26:58

标签: r shiny r-plotly

我正在使用闪亮的plot_ly来绘制data frame

目标:根据GUI中用户的选择来实施动态图。

请考虑以下名为data.table的{​​{1}}

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

用户应该能够以y为 plot_ly(pl.d, x = ~Group, y = ~OS, type = 'bar', name = "OS" ) %>% layout(showlegend = TRUE) 的任意选择的方式来扩展图。 一种不明智的方法是使用{p>扩展c(OS, NP, own.OS, own.SCR, HY9, WS8)函数

plot_ly

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

是否有编写智能动态代码来做到这一点的聪明机会?

与“ NP”无关。我的意思是if conditionsplot_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])

但是,例如,我没有得到属于A的条形彼此靠近。

附录:我的错误是,我使用了 plot_ly(pl.d, x = ~Group, y = ~value, type = 'bar', color= ~model ) %>% add_trace(y = ~value, name = "NP") 模型,我不得不使用color= ~model模型`!

1 个答案:

答案 0 :(得分:1)

听起来像在正确的轨道上。您可以使用meltfilter创建具有所需列名的数据框,例如以下代码。

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"))之类的任何选择列来绘制所有列