Projekt

Obecné

Profil

« Předchozí | Další » 

Revize c2c2ce48

Přidáno uživatelem Štěpán Červenka před asi 4 roky(ů)

Re #8773 - Implementovat grafy pro jeden sensor

+ barchart for one sensor
+ windchart for one sensor
+ linechart for one sensor

Zobrazit rozdíly:

package-lock.json
1705 1705
      "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
1706 1706
      "dev": true
1707 1707
    },
1708
    "@types/clone": {
1709
      "version": "2.1.0",
1710
      "resolved": "https://registry.npmjs.org/@types/clone/-/clone-2.1.0.tgz",
1711
      "integrity": "sha512-d/aS/lPOnUSruPhgNtT8jW39fHRVTLQy9sodysP1kkG8EdAtdZu1vt8NJaYA8w/6Z9j8izkAsx1A/yJhcYR1CA=="
1712
    },
1708 1713
    "@types/component-emitter": {
1709 1714
      "version": "1.2.10",
1710 1715
      "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz",
......
1723 1728
      "integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ==",
1724 1729
      "dev": true
1725 1730
    },
1731
    "@types/fast-json-stable-stringify": {
1732
      "version": "2.0.0",
1733
      "resolved": "https://registry.npmjs.org/@types/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
1734
      "integrity": "sha512-mky/O83TXmGY39P1H9YbUpjV6l6voRYlufqfFCvel8l1phuy8HRjdWc1rrPuN53ITBJlbyMSV6z3niOySO5pgQ=="
1735
    },
