【问题标题】:Setting a field to an object in an array, Vega-lite将字段设置为数组中的对象,Vega-lite
【发布时间】:2021-11-26 05:02:47
【问题描述】:

我有一个对象数组,我将它们用作交互式数据仪表板中的数据集。我想添加一项新功能,该功能一次仅显示一个对象的数据,而不是从所有对象中提取数据(我已经在这样做并且效果很好)。作为一个测试用例,我创建了一个简单的数组:

var test1 = [
  [{
    "name": "Piece One",
    "amount": 5
  }, {
    "name": "Piece Two",
    "amount": 5
  }, {
    "name": "Piece Three",
    "amount": 5
  }],
  [{
    "name": "Piece One",
    "amount": 1
  }, {
    "name": "Piece Two",
    "amount": 1
  }, {
    "name": "Piece Three",
    "amount": 5
  }]
];

和 Vega-lite javascript:

var pieCreate = {
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "title": "A pie chart",
  "description": "A simple pie chart with embedded data.",
  "width": "container",
  "height": "container",
  "data": {
    "values": test1[0]
  },
  "mark": "arc",
  "encoding": {
    "theta": {
      "field": "amount",
      "type": "quantitative"
    },
    "color": {
      "field": "name",
      "type": "nominal",
      "legend": null
    }
  }
};

这可行,但我希望用户能够选择要显示的对象(在仪表板中,每个对象都包含不同学校的数据,并且我希望用户能够使用下拉式菜单)。我的第一个想法是在"data": {"values": 字段中设置一个信号,将括号中的数字更改为我想要的数组,但经过大量试验和错误后,我认为这可能是一个死胡同。信号 应该 可以修改 "field": "amount""field": "name" 但我已经尝试了我能想到的 [0].amount 的每次迭代,同时从 test1[0] 中删除了括号,但没有任何效果.如果我可以通过在"field": 中直接引用它来设法访问该对象,我相信我可以使用信号和 html 表单来弄清楚这个过程,但我开始怀疑我是否走在正确的轨道上。

我还尝试了 vega-lite 文档中概述的过程:https://vega.github.io/vega-lite/tutorials/streaming.html,但它做的事情比我想做的事情复杂得多,而且我的 javascript 知识不足以将其分解为有用的东西。是否有人对如何使用上述任何方法(或新的更好的方法)进行这项工作有任何想法?

【问题讨论】:

  • 为了清楚起见,您想在更改下拉列表时将数据从 test[0] 更改为 test[1] 吗?还是与字段有关?
  • @wahabmemon 是的,没错。我试图通过字段作为一种解决方法来做到这一点,但实际上最好的解决方案是直接更改用于填充图形的数据(从 test[0] 到 test[1])

标签: javascript arrays data-visualization vega-lite


【解决方案1】:

您可以使用vega Api's 更改数据。在您的选择中,添加一个更改事件,并且在某些情况下,您可以使用这些 API 在您的数据之间切换。 参考下面的sn-p或者fiddle

var test1 = [
  [{
    "name": "Piece One",
    "amount": 5
  }, {
    "name": "Piece Two",
    "amount": 5
  }, {
    "name": "Piece Three",
    "amount": 5
  }],
  [{
    "name": "Piece One",
    "amount": 1
  }, {
    "name": "Piece Two",
    "amount": 1
  }, {
    "name": "Piece Three",
    "amount": 5
  }]
];

var yourVlSpec = {
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "title": "A pie chart",
  "description": "A simple pie chart with embedded data.",
  "width": "350",
  "height": "400",
  "data": {
    "values": test1[0]
  },
  "mark": "arc",
  "encoding": {
    "theta": {
      "field": "amount",
      "type": "quantitative"
    },
    "color": {
      "field": "name",
      "type": "nominal",
      "legend": null
    }
  }
}
var view;
vegaEmbed("#vis", yourVlSpec).then(res => {
  view = res.view;
});

function handleChange(a, b) {
  var selectValue = document.getElementById("myselect").value;
  if (selectValue == 'A') {
    view.data('source_0', test1[0]);
  } else {
    view.data('source_0', test1[1]);
  }
  view.runAsync();
}
<script src="https://cdn.jsdelivr.net/npm/vega@5.20.2/build/vega.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vega-lite@5.0.0/build/vega-lite.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vega-embed@6.17.0/build/vega-embed.min.js"></script>

<select id="myselect" style="width:100px;" onchange="handleChange()">
  <option>A</option>
  <option>B</option>
</select>
<br>
<div id="vis"></div>

【讨论】:

  • 嘿,非常感谢你,它工作得很好!我能够参加这个测试并将其应用到我的实际项目中,没有任何问题。
猜你喜欢
  • 2020-03-02
  • 2019-08-03
  • 1970-01-01
  • 2023-02-02
  • 1970-01-01
  • 2023-01-11
  • 2020-03-19
  • 1970-01-01
  • 2022-06-10
相关资源
最近更新 更多