Variáveis em gráficos custom usando o Vega

Bom dia!

Estou tentando usar o Custom Chart com o Vega mas não estou conseguindo linkar as variáveis… já olhei a documentação do WEGnology e até as perguntas do fórum, mas não consigo avançar.

image

O código está assim:

{
  "$schema": "https://vega.github.io/schema/vega/v5.json",
  "width": {{block.width}},
  "height": {{block.height}},
  "autosize": {
    "type": "fit",
    "contains": "padding"
  },
  "signals": [
    {
      "name": "centerX",
      "update": "width/2"
    },
    {
      "name": "centerY",
      "update": "height/2 + outerRadius/2"
    },
    {
      "name": "outerRadius",
      "update": "targetValue ? radiusRef * 0.9 : radiusRef * 0.95"
    },
    {
      "name": "radiusRef",
      "update": "min(width/2, height/2)"
    },
    {
      "name": "innerRadius",
      "update": "outerRadius - outerRadius * 0.10"
    },
    {
      "name": "ticksNumber",
      "value":6
    },
    {
      "name": "ticksColor",
      "value": "rgba(255, 255, 255, 0.2)"
    },
    {
      "name": "showTicks",
      "value":true
    },
    {
      "name": "mainValue",
      "data": "load"
    },
    {
      "name": "unit",
      "value":" %"
    },
    {
      "name": "usedValue",
      "update": "min(max(minValue, mainValue), maxValue)"
    },
    {
      "name": "minValue",
      "value":0
    },
    {
      "name": "maxValue",
      "value":100
    },
    {
      "name": "targetValue",
      "value":50
    },
    {
      "name": "fontFactor",
      "update": "(radiusRef/5)/25"
    },
    {
      "name": "backgroundColor",
      "value":"#cbd1d6"
    },
    {
      "name": "fillColor",
      "value": "rgba(0, 120, 134, 0.6)"
    }
  ],
  "data": [
    {
      "name": "load",
      "transform": [
        {
          "type": "sequence",
          "as": "data",
          "start":{
            "signal":"0"
          },
          "stop":{
            "signal":"(maxValue - minValue) + 0.1"
          },
          "step": {
            "signal":"(maxValue - minValue)/(ticksNumber-1)"
          }
        },
        {
          "type":"formula",
          "expr":"datum.data + minValue",
          "as": "data_2"
        },
        {
          "type": "formula",
          "as":"radianRef",
          "expr":"PI * (datum.data/(maxValue - minValue))"
        },
        {
          "type": "formula",
          "as":"x",
          "expr": "centerX - ((outerRadius - (outerRadius - innerRadius) * 0.6) * cos(datum.radianRef))"
        },
        {
          "type": "formula",
          "as":"y",
          "expr": "centerY - ((outerRadius - (outerRadius - innerRadius) * 0.7) * sin(datum.radianRef))"
        }
      ]
    }
  ],
  "scales": [
    {
      "name": "gaugeScale",
      "type": "linear",
      "domain":{"data":"load", "field":"load_2"},
      "zero":false,
      "range":{"signal":"[-PI/2, PI/2]"}
    },
    {
      "name": "tickScale",
      "type": "linear",
      "domain":{"data": "load", "field":"data"},
    "range":{"signal":"[PI/2, -PI/2]"}
    }
  ],
  "marks": [
    {
      "type": "arc",
      "name": "gauge",
      "encode": {
        "enter":{
          "x":{"signal":"centerX"},
          "y":{"signal":"centerY"},
          "startAngle":{"signal": "-PI/2"},
          "endAngle":{"signal":"PI/2"},
       "outerRadius":{"signal":"outerRadius"},
          "innerRadius":{"signal":"innerRadius"},
          "fill":{"signal":"backgroundColor"}
        }
      }
    },
    {
      "type": "arc",
      "encode": {
        "enter":{         
          "startAngle":{"signal":"-PI/2"}         
        },
        "update":{
          "x":{"signal":"centerX"},
          "y":{"signal":"centerY"},
          "innerRadius":{"signal":"innerRadius"},
          "outerRadius":{"signal":"outerRadius"},
           "endAngle":{"scale":"gaugeScale", "signal":"usedValue"},
          "fill":{"signal":"fillColor"}
        }
      }
    },
    {
      "type": "arc",
      "description":"ticks on the arc",
      "from": {"data":"load"},
      "encode": {
        "enter":{
          "x":{"signal":"centerX"},
          "y":{"signal":"centerY"},
          "outerRadius":{"signal":"outerRadius"},
          "innerRadius":{"signal":"outerRadius - (radiusRef*0.05)"},
          "startAngle":{ "scale": "tickScale",
            "field": "data"},
          "endAngle":{ "scale": "tickScale",
            "field": "data"},
          "stroke":{"signal":"ticksColor"},
          "opacity":{"signal":"showTicks ? 0 : 1"}
        }
      }
    },
    {
      "type": "text",
      "from": {"data":"load"},
      "encode": {
        "enter":{         
      "align":{"value":"center"},
      "baseline":{"value":"alphabetic"}
        },
        "update":{
          "text":{"signal":"format(datum.data_2, '.0f')"},
          "x":{"field":"x"},
          "y":{"field":"y"},
          "fontSize":{"signal":"fontFactor* 11"},
          "fill":{"signal":"ticksColor"},
          "opacity":{"signal":"showTicks ? 0 : 1"}
        }
      }
    },
    {
      "type": "text",
      "description":"displayed min value at the bottom left of gauge when showTicks is false",
      "from": {"data":"gauge"},
      "encode": {
        "enter":{
          "align":{"value":"center"},
          "baseline":{"value":"top"}
        },
        "update":{
          "text":{"signal":"minValue"},
          "x":{"signal":"centerX - outerRadius + (outerRadius - innerRadius)/2"},
          "y":{"signal":"centerY", "offset":{"signal":"fontFactor*5"}},
          "fontSize":{"signal":"fontFactor * 15"},
          "opacity":{"signal":"showTicks ? 1 : 0"},
          "fill": {
            "signal": "ticksColor"
          }
        }
      }
    },
    {
      "type": "text",
      "description":"displayed max value at the bottom right of gauge when showTicks is false",
      "from": {"data":"gauge"},
      "encode": {
        "enter":{
          "align":{"value":"center"},
          "baseline":{"value":"top"}
        },
        "update":{
          "text":{"signal":"maxValue"},
          "x":{"signal":"centerX + innerRadius + (outerRadius - innerRadius)/2"},
          "y":{"signal":"centerY", "offset":{"signal":"fontFactor*5"}},
          "fontSize":{"signal":"fontFactor * 15"},
          "opacity":{"signal":"showTicks ? 1 : 0"},
          "fill": {
            "signal": "ticksColor"
          }
        }
      }
    },
    {
      "type": "text",
      "description":"displayed main value at the bottom center of the gauge ",
      "name": "gaugeValue",
      "encode": {
        "enter":{
          "x":{"signal": "centerX"},     
          "baseline":{"value":"top"},
          "align":{"value":"center"}
        },
        "update":{
          "text":{"signal":"format(mainValue, '.0f') + unit"},
          "y":{"signal":"centerY", "offset": {"signal": "fontFactor*5"}},   
          "fontSize":{"signal":"fontFactor * 30"},
          "fill": {
            "signal": "ticksColor"
          }
        }
      }
    }
  ]
}