1726 1736
    "@types/glob": {
1727 1737
      "version": "7.1.3",
1728 1738
      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
......
2121 2131
    "ansi-regex": {
2122 2132
      "version": "5.0.0",
2123 2133
      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
2124
      "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
2125
      "dev": true
2134
      "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
2126 2135
    },
2127 2136
    "ansi-styles": {
2128 2137
      "version": "3.2.1",
......
2248 2257
      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
2249 2258
      "dev": true
2250 2259
    },
2260
    "array-flat-polyfill": {
2261
      "version": "1.0.1",
2262
      "resolved": "https://registry.npmjs.org/array-flat-polyfill/-/array-flat-polyfill-1.0.1.tgz",
2263
      "integrity": "sha512-hfJmKupmQN0lwi0xG6FQ5U8Rd97RnIERplymOv/qpq8AoNKPPAnxJadjFA23FNWm88wykh9HmpLJUUwUtNU/iw=="
2264
    },
2251 2265
    "array-flatten": {
2252 2266
      "version": "2.1.2",
2253 2267
      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
......
3147 3161
      "version": "7.0.4",
3148 3162
      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
3149 3163
      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
3150
      "dev": true,
3151 3164
      "requires": {
3152 3165
        "string-width": "^4.2.0",
3153 3166
        "strip-ansi": "^6.0.0",
......
4778 4791
    "emoji-regex": {
4779 4792
      "version": "8.0.0",
4780 4793
      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
4781
      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
4782
      "dev": true
4794
      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
4783 4795
    },
4784 4796
    "emojis-list": {
4785 4797
      "version": "3.0.0",
......
4985 4997
    "escalade": {
4986 4998
      "version": "3.1.1",
4987 4999
      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
4988
      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
4989
      "dev": true
5000
      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
4990 5001
    },
4991 5002
    "escape-html": {
4992 5003
      "version": "1.0.3",
......
5378 5389
    "fast-deep-equal": {
5379 5390
      "version": "3.1.3",
5380 5391
      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
5381
      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
5382
      "dev": true
5392
      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
5383 5393
    },
5384 5394
    "fast-glob": {
5385 5395
      "version": "3.2.5",
......
5403 5413
    "fast-json-stable-stringify": {
5404 5414
      "version": "2.1.0",
5405 5415
      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
5406
      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
5407
      "dev": true
5416
      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
5408 5417
    },
5409 5418
    "fastparse": {
5410 5419
      "version": "1.1.2",
......
5809 5818
    "get-caller-file": {
5810 5819
      "version": "2.0.5",
5811 5820
      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
5812
      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
5813
      "dev": true
5821
      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
5814 5822
    },
5815 5823
    "get-intrinsic": {
5816 5824
      "version": "1.1.1",
......
6785 6793
    "is-fullwidth-code-point": {
6786 6794
      "version": "3.0.0",
6787 6795
      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
6788
      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
6789
      "dev": true
6796
      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
6790 6797
    },
6791 6798
    "is-glob": {
6792 6799
      "version": "4.0.1",
......
11160 11167
    "require-directory": {
11161 11168
      "version": "2.1.1",
11162 11169
      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
11163
      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
11164
      "dev": true
11170
      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
11165 11171
    },
11166 11172
    "require-main-filename": {
11167 11173
      "version": "2.0.0",
......
12619 12625
      "version": "4.2.2",
12620 12626
      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
12621 12627
      "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
12622
      "dev": true,
12623 12628
      "requires": {
12624 12629
        "emoji-regex": "^8.0.0",
12625 12630
        "is-fullwidth-code-point": "^3.0.0",
......
12667 12672
      "version": "6.0.0",
12668 12673
      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
12669 12674
      "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
12670
      "dev": true,
12671 12675
      "requires": {
12672 12676
        "ansi-regex": "^5.0.0"
12673 12677
      }
......
13714 13718
        "vega-util": "^1.15.2"
13715 13719
      }
13716 13720
    },
13721
    "vega-lite": {
13722
      "version": "5.1.0",
13723
      "resolved": "https://registry.npmjs.org/vega-lite/-/vega-lite-5.1.0.tgz",
13724
      "integrity": "sha512-HEyf0iHnCNmWkWFIbEmMphcJwZpcBnfnU8v+Ojrndr7ihDueojHMOSikoyz/GNpdkai+QFxLboA6DDCTtFv9iQ==",
13725
      "requires": {
13726
        "@types/clone": "~2.1.0",
13727
        "@types/fast-json-stable-stringify": "^2.0.0",
13728
        "array-flat-polyfill": "^1.0.1",
13729
        "clone": "~2.1.2",
13730
        "fast-deep-equal": "~3.1.3",
13731
        "fast-json-stable-stringify": "~2.1.0",
13732
        "json-stringify-pretty-compact": "~3.0.0",
13733
        "tslib": "~2.2.0",
13734
        "vega-event-selector": "~2.0.6",
13735
        "vega-expression": "~4.0.1",
13736
        "vega-util": "~1.16.1",
13737
        "yargs": "~16.2.0"
13738
      },
13739
      "dependencies": {
13740
        "clone": {
13741
          "version": "2.1.2",
13742
          "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
13743
          "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
13744
        },
13745
        "tslib": {
13746
          "version": "2.2.0",
13747
          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz",
13748
          "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w=="
13749
        }
13750
      }
13751
    },
13717 13752
    "vega-loader": {
13718 13753
      "version": "4.4.0",
13719 13754
      "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-4.4.0.tgz",
......
15610 15645
      "version": "7.0.0",
15611 15646
      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
15612 15647
      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
15613
      "dev": true,
15614 15648
      "requires": {
15615 15649
        "ansi-styles": "^4.0.0",
15616 15650
        "string-width": "^4.1.0",
......
15621 15655
          "version": "4.3.0",
15622 15656
          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
15623 15657
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
15624
          "dev": true,
15625 15658
          "requires": {
15626 15659
            "color-convert": "^2.0.1"
15627 15660
          }
......
15630 15663
          "version": "2.0.1",
15631 15664
          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
15632 15665
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
15633
          "dev": true,
15634 15666
          "requires": {
15635 15667
            "color-name": "~1.1.4"
15636 15668
          }
......
15638 15670
        "color-name": {
15639 15671
          "version": "1.1.4",
15640 15672
          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
15641
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
15642
          "dev": true
15673
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
15643 15674
        }
15644 15675
      }
15645 15676
    },
......
15680 15711
    "y18n": {
15681 15712
      "version": "5.0.5",
15682 15713
      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz",
15683
      "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==",
15684
      "dev": true
15714
      "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg=="
15685 15715
    },
15686 15716
    "yallist": {
15687 15717
      "version": "4.0.0",
......
15698 15728
      "version": "16.2.0",
15699 15729
      "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
15700 15730
      "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
15701
      "dev": true,
15702 15731
      "requires": {
15703 15732
        "cliui": "^7.0.2",
15704 15733
        "escalade": "^3.1.1",
......
15712 15741
    "yargs-parser": {
15713 15742
      "version": "20.2.6",
15714 15743
      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.6.tgz",
15715
      "integrity": "sha512-AP1+fQIWSM/sMiET8fyayjx/J+JmTPt2Mr0FkrgqB4todtfa53sOsrSAcIrJRD5XS20bKUwaDIuMkWKCEiQLKA==",
15716
      "dev": true
15744
      "integrity": "sha512-AP1+fQIWSM/sMiET8fyayjx/J+JmTPt2Mr0FkrgqB4todtfa53sOsrSAcIrJRD5XS20bKUwaDIuMkWKCEiQLKA=="
15717 15745
    },
15718 15746
    "yn": {
15719 15747
      "version": "3.1.1",
package.json
32 32
    "rxjs": "~6.6.0",
33 33
    "tslib": "^2.0.0",
34 34
    "vega": "^5.20.2",
35
    "vega-embed": "^6.17.0",
35
    "vega-tooltip": "^0.25.1",
36 36
    "zone.js": "~0.11.3"
37 37
  },
38 38
  "devDependencies": {
src/app/sensor/components/sensor.component.ts
41 41
    this.showGraph();
42 42
  }
43 43

  
44

  
45
  getGraph(sensorId, data, interval) {
46
    let spec = this.getGraphType(sensorId);
47
    const vega = require('vega');
48
    const vegaTooltip = require('vega-tooltip');
49

  
50
    spec.data[0].values = data;
51
    spec.signals[0].value = interval;
52

  
53

  
54
    let handler = new vegaTooltip.Handler();
55

  
56
    /*const view = new vega.View(vega.parse(spec), {
57
      renderer: 'canvas',
58
      container: '#view',
59
      hover: 'true'}).runAsync();*/
60

  
61
    const loc = vega.locale({
62
      "decimal": ",",
63
      "thousands": "\u00a0",
64
      "grouping": [3],
65
      "currency": ["", "\u00a0Kč"]
66
    },{
67
      "dateTime": "%A,%e.%B %Y, %X",
68
      "date": "%-d.%-m.%Y",
69
      "time": "%H:%M:%S",
70
      "periods": ["AM", "PM"],
71
      "days": ["neděle", "pondělí", "úterý", "středa", "čvrtek", "pátek", "sobota"],
72
      "shortDays": ["ne.", "po.", "út.", "st.", "čt.", "pá.", "so."],
73
      "months": ["leden", "únor", "březen", "duben", "květen", "červen", "červenec", "srpen", "září", "říjen", "listopad", "prosinec"],
74
      "shortMonths": ["led", "úno", "břez", "dub", "kvě", "čer", "červ", "srp", "zář", "říj", "list", "pros"]
75
    });
76

  
77
    let view = new vega.View(vega.parse(spec))
78
      .tooltip(handler.call)
79
      .initialize('#view')
80
      .hover()
81
      .locale(loc)
82
      .runAsync();
83

  
84

  
85

  
86
  }
87

  
88
  getGraphType(sensorId) {
89
    let spec;
90

  
91
    if(sensorId >= 480000000 && sensorId < 490000000) {
92
      spec = require('/src/vega/aggregate-barchart.json');
93
    } else if((sensorId >= 470020000 && sensorId <  470030000) || (sensorId >=470060000 && sensorId < 470090000) ||
94
      (sensorId >= 470130000 && sensorId < 470140000) || (sensorId >=470180000 && sensorId < 470190000)) {
95
      spec = require('/src/vega/aggregate-windchart.json');
96
    } else {
97
      spec = require('/src/vega/aggregate-linechart.json');
98
    }
99

  
100
    return spec;
101

  
102
  }
103

  
44 104
  showGraph() {
45 105
    let agg = 'HOUR';
46
    let range: Date[] = [moment().subtract(12, 'months').toDate(), moment().toDate()];
47
    const vega = require('vega');
48
    const spec = require('/src/vega/data.json');
106
    let range: Date[] = [moment().subtract(9, 'months').toDate(), moment().toDate()];
107
   // const vega = require('vega');
108
   // const spec = require('/src/vega/data.json');
49 109
/*    this.observationService.getObservation({
50 110
      unit_id: this.unitId,
51 111
      sensor_id: this.sensorId,
......
75 135
      to: moment(range[1]).format('yyyy-MM-DD HH:mm:ssZ').slice(0, -3), interval: agg}).subscribe(
76 136
      observations => {
77 137
        if (observations){
78
          spec.data[0].values = observations[this.sensorId].data;
138
          this.getGraph(this.sensorId, observations[this.sensorId].data, observations[this.sensorId].interval);
79 139
        } else {
80
          spec.data[0].values = null;
140
          //TODO observace null
81 141
        }
82 142

  
83
        const view = new vega.View(vega.parse(spec), {
84
          renderer: 'canvas',
85
          container: '#view',
86
          hover: 'true'}).runAsync();
143

  
87 144
      }
88 145
    )
89 146

  
src/vega/aggregate-barchart.json
1
{
2
  "$schema": "https://vega.github.io/schema/vega/v5.json",
3
  "width": 800,
4
  "height": 200,
5
  "padding": 5,
6

  
7
  "data": [
8
    {
9
      "name": "table",
10
      "values": null,
11
      "transform": [
12
        {
13
          "type": "formula",
14
          "expr": "toDate(datum[\"timestamp\"])",
15
          "as": "dateTime"
16
        },
17
        {
18
          "type": "timeunit",
19
          "field": "dateTime",
20
          "units": ["year","month", "date", "hours", "minutes", "seconds"],
21
          "step": {"signal": "timeStep"}
22
        },
23
        {
24
          "type": "formula",
25
          "expr": "time(datum[\"unit0\"] + (timeStep * 100))",
26
          "as": "barStart"
27
        },
28
        {
29
          "type": "formula",
30
          "expr": "time(datum[\"unit1\"] - (timeStep * 100))",
31
          "as": "barEnd"
32
        }
33
      ]
34
    }
35

  
36
      ],
37

  
38

  
39

  
40
  "signals": [
41
    {
42
      "name": "timeStep",
43
      "value": null
44
    },
45
    {
46
      "name": "detailDomain"
47
    }
48

  
49
  ],
50

  
51
  "marks": [
52
    {
53
      "type": "group",
54
      "name": "detail",
55
      "encode": {
56
        "enter": {
57
          "height": {"value": 390},
58
          "width": {"value": 800}
59
        }
60
      },
61
      "scales": [
62
        {
63
          "name": "xDetail",
64
          "type": "time",
65
          "range": "width",
66
          "domain": {"data": "table", "field": "dateTime"},
67
          "domainRaw": {"signal": "detailDomain"}
68
        },
69
        {
70
          "name": "yDetail",
71
          "type": "linear",
72
          "range": [390, 0],
73
          "domain": {"data": "table", "field": "avg"},
74
          "nice": true, "zero": true
75
        }
76
      ],
77
      "axes": [
78
        {"orient": "bottom", "scale": "xDetail"},
79
        {"orient": "left", "scale": "yDetail"}
80
      ],
81
      "marks": [
82
        {
83
          "type": "group",
84
          "encode": {
85
            "enter": {
86
              "height": {"field": {"group": "height"}},
87
              "width": {"field": {"group": "width"}},
88
              "clip": {"value": true}
89
            }
90
          },
91
          "marks": [
92
            {
93
              "type": "rect",
94
              "from": {"data":"table"},
95
              "encode": {
96
                "enter": {
97
                  "tooltip": {
98
                    "signal": "{title: timeFormat(datum.dateTime, '%A,%e.%B %Y, %X')  ,  'avg': datum.avg, 'sum': datum.sum, 'max': datum.max, 'min': datum.min }"
99
                  }},
100
                "update": {
101
                  "x": {"scale": "xDetail", "field": "barStart"},
102
                  "x2": {"scale": "xDetail", "field": "barEnd"},
103
                  "y": {"scale": "yDetail", "field": "avg"},
104
                  "y2": {"scale": "yDetail", "value": 0},
105
                  "color": {"value": "both"},
106
                  "fill": {"value": "steelBlue"}
107
                },
108
                "hover": {
109
                  "fill": {"value": "red"},
110
                  "size": {"value": 60}
111
                }
112
              }
113
            }
114

  
115

  
116

  
117
          ]
118
        }
119
      ]
120
    },
121

  
122
    {
123
      "type": "group",
124
      "name": "overview",
125
      "encode": {
126
        "enter": {
127
          "x": {"value": 0},
128
          "y": {"value": 430},
129
          "height": {"value": 70},
130
          "width": {"value": 720},
131
          "fill": {"value": "transparent"}
132
        }
133
      },
134
      "signals": [
135
        {
136
          "name": "brush", "value": 0,
137
          "on": [
138
            {
139
              "events": "@overview:mousedown",
140
              "update": "[x(), x()]"
141
            },
142
            {
143
              "events": "[@overview:mousedown, window:mouseup] > window:mousemove!",
144
              "update": "[brush[0], clamp(x(), 0, width)]"
145
            },
146
            {
147
              "events": {"signal": "delta"},
148
              "update": "clampRange([anchor[0] + delta, anchor[1] + delta], 0, width)"
149
            }
150
          ]
151
        },
152
        {
153
          "name": "anchor", "value": null,
154
          "on": [{"events": "@brush:mousedown", "update": "slice(brush)"}]
155
        },
156
        {
157
          "name": "xdown", "value": 0,
158
          "on": [{"events": "@brush:mousedown", "update": "x()"}]
159
        },
160
        {
161
          "name": "delta", "value": 0,
162
          "on": [
163
            {
164
              "events": "[@brush:mousedown, window:mouseup] > window:mousemove!",
165
              "update": "x() - xdown"
166
            }
167
          ]
168
        },
169
        {
170
          "name": "detailDomain",
171
          "push": "outer",
172
          "on": [
173
            {
174
              "events": {"signal": "brush"},
175
              "update": "span(brush) ? invert('xOverview', brush) : null"
176
            }
177
          ]
178
        }
179
      ],
180
      "scales": [
181
        {
182
          "name": "xOverview",
183
          "type": "time",
184
          "range": "width",
185
          "domain": {"data": "table", "field": "dateTime"}
186
        },
187
        {
188
          "name": "yOverview",
189
          "type": "linear",
190
          "range": [70, 0],
191
          "domain": {"data": "table", "field": "value"},
192
          "nice": true, "zero": true
193
        }
194
      ],
195
      "axes": [
196
        {"orient": "bottom", "scale": "xOverview"}
197
      ],
198
      "marks": [
199

  
200

  
201
        {
202
          "type": "rect",
203
          "name": "brush",
204
          "encode": {
205
            "enter": {
206
              "y": {"value": 0},
207
              "height": {"value": 70},
208
              "fill": {"value": "#333"},
209
              "fillOpacity": {"value": 0.2}
210
            },
211
            "update": {
212
              "x": {"signal": "brush[0]"},
213
              "x2": {"signal": "brush[1]"}
214
            }
215
          }
216
        },
217
        {
218
          "type": "rect",
219
          "interactive": false,
220
          "encode": {
221
            "enter": {
222
              "y": {"value": 0},
223
              "height": {"value": 70},
224
              "width": {"value": 1},
225
              "fill": {"value": "firebrick"}
226
            },
227
            "update": {
228
              "x": {"signal": "brush[0]"}
229
            }
230
          }
231
        },
232
        {
233
          "type": "rect",
234
          "interactive": false,
235
          "encode": {
236
            "enter": {
237
              "y": {"value": 0},
238
              "height": {"value": 70},
239
              "width": {"value": 1},
240
              "fill": {"value": "firebrick"}
241
            },
242
            "update": {
243
              "x": {"signal": "brush[1]"}
244
            }
245
          }
246
        }
247
      ]
248
    }
249
  ]
250
}
251

  
252

  
253

  
src/vega/aggregate-linechart.json
1
{
2
  "$schema": "https://vega.github.io/schema/vega/v5.json",
3
  "width": 800,
4
  "height": 200,
5
  "padding": 5,
6

  
7
  "data": [
8
    {
9
      "name": "table",
10
      "values": null,
11
      "transform": [
12
        {
13
          "type": "formula",
14
          "expr": "toDate(datum[\"timestamp\"])",
15
          "as": "dateTime"
16
        },
17
        {
18
          "type": "timeunit",
19
          "field": "dateTime",
20
          "units": ["year","month", "date", "hours", "minutes", "seconds"],
21
          "step": {"signal": "timeStep"}
22
        }
23
      ]
24
    },
25
    {
26
      "name": "table2",
27
      "source": "table",
28
      "transform":[
29
        {
30
          "type": "lookup",
31
          "from": "table",
32
          "key": "unit0",
33
          "fields": ["unit1"],
34
          "as": ["obj"]
35
        }
36

  
37
      ]
38
    },
39
    {
40
      "name": "table3",
41
      "source": "table",
42
      "transform": [
43
        {
44
          "type": "aggregate",
45
          "fields": ["dateTime", "dateTime"],
46
          "ops": ["min", "max"],
47
          "as": ["dateMinTemp", "dateMaxTemp"]
48
        },
49
        {
50
          "type": "formula",
51
          "expr":"time(datum[\"dateMinTemp\"] - (timeStep * 500))",
52
          "as": "dateMin"
53
        },
54
        {
55
          "type": "formula",
56
          "expr":"time(datum[\"dateMaxTemp\"] + (timeStep * 500))",
57
          "as": "dateMax"
58
        }
59
      ]
60
    }
61
  ],
62

  
63
  "signals": [
64
    {
65
      "name": "timeStep",
66
      "value": null
67
    },
68
    {
69
      "name": "detailDomain"
70
    }
71

  
72
  ],
73

  
74
  "marks": [
75
    {
76
      "type": "group",
77
      "name": "detail",
78
      "encode": {
79
        "enter": {
80
          "height": {"value": 390},
81
          "width": {"value": 800}
82
        }
83
      },
84
      "scales": [
85
        {
86
          "name": "xDetail",
87
          "type": "time",
88
          "range": "width",
89
          "domain": {"data": "table3", "fields": ["dateMin", "dateMax"]},
90
          "domainRaw": {"signal": "detailDomain"}
91
        },
92
        {
93
          "name": "yDetail",
94
          "type": "linear",
95
          "range": [390, 0],
96
          "domain": {"data": "table", "field": "avg"},
97
          "nice": true, "zero": true
98
        }
99
      ],
100
      "axes": [
101
        {"orient": "bottom", "scale": "xDetail"},
102
        {"orient": "left", "scale": "yDetail"}
103
      ],
104
      "marks": [
105
        {
106
          "type": "group",
107
          "encode": {
108
            "enter": {
109
              "height": {"field": {"group": "height"}},
110
              "width": {"field": {"group": "width"}},
111
              "clip": {"value": true}
112
            }
113
          },
114
          "marks": [
115
            {
116
              "type": "symbol",
117
              "from": {"data":"table"},
118
              "encode": {
119
                "enter": {
120
                  "tooltip": {
121
                    "signal": "{title: timeFormat(datum.dateTime, '%A, %e. %B %Y, %X')  ,  'avg': datum.avg, 'sum': datum.sum, 'max': datum.max, 'min': datum.min }"
122
                  }},
123
                "update": {
124
                  "shape": {"value": "circle"},
125
                  "size": {"value": 30},
126
                  "x": {"scale": "xDetail", "field": "dateTime"},
127
                  "y": {"scale": "yDetail", "field": "avg"},
128
                  "color": {"value": "both"},
129
                  "strokeWidth": {"value": 4},
130
                  "fill": {"value": "steelblue"}
131
                },
132
                "hover": {
133
                  "fill": {"value": "red"},
134
                  "size": {"value": 60}
135
                }
136
              }
137
            },
138
            {
139
              "type": "rule",
140
              "from": {
141
                "data": "table2"
142
              },
143
              "encode": {
144
                "update": {
145
                  "x": {
146
                    "scale": "xDetail",
147
                    "field": "unit0"
148
                  },
149
                  "x2": [
150
                    {
151
                      "test": "isValid(datum.obj)",
152
                      "scale": "xDetail",
153
                      "field": "obj.unit0"
154
                    },
155
                    {
156
                      "scale": "xDetail",
157
                      "field": "unit0"
158
                    }
159
                  ],
160
                  "y": {
161
                    "scale": "yDetail",
162
                    "field": "avg"
163
                  },
164
                  "y2": [
165
                    {
166
                      "test": "isValid(datum.obj)",
167
                      "scale": "yDetail",
168
                      "field": "obj.avg"
169
                    },
170
                    {
171
                      "scale": "yDetail",
172
                      "field": "avg"
173
                    }
174
                  ],
175
                  "stroke": {
176
                    "value": "steelblue"
177
                  },
178
                  "strokeWidth": {
179
                    "value": 1
180
                  }
181
                }
182
              }
183
            }
184

  
185

  
186
          ]
187
        }
188
      ]
189
    },
190

  
191
    {
192
      "type": "group",
193
      "name": "overview",
194
      "encode": {
195
        "enter": {
196
          "x": {"value": 0},
197
          "y": {"value": 430},
198
          "height": {"value": 70},
199
          "width": {"value": 720},
200
          "fill": {"value": "transparent"}
201
        }
202
      },
203
      "signals": [
204
        {
205
          "name": "brush", "value": 0,
206
          "on": [
207
            {
208
              "events": "@overview:mousedown",
209
              "update": "[x(), x()]"
210
            },
211
            {
212
              "events": "[@overview:mousedown, window:mouseup] > window:mousemove!",
213
              "update": "[brush[0], clamp(x(), 0, width)]"
214
            },
215
            {
216
              "events": {"signal": "delta"},
217
              "update": "clampRange([anchor[0] + delta, anchor[1] + delta], 0, width)"
218
            }
219
          ]
220
        },
221
        {
222
          "name": "anchor", "value": null,
223
          "on": [{"events": "@brush:mousedown", "update": "slice(brush)"}]
224
        },
225
        {
226
          "name": "xdown", "value": 0,
227
          "on": [{"events": "@brush:mousedown", "update": "x()"}]
228
        },
229
        {
230
          "name": "delta", "value": 0,
231
          "on": [
232
            {
233
              "events": "[@brush:mousedown, window:mouseup] > window:mousemove!",
234
              "update": "x() - xdown"
235
            }
236
          ]
237
        },
238
        {
239
          "name": "detailDomain",
240
          "push": "outer",
241
          "on": [
242
            {
243
              "events": {"signal": "brush"},
244
              "update": "span(brush) ? invert('xOverview', brush) : null"
245
            }
246
          ]
247
        }
248
      ],
249
      "scales": [
250
        {
251
          "name": "xOverview",
252
          "type": "time",
253
          "range": "width",
254
          "domain": {"data": "table3", "fields": ["dateMin", "dateMax"]}
255
        },
256
        {
257
          "name": "yOverview",
258
          "type": "linear",
259
          "range": [70, 0],
260
          "domain": {"data": "table", "field": "avg"},
261
          "nice": true, "zero": true
262
        }
263
      ],
264
      "axes": [
265
        {"orient": "bottom", "scale": "xOverview"}
266
      ],
267
      "marks": [
268
        {
269
          "type": "symbol",
270
          "from": {"data":"table"},
271
          "encode": {
272
            "update": {
273
              "shape": {"value": "circle"},
274
              "size": {"value": 10},
275
              "x": {"scale": "xOverview", "field": "dateTime"},
276
              "y": {"scale": "yOverview", "field": "avg"},
277
              "color": {"value": "both"},
278
              "strokeWidth": {"value": 4}
279
            }
280
          }
281
        },
282
        {
283
          "type": "rule",
284
          "from": {
285
            "data": "table2"
286
          },
287
          "encode": {
288
            "update": {
289
              "x": {
290
                "scale": "xOverview",
291
                "field": "unit0"
292
              },
293
              "x2": [
294
                {
295
                  "test": "isValid(datum.obj)",
296
                  "scale": "xOverview",
297
                  "field": "obj.unit0"
298
                },
299
                {
300
                  "scale": "xOverview",
301
                  "field": "unit0"
302
                }
303
              ],
304
              "y": {
305
                "scale": "yOverview",
306
                "field": "avg"
307
              },
308
              "y2": [
309
                {
310
                  "test": "isValid(datum.obj)",
311
                  "scale": "yOverview",
312
                  "field": "obj.avg"
313
                },
314
                {
315
                  "scale": "yOverview",
316
                  "field": "avg"
317
                }
318
              ],
319
              "stroke": {
320
                "value": "steelblue"
321
              },
322
              "strokeWidth": {
323
                "value": 1
324
              }
325
            }
326
          }
327
        },
328

  
329
        {
330
          "type": "rect",
331
          "name": "brush",
332
          "encode": {
333
            "enter": {
334
              "y": {"value": 0},
335
              "height": {"value": 70},
336
              "fill": {"value": "#333"},
337
              "fillOpacity": {"value": 0.2}
338
            },
339
            "update": {
340
              "x": {"signal": "brush[0]"},
341
              "x2": {"signal": "brush[1]"}
342
            }
343
          }
344
        },
345
        {
346
          "type": "rect",
347
          "interactive": false,
348
          "encode": {
349
            "enter": {
350
              "y": {"value": 0},
351
              "height": {"value": 70},
352
              "width": {"value": 1},
353
              "fill": {"value": "firebrick"}
354
            },
355
            "update": {
356
              "x": {"signal": "brush[0]"}
357
            }
358
          }
359
        },
360
        {
361
          "type": "rect",
362
          "interactive": false,
363
          "encode": {
364
            "enter": {
365
              "y": {"value": 0},
366
              "height": {"value": 70},
367
              "width": {"value": 1},
368
              "fill": {"value": "firebrick"}
369
            },
370
            "update": {
371
              "x": {"signal": "brush[1]"}
372
            }
373
          }
374
        }
375
      ]
376
    }
377
  ]
378
}
379

  
380

  
381

  
src/vega/aggregate-windchart.json
1
{
2
  "$schema": "https://vega.github.io/schema/vega/v5.json",
3
  "width": 720,
4
  "height": 200,
5
  "padding": 5,
6

  
7

  
8

  
9
  "data": [
10
    {
11
      "name": "table",
12
      "values": null,
13
      "transform": [
14
        {
15
          "type": "formula",
16
          "expr": "toDate(datum[\"timestamp\"])",
17
          "as": "dateTime"
18
        }]
19

  
20
    },
21
    {
22
      "name": "table2",
23
      "source": "table",
24
      "transform": [
25
        {
26
          "type": "aggregate",
27
          "fields": ["dateTime", "dateTime"],
28
          "ops": ["min", "max"],
29
          "as": ["dateMinTemp", "dateMaxTemp"]
30
        },
31
        {
32
          "type": "formula",
33
          "expr":"time(datum[\"dateMinTemp\"] - (timeStep * 1000))",
34
          "as": "dateMin"
35
        },
36
        {
37
          "type": "formula",
38
          "expr":"time(datum[\"dateMaxTemp\"] + (timeStep * 1000))",
39
          "as": "dateMax"
40
        },
41
        {
42
          "type": "formula",
43
          "expr":"time(datum[\"dateMax\"]) - time(datum[\"dateMin\"])",
44
          "as": "range"
45
        }
46
      ]
47
    }
48
  ],
49

  
50
  "signals": [
51
    {
52
      "name": "timeStep",
53
      "value": null
54
    },
55
    {
56
      "name": "arrowCount",
57
      "value": 25
58
    },
59
    {
60
      "name": "selectionWidth",
61
      "update": "floor((arrowCount * (timeStep * 1000) * width) / data('table2')[0].range)"
62
    },
63
    {
64
      "name": "detailDomain",
65
      "update": "[time(data('table2')[0].dateMin), time(data('table2')[0].dateMin) + ((timeStep * 1000) * arrowCount)] "
66
    }
67
  ],
68

  
69
  "marks": [
70
    {
71
      "type": "group",
72
      "name": "detail",
73
      "encode": {
74
        "enter": {
75
          "height": {"value": 60},
76
          "width": {"value": 720}
77
        }
78
      },
79
      "scales": [
80
        {
81
          "name": "xDetail",
82
          "type": "time",
83
          "range": "width",
84
          "domain": {"signal": "detailDomain"}
85
        }
86
      ],
87
      "axes": [
88
        {"orient": "bottom", "scale": "xDetail"}
89
      ],
90
      "marks": [
91
        {
92
          "type": "group",
93
          "encode": {
94
            "enter": {
95
              "height": {"field": {"group": "height"}},
96
              "width": {"field": {"group": "width"}},
97
              "clip": {"value": true}
98
            }
99
          },
100
          "marks": [
101
            {
102
              "type": "symbol",
103
              "from": {"data": "table"},
104
              "encode": {
105
                "enter": {
106
                  "tooltip": {
107
                    "signal": "{title: timeFormat(datum.dateTime, '%B %d, %Y %H:%M') , 'avg': datum.avg, 'sum': datum.sum, 'max': datum.max, 'min': datum.min}"
108
                  }
109
                },
110
                "hover": { "fill": {"value": "red"} },
111
                "update": {
112
                  "shape": {"value": "arrow"},
113
                  "size": {"value": 500},
114
                  "x": {"scale": "xDetail", "field": "dateTime"},
115
                  "y": {"value":30},
116
                  "angle":{"field": "avg"},
117
                  "color": {"value": "both"},
118
                  "strokeWidth": {"value": 1},
119
                  "fill": {"value": "steelblue"}
120

  
121
                }
122

  
123
              }
124
            }
125
          ]
126
        }
127
      ]
128
    },
129

  
130
    {
131
      "type": "group",
132
      "name": "overview",
133
      "encode": {
134
        "enter": {
135
          "x": {"value": 0},
136
          "y": {"value": 100},
137
          "height": {"value": 70},
138
          "width": {"value": 720},
139
          "fill": {"value": "transparent"}
140
        }
141
      },
142
      "signals": [
143
        {
144
          "name": "brush",
145
          "update": "[0,selectionWidth]",
146
          "on": [
147
            {
148
              "events": {"signal": "delta"},
149
              "update": "clampRange([anchor[0] + delta, anchor[1] + delta], 0, width)"
150
            }
151

  
152
          ]
153
        },
154
        {
155
          "name": "anchor", "value": null,
156
          "on": [{"events": "@brush:mousedown", "update": "slice(brush)"}]
157
        },
158
        {
159
          "name": "xdown", "value": 0,
160
          "on": [{"events": "@brush:mousedown", "update": "x()"}]
161
        },
162
        {
163
          "name": "delta", "value": 0,
164
          "on": [
165
            {
166
              "events": "[@brush:mousedown, window:mouseup] > window:mousemove!",
167
              "update": "x() - xdown"
168
            }
169
          ]
170
        },
171
        {
172
          "name": "detailDomain",
173
          "push": "outer",
174
          "on": [
175
            {
176
              "events": {"signal": "brush"},
177
              "update": "invert('xOverview', brush)"
178
            }
179
          ]
180
        }],
181
      "scales": [
182
        {
183
          "name": "xOverview",
184
          "type": "time",
185
          "range": "width",
186
          "domain": {"data": "table2", "fields": ["dateMin", "dateMax"]}
187
        },
188
        {
189
          "name": "yOverview",
190
          "type": "linear",
191
          "range": [70, 0],
192
          "nice": true, "zero": true
193
        }
194
      ],
195
      "axes": [
196
        {"orient": "bottom", "scale": "xOverview"}
197
      ],
198
      "marks": [
199

  
200
        {
201
          "type": "rect",
202
          "name": "brush",
203
          "encode": {
204
            "enter": {
205
              "y": {"value": 0},
206
              "height": {"value": 70},
207
              "fill": {"value": "#333"},
208
              "fillOpacity": {"value": 0.2}
209
            },
210
            "update": {
211
              "x": {"signal": "brush[0]"},
212
              "x2": {"signal": "brush[1]"}
213
            }
214
          }
215
        },
216
        {
217
          "type": "rect",
218
          "interactive": false,
219
          "encode": {
220
            "enter": {
221
              "y": {"value": 0},
222
              "height": {"value": 70},
223
              "width": {"value": 1},
224
              "fill": {"value": "firebrick"}
225
            },
226
            "update": {
227
              "x": {"signal": "brush[0]"}
228
            }
229
          }
230
        },
231
        {
232
          "type": "rect",
233
          "interactive": false,
234
          "encode": {
235
            "enter": {
236
              "y": {"value": 0},
237
              "height": {"value": 70},
238
              "width": {"value": 1},
239
              "fill": {"value": "firebrick"}
240
            },
241
            "update": {
242
              "x": {"signal": "brush[1]"}
243
            }
244
          }
245
        }
246

  
247

  
248
      ]
249
    }
250

  
251

  
252

  
253

  
254

  
255

  
256
  ]
257
}
src/vega/basic-barchart.json
1
{
2
  "$schema": "https://vega.github.io/schema/vega/v5.json",
3
  "width": 800,
4
  "height": 200,
5
  "padding": 5,
6

  
7
  "data": [
8
    {
9
      "name": "table",
10
      "values": null,
11
      "transform": [
12
        {
13
          "type": "formula",
14
          "expr": "toDate(datum[\"time\"])",
15
          "as": "dateTime"
16
        },
17
        {
18
          "type": "timeunit",
19
          "field": "dateTime",
20
          "units": ["year","month", "date", "hours", "minutes", "seconds"],
21
          "step": {"signal": "timeStep"}
22
        },
23
        {
24
          "type": "formula",
25
          "expr": "time(datum[\"unit0\"] + (timeStep * 100))",
26
          "as": "barStart"
27
        },
28
        {
29
          "type": "formula",
30
          "expr": "time(datum[\"unit1\"] - (timeStep * 100))",
31
          "as": "barEnd"
32
        }
33
      ]
34
    },
35
    {
36
      "name": "table2",
37
      "source": "table",
38
      "transform":[
39
        {
40
          "type": "lookup",
41
          "from": "table",
42
          "key": "unit0",
43
          "fields": ["unit1"],
44
          "as": ["obj"]
45
        }
46

  
47
      ]
48

  
49
    }
50
  ],
51

  
52
  "signals": [
53
    {
54
      "name": "detailDomain"
55
    },
56
    {
57
      "name": "timeStep",
58
      "value": 1800
59
    }
60
  ],
61

  
62
  "marks": [
63
    {
64
      "type": "group",
65
      "name": "detail",
66
      "encode": {
67
        "enter": {
68
          "height": {"value": 390},
69
          "width": {"value": 800}
70
        }
71
      },
72
      "scales": [
73
        {
74
          "name": "xDetail",
75
          "type": "time",
76
          "range": "width",
77
          "domain": {"data": "table", "field": "dateTime"},
78
          "domainRaw": {"signal": "detailDomain"}
79
        },
80
        {
81
          "name": "yDetail",
82
          "type": "linear",
83
          "range": [390, 0],
84
          "domain": {"data": "table", "field": "value"},
85
          "nice": true, "zero": true
86
        }
87
      ],
88
      "axes": [
89
        {"orient": "bottom", "scale": "xDetail"},
90
        {"orient": "left", "scale": "yDetail"}
91
      ],
92
      "marks": [
93
        {
94
          "type": "group",
95
          "encode": {
96
            "enter": {
97
              "height": {"field": {"group": "height"}},
98
              "width": {"field": {"group": "width"}},
99
              "clip": {"value": true}
100
            }
101
          },
102
          "marks": [
103
            {
104
              "type": "rect",
105
              "from": {"data":"table"},
106
              "encode": {
107
                "enter": {
108
                  "tooltip": {
109
                    "signal": "{title: timeFormat(datum.dateTime, '%B %d, %Y %H:%M')  , 'gid': datum.gid , 'value': datum.value }"
110
                  }},
111
                "update": {
112
                  "x": {"scale": "xDetail", "field": "barStart"},
113
                  "x2": {"scale": "xDetail", "field": "barEnd"},
114
                  "y": {"scale": "yDetail", "field": "value"},
115
                  "y2": {"scale": "yDetail", "value": 0},
116
                  "color": {"value": "both"},
117
                  "fill": {"value": "steelblue"}
118
                },
119
                "hover": {
120
                  "fill": {"value": "red"},
121
                  "size": {"value": 60}
122
                }
123
              }
124
            }
125

  
126

  
127

  
128
          ]
129
        }
130
      ]
131
    },
132

  
133
    {
134
      "type": "group",
135
      "name": "overview",
136
      "encode": {
137
        "enter": {
138
          "x": {"value": 0},
139
          "y": {"value": 430},
140
          "height": {"value": 70},
141
          "width": {"value": 720},
142
          "fill": {"value": "transparent"}
143
        }
144
      },
145
      "signals": [
146
        {
147
          "name": "brush", "value": 0,
148
          "on": [
149
            {
150
              "events": "@overview:mousedown",
151
              "update": "[x(), x()]"
152
            },
153
            {
154
              "events": "[@overview:mousedown, window:mouseup] > window:mousemove!",
155
              "update": "[brush[0], clamp(x(), 0, width)]"
156
            },
157
            {
158
              "events": {"signal": "delta"},
159
              "update": "clampRange([anchor[0] + delta, anchor[1] + delta], 0, width)"
160
            }
161
          ]
162
        },
163
        {
164
          "name": "anchor", "value": null,
165
          "on": [{"events": "@brush:mousedown", "update": "slice(brush)"}]
166
        },
167
        {
168
          "name": "xdown", "value": 0,
169
          "on": [{"events": "@brush:mousedown", "update": "x()"}]
170
        },
171
        {
172
          "name": "delta", "value": 0,
173
          "on": [
174
            {
175
              "events": "[@brush:mousedown, window:mouseup] > window:mousemove!",
176
              "update": "x() - xdown"
177
            }
178
          ]
179
        },
180
        {
181
          "name": "detailDomain",
182
          "push": "outer",
183
          "on": [
184
            {
185
              "events": {"signal": "brush"},
186
              "update": "span(brush) ? invert('xOverview', brush) : null"
187
            }
188
          ]
189
        }
190
      ],
191
      "scales": [
192
        {
193
          "name": "xOverview",
194
          "type": "time",
195
          "range": "width",
196
          "domain": {"data": "table", "field": "dateTime"}
197
        },
198
        {
199
          "name": "yOverview",
200
          "type": "linear",
201
          "range": [70, 0],
202
          "domain": {"data": "table", "field": "value"},
203
          "nice": true, "zero": true
204
        }
205
      ],
206
      "axes": [
207
        {"orient": "bottom", "scale": "xOverview"}
208
      ],
209
      "marks": [
210

  
211

  
212
        {
213
          "type": "rect",
214
          "name": "brush",
215
          "encode": {
216
            "enter": {
217
              "y": {"value": 0},
218
              "height": {"value": 70},
219
              "fill": {"value": "#333"},
220
              "fillOpacity": {"value": 0.2}
221
            },
... Rozdílový soubor je zkrácen, protože jeho délka přesahuje max. limit.

Také k dispozici: Unified diff