1

当有人点击数据上的点时,我想调用自定义函数来显示一些图像或信息。我在 ObservableHQ 笔记本中使用 Vega-lite 却找不到答案?

  const chart = (type)=>{ 
    return  vl
      .markCircle({size: 15, opacity: 0.9})
      .autosize('fit')
      .data(getData(type))
      .encode(
       vl.x().fieldQ('slice').title('Slice'),
       vl.y().fieldQ('dice').title(type).scale({domain: [0, 1.0]}),
       vl.color().field('algorithm').title('Algorithm'),
       vl.tooltip(['slice', 'algorithm', 'dice'])
      )    
  }
 
  const types = ['DSC','SDSC_2mm']
  const charts = []
  types.map(type => {
    charts.push(chart(type))
  })
  return vl.vconcat(vl.hconcat(charts)).render()
}

This is the code I have in notebook.
4

1 回答 1

1

如果您只关心点击,您可以执行此笔记本中的第一个单元格之类的操作:https ://observablehq.com/@visnup/vega-lite-data-out

具体来说:

clicked = Generators.observe((notify) => {
  const clicked = (event, {datum}) => notify(datum);
  clickable.addEventListener("click", clicked);
  return () => clickable.removeEventListener("click", clicked);
})

其中 clickable 是另一个单元格中我的图表的名称。

一个比可点击更好的例子是对 Vega-Lite selections做同样的事情。我也将它添加到笔记本中。

selected = Generators.observe((notify) => {
  const signal = Object.keys(selectable.getState({ signals: (name) => name.match(/^sel\d+$/) }).signals)[0];
  const selected = (selection, predicates) => {
    const within = penguins.filter(d => {
      for (const [key, [min, max]] of Object.entries(predicates))
        if (isNaN(+d[key]) || d[key] < min || d[key] > max)
          return false;
      return true;
    })
    notify(within);
  }
  selectable.addSignalListener(signal, selected);
  return () => selectable.removeEventListener(signal, selected);
})
于 2020-07-28T00:50:46.637 回答