首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用R-plotly软件包中的plot_ly进行动态绘图

使用R-plotly软件包中的plot_ly进行动态绘图
EN

Stack Overflow用户
提问于 2019-07-09 16:26:59
回答 1查看 80关注 0票数 1

我正在使用shiny和plot_ly来绘制一个data frame

Goal:根据GUI中用户的选择实现动态绘图。

考虑以下名为pl.ddata.table

代码语言:javascript
复制
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

代码语言:javascript
复制
 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函数

代码语言:javascript
复制
    if (input$choice of user =="NP"){
add_trace(y = ~NP, name = "NP") 
}

以及if conditions等等。

有没有可能写一个智能的动态代码来做到这一点?

这与"NP“无关。我的意思是plot_lyadd_trace原则上应该能够显示一个或多个c(OS, NP, own.OS, own.SCR,HY9,WS8)。我可以这样写它:

代码语言:javascript
复制
  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(...), ....)!因此,我尝试了以下方法

代码语言:javascript
复制
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])

然后,

代码语言:javascript
复制
  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模型!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-10 03:08:28

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

代码语言:javascript
复制
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")) )来绘制所有列

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56948344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档