mattijn
2/21/2019 - 8:53 PM

vega4_overview_detail_static.json

{
  "$schema": "https://vega.github.io/schema/vega/v4.json",
  "width": 720,
  "padding": 5,
  "data": [
    {
      "name": "source",
      "url": "https://tsws.hkvservices.nl/mangrove.ws/entry.asmx/Call?function=mangrove.fews.GetTimeSeries&parameters={host:%27data.hkvfewsscheldestromen.nl%27,port:8080,region:%27FewsPiService%27,version:%271.22%27,headers:%27true%27,start:%272018-07-01T13:07:58.547Z%27,end:%272019-02-15T13:07:58.547Z%27,filterid:%27HKV_WV%27,locations:[%27KGM159%27],parameters:[%27WNSHDB1%27]}",
      "format": {"type": "json"}
    },
    {
      "name": "events",
      "source": "source",
      "transform": [
        {"type": "flatten", "fields": ["events"], "as": ["events"]},
        {
          "type": "project",
          "fields": ["events.date", "events.time", "events.value"],
          "as": ["date", "time", "value"]
        },
        {
          "type": "formula",
          "as": "datetime",
          "expr": "datetime(year(datum.date), month(datum.date), date(datum.date), parseInt(substring(datum.time,0,2)), parseInt(substring(datum.time,3,5)),parseInt(substring(datum.time,6,8)))"
        }
      ]
    },
    {
      "name": "datetimeExtent",
      "source": "events",
      "transform": [
        {"type": "extent", "field": "datetime", "signal": "datetimeExtent"}
      ]
    },
    {
      "name": "highlightedPoint",
      "source": "events",
      "transform": [
        {
          "type": "filter",
          "expr": "hover && hover.datum.datetime === datum.datetime && hover.datum.value === datum.value"
        }
      ]
    },
    {
      "name": "eventsAggregated",
      "source": "events",
      "transform": [
        {
          "type": "formula",
          "as": "datetimeAggregated",
          "expr": "datetime(year(datum.datetime), month(datum.datetime), date(datum.datetime), 0, 0, 0, 0)"
        },
        {
          "type": "aggregate",
          "groupby": ["datetimeAggregated"],
          "ops": ["mean"],
          "fields": ["value"],
          "as": ["valueAggregated"]
        }
      ]
    }
  ],
  "signals": [
    {"name": "detailDomain", "value": [1548975600000, 1550185200000]},
    {"name": "detailHeight", "value": 200},
    {"name": "overviewHeight", "update": "detailHeight * 0.25"},
    {
      "name": "hover",
      "value": null,
      "on": [
        {"events": "@points_voronoi:mouseover", "update": "datum"},
        {"events": "@points_voronoi:mouseout", "update": "null"}
      ]
    },
    {
      "name": "signal_highligtedpoint",
      "value": "test",
      "update": "data('highlightedPoint')[0]"
    }
  ],
  "marks": [
    {
      "type": "group",
      "name": "detail",
      "encode": {
        "update": {
          "height": {"signal": "detailHeight"},
          "width": {"signal": "width"}
        }
      },
      "scales": [
        {
          "name": "xDetail",
          "type": "time",
          "range": "width",
          "domain": {"data": "events", "field": "datetime"},
          "domainRaw": {"signal": "detailDomain"}
        },
        {
          "name": "yDetail",
          "type": "linear",
          "range": [{"signal": "detailHeight"}, 0],
          "domain": {"data": "events", "field": "value"},
          "nice": true
        }
      ],
      "axes": [
        {"orient": "bottom", "scale": "xDetail", "grid": true},
        {
          "orient": "left",
          "scale": "yDetail",
          "title": "xx",
          "grid": true,
          "tickCount": {"signal": "ceil(detailHeight/50)"}
        }
      ],
      "marks": [
        {
          "type": "group",
          "encode": {
            "enter": {
              "height": {"field": {"group": "height"}},
              "width": {"field": {"group": "width"}},
              "clip": {"value": true}
            }
          },
          "marks": [
            {
              "type": "line",
              "from": {"data": "events"},
              "encode": {
                "update": {
                  "x": {"scale": "xDetail", "field": "datetime"},
                  "y": {"scale": "yDetail", "field": "value"},
                  "stroke": {"value": "steelblue"},
                  "tooltip": {
                    "signal": "'value: ' +  format(datum.value, '.2f') + ' ('+ timeFormat(datum.datetime, '%Y-%m-%d %H:%M'+')')"
                  }
                }
              }
            }
          ]
        }
      ]
    },
    {
      "type": "group",
      "name": "overview",
      "encode": {
        "enter": {
          "x": {"value": 0},
          "y": {"signal": "detailHeight + 30"},
          "height": {"signal": "overviewHeight"},
          "width": {"signal": "width"},
          "fill": {"value": "transparent"}
        }
      },
      "signals": [
        {
          "name": "brush",
          "update": "[scale('xOverview', detailDomain[0]), scale('xOverview', detailDomain[1])]",
          "on": [
            {
              "events": {"signal": "delta"},
              "update": "clampRange([anchor[0] + delta, anchor[1] + delta], 0, width)"
            }
          ]
        },
        {
          "name": "anchor",
          "value": null,
          "on": [{"events": "@brush:mousedown", "update": "slice(brush)"}]
        },
        {
          "name": "xdown",
          "value": 0,
          "on": [{"events": "@brush:mousedown", "update": "x()"}]
        },
        {
          "name": "delta",
          "value": 0,
          "on": [
            {
              "events": "[@brush:mousedown, window:mouseup] > window:mousemove!",
              "update": "x() - xdown"
            }
          ]
        },
        {
          "name": "detailDomain",
          "push": "outer",
          "on": [
            {
              "events": {"signal": "brush"},
              "update": "span(brush) ? invert('xOverview', brush) : null"
            }
          ]
        }
      ],
      "scales": [
        {
          "name": "xOverview",
          "type": "time",
          "range": "width",
          "domain": {"data": "eventsAggregated", "field": "datetimeAggregated"}
        },
        {
          "name": "yOverview",
          "type": "linear",
          "range": [{"signal": "overviewHeight"}, 0],
          "domain": {"data": "eventsAggregated", "field": "valueAggregated"},
          "nice": true,
          "zero": true
        }
      ],
      "axes": [{"orient": "bottom", "scale": "xOverview"}],
      "marks": [
        {
          "type": "line",
          "interactive": false,
          "from": {"data": "eventsAggregated"},
          "encode": {
            "update": {
              "x": {"scale": "xOverview", "field": "datetimeAggregated"},
              "y": {"scale": "yOverview", "field": "valueAggregated"},
              "stroke": {"value": "steelblue"}
            }
          }
        },
        {
          "type": "rect",
          "name": "brush",
          "encode": {
            "enter": {
              "y": {"value": 0},
              "height": {"signal": "overviewHeight"},
              "fill": {"value": "#333"},
              "fillOpacity": {"value": 0.2}
            },
            "update": {
              "x": {"signal": "brush[0]"},
              "x2": {"signal": "brush[1]"}
            }
          }
        },
        {
          "type": "rect",
          "interactive": false,
          "encode": {
            "enter": {
              "y": {"value": 0},
              "height": {"signal": "overviewHeight"},
              "width": {"value": 1},
              "fill": {"value": "firebrick"}
            },
            "update": {"x": {"signal": "brush[0]"}}
          }
        },
        {
          "type": "rect",
          "interactive": false,
          "encode": {
            "enter": {
              "y": {"value": 0},
              "height": {"signal": "overviewHeight"},
              "width": {"value": 1},
              "fill": {"value": "firebrick"}
            },
            "update": {"x": {"signal": "brush[1]"}}
          }
        }
      ]
    }
  ]
}