使用 R-plotly 包中的 plot_ly 的动态图
dynamical plot using plot_ly from R-plotly package
我正在使用 shiny 和 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)
用户应该能够以 y 可以是 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
函数可以实现,但是我没有得到向量只是另一种数据形状 table!请考虑到我的出点是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
model`!!
听起来你走对了路。您可以使用 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)
或任何 select 列(例如 plot_cols(data,"os")
或 plot_cols(data,c("os","ws"))
来绘制所有列
我正在使用 shiny 和 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)
用户应该能够以 y 可以是 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
函数可以实现,但是我没有得到向量只是另一种数据形状 table!请考虑到我的出点是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
model`!!
听起来你走对了路。您可以使用 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)
或任何 select 列(例如 plot_cols(data,"os")
或 plot_cols(data,c("os","ws"))