如何 select 仅从列表中选择唯一值进行着色?

How do I select only unique values from a list for coloring?

最后的 vega-lite 代码将列“c”的每个实例都视为唯一值,并向图例添加相应的单独条目,如下所示:

在这种情况下我只需要 3 种颜色:红色、蓝色和黄色 - 没有诸如“蓝色、红色”之类的组合。决策逻辑为 50-50,例如:如果“blue”的值为 3,“blue, red”的值为 4,则后者将拆分为 2 个蓝色和 2 个红色,共计 5 ( 3+2)“蓝色”和 2 个“红色”。如果“蓝色,红色”是 5,它就会有 2.5 和 2.5 等等。


代码如下:

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "data": {
    "values": [
      {"a": "A", "b": 2, "c": "red, blue"},
      {"a": "A", "b": 7, "c": "yellow, blue"},
      {"a": "A", "b": 4, "c": "blue, red"},
      {"a": "B", "b": 1, "c": "blue"},
      {"a": "B", "b": 2, "c": "red"}
    ]
  },
  "mark": "bar",
  "encoding": {
    "x": {"field": "a", "type": "nominal"},
    "y": {"aggregate": "average", "field": "b", "type": "quantitative"},
    "color": {"field": "c", "type": "nominal"}
  }
}

在执行一些像fold, calculate and filter这样的转换之后,您将能够获得想要的结果,在下面的代码片段中或参考editor:

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "width": 200,
  "data": {
    "values": [
      {"a": "A", "b": 2, "c": "red, blue"},
      {"a": "A", "b": 7, "c": "yellow, blue"},
      {"a": "A", "b": 4, "c": "blue, red"},
      {"a": "B", "b": 1, "c": "blue"},
      {"a": "B", "b": 2, "c": "red"}
    ]
  },
  "transform": [
    {"fold": ["red", "blue", "yellow"]},
    {
      "calculate": "indexof(datum.c,datum.key) ? datum.b/2 : datum.b",
      "as": "value"
    },
    {"filter": "indexof(datum.c,datum.key) > -1"},
    {
      "joinaggregate": [{"field": "value", "op": "sum", "as": "value_sum"}],
       "groupby": ["key", "a"]
    }
  ],
  "mark": "bar",
  "encoding": {
    "tooltip": [{"field": "value_sum"}],
    "x": {"field": "a", "type": "nominal"},
    "y": {"field": "value", "type": "quantitative"},
    "color": {
      "field": "key",
      "type": "nominal",
      "scale": {"range": ["blue", "red", "yellow"]}
    }
  }
}

让我知道这是否有效