Динамическое изменение поля по оси Y в кодировке на основе выбора Vega-Lite

#vega-lite #vega

#vega-lite #vega

Вопрос:

Как я могу динамически изменять поле данных, закодированное для оси y, на основе выбора? Я пытаюсь создать визуализацию для отображения данных о количестве событий за 24 часа в сутки, и я хочу, чтобы пользователь мог выбирать разные часовые пояса (например, EST, CST, MST или PST).

Для этого я создал единый выбор, в котором я указываю все параметры, которые я перечислил выше, в круглых скобках, при этом значение EST установлено по умолчанию. Я хочу создать условие, при котором, когда я выбираю другой вариант, кроме EST, я вижу, что визуализация динамически обновляется. Я исследовал возможность создания других полей часов специально для этих временных рамок или добавления логики условий, чтобы попытаться учесть эти динамические изменения, но я пока не нашел хорошего решения. Кто-нибудь может помочь?

Вот пример того, как выглядят несколько строк моих данных

 "data": {
      "values": [
        {
          "title_column":"example",
          "Type": "Technology",
          "Events": "100",
          "Hour": "0",
          "Date": "9/1/20",
          "Time Period": "Last Time"
        },
        {
          "title_column":"example",
          "Type": "Technology",
          "Events": "110",
          "Hour": "1",
          "Date": "9/1/20",
          "Time Period": "Last Time"
        },
  

и визуализация выглядит так, когда она собирается вместе, при этом она динамически обновляется на основе выбора:

Изображение времени суток

И когда мой код статичен, он выглядит так:

     "layer":[
           {"mark":{
               "type":"bar",
               "point":true,
               "color":"#FFC94E",
               "height":15
           },
           "selection": {
        "timezone": {
          "type": "single",
          "init": {"changer": "EST"},
          "bind": {
            "changer": {"input": "select",
              "options": ["EST","CST (-1 Hour)","MST (-2 Hours)","PST (-3 Hours)"]}
          }
        }
      },
    "encoding":
        {
            "x":{"field":"Events",
            "type":"quantitative",
            "aggregate":"sum",
            "axis":null},
            "y": {"field":"Hour",
            "type":"ordinal",
            "axis":{
              "labelSeparation":1,
              "labelPadding":4,
              "title":null
            }
            }
        }}]
        }
  

Однако, сосредоточив внимание, в частности, на кодировке y нижней части кода, я бы в идеале хотел сделать это динамичным. Я думаю, что мог бы создать вычисления для каждого из часовых поясов, а затем написать условие, которое работает, как показано ниже, но я не смог заставить это работать. Любая помощь приветствуется!

 "y": {
            "condition": { 
            "selection": {"timezone" : "EST"},
            "datum": "datum.Hour"
              }
            "condition": { 
            "selection": {"timezone" : "CST (-1 Hour)"},
            "datum": "datum.Hour_CST"
              }
              ...
            }
  

Вот ссылка на мой код:
редактор vega.

Комментарии:

1. Вот ссылка на

Ответ №1:

Выборки могут фильтроваться только по значениям столбцов, а не по именам столбцов. К счастью, вы можете преобразовать имена столбцов в значения столбцов с помощью преобразования сгиба.

Чтобы выполнить то, что вы хотите, я бы предложил следующее:

  • Используйте серию вычислительных преобразований для вычисления новых столбцов, содержащих значения, которые вы хотите отобразить.
  • Используйте преобразование сгиба, чтобы сложить эти значения в один столбец с соответствующим ключевым столбцом.
  • Свяжите привязку выбора с ключевым столбцом, созданным при преобразовании сгиба.
  • Используйте преобразование фильтра для фильтрации значений на основе выбора
  • Наконец, добавьте кодировку строки, чтобы выбранный столбец был помечен на оси.

В совокупности это выглядит так (открыть в редакторе vega):

 {
  "width": 300,
  "data": {
    "values": [...]
  },
  "transform": [
    {"filter": {"field": "Time Period", "equal": "Last Time"}},
    {"calculate": "datum.Hour - 0", "as": "EST"},
    {"calculate": "datum.Hour - 1", "as": "CST (-1 Hour)"},
    {"calculate": "datum.Hour - 2", "as": "MST (-2 Hours)"},
    {"calculate": "datum.Hour - 3", "as": "PST (-3 Hours)"},
    {
      "fold": ["EST", "CST (-1 Hour)", "MST (-2 Hours)", "PST (-3 Hours)"],
      "as": ["Zone", "Hour"]
    },
    {"filter": {"selection": "timezone"}}
  ],
  "selection": {
    "timezone": {
      "type": "single",
      "init": {"Zone": "EST"},
      "bind": {
        "Zone": {
          "name": "timezone",
          "input": "select",
          "options": [
            "EST",
            "CST (-1 Hour)",
            "MST (-2 Hours)",
            "PST (-3 Hours)"
          ]
        }
      }
    }
  },
  "mark": {"type": "bar", "point": true, "color": "#FFC94E", "height": 15},
  "encoding": {
    "x": {
      "field": "Events",
      "type": "quantitative",
      "aggregate": "sum",
      "axis": null
    },
    "y": {
      "field": "Hour",
      "type": "ordinal",
      "axis": {"labelSeparation": 1, "labelPadding": 4, "title": null}
    },
    "row": {
      "field": "Zone",
      "type": "nominal",
      "title": null
    }
  }
}
  

введите описание изображения здесь

Комментарии:

1. Это именно то, что мне было нужно! Спасибо