default.json 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. {
  2. "data": [
  3. {
  4. "name": "legend",
  5. "values": null
  6. },
  7. {
  8. "name": "source",
  9. "values": null
  10. },
  11. {
  12. "name": "flatten",
  13. "source": "source"
  14. },
  15. {
  16. "name": "table",
  17. "source": "flatten",
  18. "transform": [
  19. {
  20. "type": "project",
  21. "fields": [
  22. {"signal" : "valuePath"},
  23. {"signal": "timestampPath"}
  24. ],
  25. "as": [
  26. "value",
  27. "timestamp"
  28. ]
  29. },
  30. {
  31. "type": "formula",
  32. "expr": "utcParse(datum.timestamp, '%Y-%m-%d %H:%M:%S%Z')",
  33. "as": "dateTime"
  34. }
  35. ]
  36. },
  37. {
  38. "name": "range",
  39. "source": "table",
  40. "transform": [
  41. {
  42. "type": "aggregate",
  43. "fields": ["dateTime", "dateTime", "value"],
  44. "ops": ["min", "max", "max"],
  45. "as": ["dateMinTemp", "dateMaxTemp", "maxValueTemp"]
  46. },
  47. {
  48. "type": "formula",
  49. "expr":"time(datum[\"dateMinTemp\"]) - timeWindow",
  50. "as": "dateMin"
  51. },
  52. {
  53. "type": "formula",
  54. "expr":"time(datum[\"dateMaxTemp\"]) + timeWindow",
  55. "as": "dateMax"
  56. },
  57. {
  58. "type": "formula",
  59. "expr": "datum[\"maxValueTemp\"] * 1.0",
  60. "as": "valueMax"
  61. }
  62. ]
  63. }
  64. ],
  65. "signals": [
  66. {
  67. "name": "timeWindow",
  68. "value": null
  69. },
  70. {
  71. "name": "maxTimeDifference",
  72. "update": "timeWindow * 5"
  73. },
  74. {
  75. "name": "detailDomain"
  76. }
  77. ],
  78. "marks": [
  79. {
  80. "type": "group",
  81. "name": "detail",
  82. "encode": {
  83. "update": {
  84. "height": {"signal": "detailHeight"},
  85. "width": {"signal": "width"}
  86. }
  87. },
  88. "scales": [
  89. {
  90. "name": "xDetail",
  91. "type": "time",
  92. "range": "width",
  93. "domain": {
  94. "data": "range",
  95. "fields": [
  96. "dateMin",
  97. "dateMax"
  98. ]
  99. },
  100. "domainRaw": {"signal": "detailDomain"}
  101. }
  102. ],
  103. "axes": [
  104. {"orient": "bottom", "scale": "xDetail"}
  105. ],
  106. "marks": [
  107. {
  108. "type": "group",
  109. "encode": {
  110. "update": {
  111. "height": {
  112. "field": {
  113. "group": "height"
  114. }
  115. },
  116. "width": {
  117. "field": {
  118. "group": "width"
  119. }
  120. },
  121. "clip": {
  122. "value": true
  123. }
  124. }
  125. }
  126. }
  127. ]
  128. },
  129. {
  130. "type": "group",
  131. "name": "overview",
  132. "encode": {
  133. "update": {
  134. "x": {"value": 0},
  135. "y": {"signal": "overviewHeightStart"},
  136. "height": {"signal": "overviewHeight"},
  137. "width": {"signal": "width"},
  138. "fill": {"value": "transparent"}
  139. }
  140. },
  141. "signals": [
  142. {
  143. "name": "brush",
  144. "on": [
  145. {
  146. "events": {"signal": "delta"},
  147. "update": "clampRange([anchor[0] + delta, anchor[1] + delta], 0, width)"
  148. }
  149. ]
  150. },
  151. {
  152. "name": "anchor", "value": null,
  153. "on": [{"events": "@brush:mousedown", "update": "slice(brush)"}]
  154. },
  155. {
  156. "name": "xdown", "value": 0,
  157. "on": [{"events": "@brush:mousedown", "update": "x()"}]
  158. },
  159. {
  160. "name": "delta", "value": 0,
  161. "on": [
  162. {
  163. "events": "[@brush:mousedown, window:mouseup] > window:mousemove!",
  164. "update": "x() - xdown"
  165. }
  166. ]
  167. },
  168. {
  169. "name": "detailDomain",
  170. "push": "outer",
  171. "on": [
  172. {
  173. "events": {"signal": "brush"},
  174. "update": "span(brush) ? invert('xOverview', brush) : null"
  175. }
  176. ]
  177. }
  178. ],
  179. "scales": [
  180. {
  181. "name": "xOverview",
  182. "type": "time",
  183. "range": "width",
  184. "domain": {"data": "range", "fields": ["dateMin", "dateMax"]}
  185. },
  186. {
  187. "name": "yOverview",
  188. "type": "linear",
  189. "range": [70, 0],
  190. "domain": {"data": "table", "field": "value"},
  191. "nice": true,
  192. "zero": false,
  193. "padding": 0
  194. }
  195. ],
  196. "axes": [
  197. {"orient": "bottom", "scale": "xOverview"}
  198. ],
  199. "marks": [
  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. }