使用 Vega Lite 进行可视化:"emoji undefined"

Visualisation with Vega Lite : "emoji undefined"

我正在尝试在 Vega Lite (https://vega.github.io/vega-lite/examples/isotype_bar_chart_emoji.html) 中重现可视化效果。我没有选择动物表情符号,而是选择了象征能量来源的表情符号。但是我的代码不起作用,看起来 Vega 无法识别标记为“未定义”的表情符号。我怎样才能帮助 vega 让它使用表情符号作为徽标?

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "config": {"view": {"stroke": ""}},
  "width": 800,
  "height": 200,
  "data": {
    "values": [
{"continent": "Africa", "share": "coal"},
{"continent": "Africa", "share": "coal"},
{"continent": "Africa", "share": "gas"},
{"continent": "Europe", "share": "gas"},
{"continent": "Europe", "share": "gas"},
{"continent": "Europe", "share": "hydro"},
{"continent": "Europe", "share": "nuclear"},
{"continent": "Europe", "share": "renewables"},
{"continent": "Europe", "share": "renewables"},
{"continent": "Europe", "share": "renewables"},
{"continent": "Europe", "share": "renewables"},
{"continent": "Europe", "share": "renewables"}
    ]
  },
  "transform": [
    {
      "calculate": "{'coal': '', 'nuclear': '⚛️', 'oil': '️','renewables':'♻️','gas':'⛽'}",
      "as": "emoji"
    },
    {"window": [{"op": "rank", "as": "rank"}], "groupby": ["continent", "share"]}
  ],
  "mark": {"type": "text", "baseline": "middle"},
  "encoding": {
    "x": {"field": "rank", "type": "ordinal", "axis": null},
    "y": {"field": "share", "type": "nominal", "axis": null, "sort": null},
    "row": {"field": "continent", "header": {"title": ""}},
    "text": {"field": "emoji", "type": "nominal"},
    "size": {"value": 65}
  }
}

转换计算不正确,您可以使用 datum 从您的数据访问该字段,并根据条件提供 emoji 值。参考下面的代码或 editor

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "config": {"view": {"stroke": ""}},
  "width": 800,
  "height": 200,
  "data": {
    "values": [
      {"continent": "Africa", "share": "coal"},
      {"continent": "Africa", "share": "coal"},
      {"continent": "Africa", "share": "gas"},
      {"continent": "Europe", "share": "gas"},
      {"continent": "Europe", "share": "gas"},
      {"continent": "Europe", "share": "hydro"},
      {"continent": "Europe", "share": "nuclear"},
      {"continent": "Europe", "share": "renewables"},
      {"continent": "Europe", "share": "renewables"},
      {"continent": "Europe", "share": "renewables"},
      {"continent": "Europe", "share": "renewables"},
      {"continent": "Europe", "share": "renewables"}
    ]
  },
  "transform": [
    {
      "calculate": "datum.share == 'coal' ?  '' : datum.share == 'nuclear' ? '⚛️' : datum.share == 'oil' ? '️' : datum.share == 'renewables' ?'♻️' : '⛽'",
      "as": "emoji"
    },
    {
      "window": [{"op": "rank", "as": "rank"}],
      "groupby": ["continent", "share"]
    }
  ],
  "mark": {"type": "text", "baseline": "middle"},
  "encoding": {
    "x": {"field": "rank", "type": "ordinal", "axis": null},
    "y": {"field": "share", "type": "nominal", "axis": null, "sort": null},
    "row": {"field": "continent", "header": {"title": ""}},
    "text": {"field": "emoji", "type": "nominal"},
    "size": {"value": 65}
  }
}

或者简单地将此行添加到您当前的代码中也可以解决问题:

{
  "calculate": "{'coal': '', 'nuclear': '⚛️', 'oil': '️','renewables':'♻️','gas':'⛽', 'hydro': '',}[datum.share]",
  "as": "emoji"
}