首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用R中多个交互下拉菜单巧妙地跟踪的可见性

使用R中多个交互下拉菜单巧妙地跟踪的可见性
EN

Stack Overflow用户
提问于 2017-08-23 12:29:23
回答 1查看 1.2K关注 0票数 2

我想要几个下拉菜单来指定显示哪些数据。

使用闪亮,我可以分别传递所有选定的条件值,然后根据它们之间的相互作用过滤数据集。

在下面的示例中,是否可以在没有闪亮的情况下获得相同的功能?

代码语言:javascript
复制
library(plotly)
means = c(0,1,10)
scales = c(1,5)

sample.size = 100

t.visible = rep(F,2*length(means)*length(scales))
t.buttons = list()

pl = plot_ly()

for(i in 1:length(means)){
  for(j in 1:length(scales)){

    tt.visible = (i==1)&(j==1)

    pl = pl %>% 
          add_trace(x=0:sample.size,y=c(0,cumsum(means[i]+scales[j]*rnorm(sample.size))),type='scatter',mode='lines',color='one', visible = tt.visible) %>%
          add_trace(x=0:sample.size,y=c(0,cumsum(means[i]+scales[j]*rt(sample.size,df=5))),type='scatter',mode='lines',color='two',visible = tt.visible)

    tt.visible = t.visible
    tt.visible[(i-1)*length(scales)*2+(j-1)*2+(1:2)] = T

    t.buttons[[(i-1)*length(scales)+j]] = list(
      method = 'update',
      args = list(list(visible = tt.visible),
                  list(title = paste0('mean = ',means[i],'; scale = ',scales[j]))),
      label = paste0('mean = ',means[i],'; scale = ',scales[j])
    )
  }
}

pl = pl %>% layout(
  title = paste0('mean = ',means[1],'; scale = ',scales[1]),
  xaxis = list(title='time'),
  yaxis = list(title='value'),
  updatemenus = list(list(active = 0,
                          buttons = t.buttons))
)

特别是,是否有一种方法可以有两个独立的(相互作用的)按钮,一个用于均值向量,一个用于刻度向量?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-23 22:58:33

您可以创建自己的下拉列表,并使用少量的JavaScript动态显示和隐藏跟踪。

  • 基于输入数组动态创建下拉菜单
  • 向两个菜单中添加一个eventlistener
  • 根据所选内容设置实际数据的visible

当使用htmlwidget时,包含Plotly图的div作为参数传递(在本例中为el)。数据可以在data属性中找到。

代码语言:javascript
复制
library(plotly)
library(htmlwidgets)

means = c(0,1,10)
scales = c(1,5)
sample.size = 100

pl = plot_ly()

for(i in 1:length(means)){
  for(j in 1:length(scales)){
    trace_name <- paste('means:', means[i], '; scale:', scales[j])
    pl = pl %>% 
      add_trace(x=0:sample.size,
                y=c(0,cumsum(means[i]+scales[j]*rnorm(sample.size))),
                type='scatter',
                mode='lines',
                color='one',
                mode='line',
                visible = (i==1)&(j==1),
                name = trace_name) %>%
      add_trace(x=0:sample.size,
                y=c(0,cumsum(means[i]+scales[j]*rt(sample.size,df=5))),
                type='scatter',
                mode='lines',
                color='two',
                visible = (i==1)&(j==1),
                name = trace_name)
  }
}

javascript <- "
var select_mean = document.createElement('select');
select_mean.id = 'mean';
var select_scale = document.createElement('select');
select_scale.id = 'scale';
el.append(document.createTextNode('Means'));
el.append(select_mean);
el.append(document.createTextNode('Scale'));
el.append(select_scale);
function showTraces() {
  var select_scale = document.getElementById('scale');
  var select_mean = document.getElementById('mean');
  var scale = select_scale.options[select_scale.selectedIndex].text;
  var mean = select_mean.options[select_mean.selectedIndex].text;
  var traceName = 'means: ' + mean + ' ; ' + 'scale: ' + scale;
  for (var i = 0; i < el.data.length; i += 1) {
    el.data[i].visible = el.data[i].name.indexOf(traceName) > -1
  }
  Plotly.redraw(el)
}
select_scale.addEventListener('change', function() {
    showTraces();
});
select_mean.addEventListener('change', function() {
    showTraces();
});
"
for(i in 1:length(means)){
  javascript <- paste(javascript, "
var option = document.createElement('option');
option.text = '", means[i], "';
select_mean.append(option);", sep='')
}

for(j in 1:length(scales)) {
  javascript <- paste(javascript, "
var option = document.createElement('option');
option.text = '", scales[j], "';
select_scale.append(option);", sep='')
}

w <- as_widget(pl)
w <- htmlwidgets::onRender(w, paste("function(el, x, data) {", javascript, "}"), data=list('a', 'b'))
htmlwidgets::saveWidget(w, "buttons.html")
w
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45839765

复制
相关文章

相似问题

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