Criei também uma Gauge Query com o nome load e não funciona.

O que faço pra funcionar?

Bom dia, João!

Os valores são inseridos nos Gráficos VEGA por intermédio das queries que são criadas.
No seu caso, se aplica uma “gauge” query, devido ao fato de estarmos mostrando um só valor.
Na documentação:

Tenha em mente que você receberá da Gauge query o seguinte objeto, composto pelo timestamp e pelo próprio valor:

Portanto, no seu código do VEGA, você vai utilizar o objeto “value” onde necessita estar o valor.
O objeto “data” realmente é a pesquisa (query), conforme você usou a query chamada “load”.
Porém, na configuração dos eixos, labels e tudo mais, você tem que levar em consideração que o número a ser mostrado está na variável “value”.

Veja o exemplo da documentação:

1 - Os dados estão vindo da query chamada “time-series-0”
2 - No eixo x será plotado o horário, vindo do objeto “time”.
3 - No eixo y será plotado o valor, vindo do objeto “value”.

Você teria o código original, sem alterações?
Talvez, com ele possamos dar o exemplo exatamente na sua necessidade.

Segue o código original!

{
  "$schema": "https://vega.github.io/schema/vega/v5.json",
  "width": 600,
  "height": 600,
  "signals": [
    {
      "name": "centerX",
      "update": "width/2"
    },
    {
      "name": "centerY",
      "update": "height/2 + outerRadius/2"
    },
    {
      "name": "outerRadius",
      "update": "targetValue ? radiusRef * 0.9 : radiusRef * 0.95"
    },
    {
      "name": "radiusRef",
      "update": "min(width/2, height/2)"
    },
    {
      "name": "innerRadius",
      "update": "outerRadius - outerRadius * 0.25"
    },
    {
      "name": "ticksNumber",
      "value":6
    },
    {
      "name": "ticksColor",
      "value":"#000000"
    },
    {
      "name": "showTicks",
      "value":true
    },
    {
      "name": "mainValue",
      "value":60
    },
    {
      "name": "unit",
      "value":" L"
    },
    {
      "name": "usedValue",
      "update": "min(max(minValue, mainValue), maxValue)"
    },
    {
      "name": "minValue",
      "value":0
    },
    {
      "name": "maxValue",
      "value":100
    },
    {
      "name": "targetValue",
      "value":50
    },
    {
      "name": "fontFactor",
      "update": "(radiusRef/5)/25"
    },
    {
      "name": "backgroundColor",
      "value":"#cbd1d6"
    },
    {
      "name": "fillColor",
      "value":"#77A7FB"
    }
  ],
  "data": [
    {
      "name": "ticks",
      "transform": [
        {
          "type": "sequence",
          "as": "data",
          "start":{
            "signal":"0"
          },
          "stop":{
            "signal":"(maxValue - minValue) + 0.1"
          },
          "step": {
            "signal":"(maxValue - minValue)/(ticksNumber-1)"
          }
        },
        {
          "type":"formula",
          "expr":"datum.data + minValue",
          "as": "data_2"
        },
        {
          "type": "formula",
          "as":"radianRef",
          "expr":"PI * (datum.data/(maxValue - minValue))"
        },
        {
          "type": "formula",
          "as":"x",
          "expr": "centerX - ((outerRadius - (outerRadius - innerRadius) * 0.6) * cos(datum.radianRef))"
        },
        {
          "type": "formula",
          "as":"y",
          "expr": "centerY - ((outerRadius - (outerRadius - innerRadius) * 0.7) * sin(datum.radianRef))"
        }
      ]
    }
  ],
  "scales": [
    {
      "name": "gaugeScale",
      "type": "linear",
      "domain":{"data":"ticks", "field":"data_2"},
      "zero":false,
      "range":{"signal":"[-PI/2, PI/2]"}
    },
    {
      "name": "tickScale",
      "type": "linear",
      "domain":{"data": "ticks", "field":"data"},
    "range":{"signal":"[PI/2, -PI/2]"}
    }
  ],
  "marks": [
    {
      "type": "arc",
      "name": "gauge",
      "encode": {
        "enter":{
          "x":{"signal":"centerX"},
          "y":{"signal":"centerY"},
          "startAngle":{"signal": "-PI/2"},
          "endAngle":{"signal":"PI/2"},
       "outerRadius":{"signal":"outerRadius"},
          "innerRadius":{"signal":"innerRadius"},
          "fill":{"signal":"backgroundColor"}
        }
      }
    },
    {
      "type": "arc",
      "encode": {
        "enter":{         
          "startAngle":{"signal":"-PI/2"}         
        },
        "update":{
          "x":{"signal":"centerX"},
          "y":{"signal":"centerY"},
          "innerRadius":{"signal":"innerRadius"},
          "outerRadius":{"signal":"outerRadius"},
           "endAngle":{"scale":"gaugeScale", "signal":"usedValue"},
          "fill":{"signal":"fillColor"}
        }
      }
    },
    {
      "type": "arc",
      "description":"ticks on the arc",
      "from": {"data":"ticks"},
      "encode": {
        "enter":{
          "x":{"signal":"centerX"},
          "y":{"signal":"centerY"},
          "outerRadius":{"signal":"outerRadius"},
          "innerRadius":{"signal":"outerRadius - (radiusRef*0.05)"},
          "startAngle":{ "scale": "tickScale",
            "field": "data"},
          "endAngle":{ "scale": "tickScale",
            "field": "data"},
          "stroke":{"signal":"ticksColor"},
          "opacity":{"signal":"showTicks ? 1 : 0"}
        }
      }
    },
    {
      "type": "text",
      "from": {"data":"ticks"},
      "encode": {
        "enter":{         
      "align":{"value":"center"},
      "baseline":{"value":"alphabetic"}
        },
        "update":{
          "text":{"signal":"format(datum.data_2, '.0f')"},
          "x":{"field":"x"},
          "y":{"field":"y"},
          "fontSize":{"signal":"fontFactor* 11"},
          "fill":{"signal":"ticksColor"},
          "opacity":{"signal":"showTicks ? 1 : 0"}
        }
      }
    },
    {
      "type": "text",
      "description":"displayed min value at the bottom left of gauge when showTicks is false",
      "from": {"data":"gauge"},
      "encode": {
        "enter":{
          "align":{"value":"center"},
          "baseline":{"value":"top"}
        },
        "update":{
          "text":{"signal":"minValue"},
          "x":{"signal":"centerX - outerRadius + (outerRadius - innerRadius)/2"},
          "y":{"signal":"centerY", "offset":{"signal":"fontFactor*5"}},
          "fontSize":{"signal":"fontFactor * 11"},
          "opacity":{"signal":"showTicks ? 0 : 1"}
        }
      }
    },
    {
      "type": "text",
      "description":"displayed max value at the bottom right of gauge when showTicks is false",
      "from": {"data":"gauge"},
      "encode": {
        "enter":{
          "align":{"value":"center"},
          "baseline":{"value":"top"}
        },
        "update":{
          "text":{"signal":"maxValue"},
          "x":{"signal":"centerX + innerRadius + (outerRadius - innerRadius)/2"},
          "y":{"signal":"centerY", "offset":{"signal":"fontFactor*5"}},
          "fontSize":{"signal":"fontFactor * 11"},
          "opacity":{"signal":"showTicks ? 0 : 1"}
        }
      }
    },
    {
      "type": "text",
      "description":"displayed main value at the bottom center of the gauge ",
      "name": "gaugeValue",
      "encode": {
        "enter":{
          "x":{"signal": "centerX"},     
          "baseline":{"value":"top"},
          "align":{"value":"center"}
        },
        "update":{
          "text":{"signal":"format(mainValue, '.2f') + unit "},
          "y":{"signal":"centerY", "offset": {"signal": "fontFactor*5"}},   
          "fontSize":{"signal":"fontFactor * 14"}
        }
      }
    }
  ]
}
)

Bom dia, João!
Estou encaminhando para nossos especialistas na nossa engenharia.
Em breve teremos algum retorno.

Boa tarde!

Seu gráfico VEGA recebe o valor diretamente em uma variável, conforme seu código:

{
“name”: “mainValue”,
“value”:60
},

Mas a queries da plataforma enviam os dados no JSON no formato:
{ “time”: , “value”: }

Ou seja, não integra diretamente.

Para isto, usamos HTML, através do bloco “Custom HTML”.

Segue o código do header:
header.zip (1.8 KB)

E o código do Body fica:

<div class="container-fluid">
  <div class="row">
    <div class="col">
      <div id="chart"></div>
    </div>
  </div>
</div>

Você pode fazer qualquer “gauge query” com o seu atributo/device, só precisa colocar o nome dela no código conforme abaixo:

Imagem da query que utilizei:

1 Curtida