我正在使用闪亮的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 conditions
或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])
但是,例如,我没有得到属于A的条形彼此靠近。
附录:我的错误是,我使用了 plot_ly(pl.d, x = ~Group, y = ~value, type = 'bar', color= ~model ) %>%
add_trace(y = ~value, name = "NP")
模型,我不得不使用color= ~model
模型`!
答案 0 :(得分:1)
听起来像在正确的轨道上。您可以使用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"))
之类的任何选择列来绘制所有列