linechart.json 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. {
  2. "data": [
  3. {},
  4. {},
  5. {},
  6. {},
  7. {},
  8. {
  9. "name": "ranks",
  10. "source": "table",
  11. "transform": [
  12. {
  13. "type": "window",
  14. "sort": {
  15. "field": "dateTime",
  16. "order": "ascending"
  17. },
  18. "ops": [
  19. "rank"
  20. ],
  21. "fields": [
  22. "value"
  23. ],
  24. "as": [
  25. "rank"
  26. ]
  27. },
  28. {
  29. "type": "formula",
  30. "expr": "datum.rank + 1",
  31. "as": "nextRank"
  32. },
  33. {
  34. "type": "formula",
  35. "expr": "datum.rank - 1",
  36. "as": "prevRank"
  37. }
  38. ]
  39. },
  40. {
  41. "name": "lookup",
  42. "source": "ranks",
  43. "transform": [
  44. {
  45. "type": "lookup",
  46. "from": "ranks",
  47. "key": "rank",
  48. "fields": [
  49. "nextRank"
  50. ],
  51. "as": [
  52. "nextObj"
  53. ]
  54. },
  55. {
  56. "type": "lookup",
  57. "from": "ranks",
  58. "key": "rank",
  59. "fields": [
  60. "prevRank"
  61. ],
  62. "as": [
  63. "prevObj"
  64. ]
  65. },
  66. {
  67. "type": "formula",
  68. "expr": "(datum.nextObj == null || datum.nextObj.dateTime - datum.dateTime > maxTimeDifference) ? null : datum.nextObj",
  69. "as": "obj"
  70. },
  71. {
  72. "type": "formula",
  73. "expr": "datum.prevObj == null ? data('range')[0].dateMin : (time(datum.prevObj.dateTime) + time(datum.dateTime)) / 2",
  74. "as": "dateStart"
  75. },
  76. {
  77. "type": "formula",
  78. "expr": "datum.nextObj == null ? data('range')[0].dateMax : (time(datum.nextObj.dateTime) + time(datum.dateTime)) / 2",
  79. "as": "dateEnd"
  80. }
  81. ]
  82. }
  83. ],
  84. "signals": [
  85. {},
  86. {},
  87. {},
  88. {
  89. "name": "tooltipSignal",
  90. "value": {},
  91. "on": [
  92. {
  93. "events": "@tooltip-hitarea:mouseover",
  94. "update": "datum"
  95. },
  96. {
  97. "events": "@tooltip-hitarea:mouseout",
  98. "update": "{}"
  99. }
  100. ]
  101. }
  102. ],
  103. "marks": [
  104. {
  105. "scales": [
  106. {},
  107. {
  108. "name": "yDetail",
  109. "type": "linear",
  110. "range": [390, 0],
  111. "domain": {
  112. "fields": [
  113. {"data": "range", "field": "valueMax"},
  114. {"data": "table", "field": "value"}
  115. ]
  116. },
  117. "nice": true,
  118. "zero": false,
  119. "padding": 0
  120. }
  121. ],
  122. "axes": [
  123. {},
  124. {"orient": "left", "scale": "yDetail"}
  125. ],
  126. "marks": [
  127. {
  128. "marks": [
  129. {
  130. "name": "tooltip-hitarea",
  131. "type": "rect",
  132. "interactive": true,
  133. "from": {
  134. "data": "lookup"
  135. },
  136. "encode": {
  137. "enter": {
  138. "tooltip": {
  139. "signal": null
  140. }
  141. },
  142. "update": {
  143. "x": {
  144. "scale": "xDetail",
  145. "field": "dateStart"
  146. },
  147. "x2": {
  148. "scale": "xDetail",
  149. "field": "dateEnd"
  150. },
  151. "y": {
  152. "scale": "yDetail",
  153. "band": 1
  154. },
  155. "y2": {
  156. "scale": "yDetail",
  157. "signal": "-1e+36"
  158. },
  159. "fill": {
  160. "value": "#00ff00"
  161. },
  162. "fillOpacity": {
  163. "value": 0.0
  164. }
  165. }
  166. }
  167. },
  168. {
  169. "type": "symbol",
  170. "from": {"data":"lookup"},
  171. "encode": {
  172. "update": {
  173. "shape": {"value": "circle"},
  174. "size": {"value": 30},
  175. "x": {"scale": "xDetail", "field": "dateTime"},
  176. "y": {"scale": "yDetail", "field": "value"},
  177. "color": {"value": "both"},
  178. "strokeWidth": {"value": 4},
  179. "fill": {"value": "steelblue"}
  180. }
  181. }
  182. },
  183. {
  184. "type": "rule",
  185. "from": {
  186. "data": "lookup"
  187. },
  188. "encode": {
  189. "update": {
  190. "x": {
  191. "scale": "xDetail",
  192. "field": "dateTime"
  193. },
  194. "x2": [
  195. {
  196. "test": "isValid(datum.obj)",
  197. "scale": "xDetail",
  198. "field": "obj.dateTime"
  199. },
  200. {
  201. "scale": "xDetail",
  202. "field": "dateTime"
  203. }
  204. ],
  205. "y": {
  206. "scale": "yDetail",
  207. "field": "value"
  208. },
  209. "y2": [
  210. {
  211. "test": "isValid(datum.obj)",
  212. "scale": "yDetail",
  213. "field": "obj.value"
  214. },
  215. {
  216. "scale": "yDetail",
  217. "field": "value"
  218. }
  219. ],
  220. "stroke": {
  221. "value": "steelblue"
  222. },
  223. "strokeWidth": {
  224. "value": 1
  225. }
  226. }
  227. }
  228. },
  229. {
  230. "type": "rule",
  231. "interactive": false,
  232. "zindex": 20,
  233. "encode": {
  234. "update": {
  235. "x": {
  236. "scale": "xDetail",
  237. "signal": "tooltipSignal.dateTime"
  238. },
  239. "y": {
  240. "scale": "yDetail",
  241. "band": 1
  242. },
  243. "y2": {
  244. "scale": "yDetail",
  245. "signal": "-1e+36"
  246. },
  247. "strokeOpacity": [
  248. {
  249. "test": "tooltipSignal.dateTime > 1",
  250. "value": 1
  251. },
  252. {
  253. "value": 0
  254. }
  255. ]
  256. }
  257. }
  258. }
  259. ]
  260. }
  261. ]
  262. },
  263. {
  264. "signals": [
  265. {
  266. "value": 0,
  267. "on": [
  268. {},
  269. {
  270. "events": "@overview:mousedown",
  271. "update": "[x(), x()]"
  272. },
  273. {
  274. "events": "[@overview:mousedown, window:mouseup] > window:mousemove!",
  275. "update": "[brush[0], clamp(x(), 0, width)]"
  276. }
  277. ]
  278. }
  279. ],
  280. "marks": [
  281. {},
  282. {},
  283. {},
  284. {
  285. "type": "symbol",
  286. "from": {"data":"table"},
  287. "encode": {
  288. "update": {
  289. "shape": {"value": "circle"},
  290. "size": {"value": 10},
  291. "x": {"scale": "xOverview", "field": "dateTime"},
  292. "y": {"scale": "yOverview", "field": "value"},
  293. "color": {"value": "both"},
  294. "strokeWidth": {"value": 4}
  295. }
  296. }
  297. },
  298. {
  299. "type": "rule",
  300. "from": {
  301. "data": "lookup"
  302. },
  303. "encode": {
  304. "update": {
  305. "x": {
  306. "scale": "xOverview",
  307. "field": "dateTime"
  308. },
  309. "x2": [
  310. {
  311. "test": "isValid(datum.obj)",
  312. "scale": "xOverview",
  313. "field": "obj.dateTime"
  314. },
  315. {
  316. "scale": "xOverview",
  317. "field": "dateTime"
  318. }
  319. ],
  320. "y": {
  321. "scale": "yOverview",
  322. "field": "value"
  323. },
  324. "y2": [
  325. {
  326. "test": "isValid(datum.obj)",
  327. "scale": "yOverview",
  328. "field": "obj.value"
  329. },
  330. {
  331. "scale": "yOverview",
  332. "field": "value"
  333. }
  334. ],
  335. "stroke": {
  336. "value": "steelblue"
  337. },
  338. "strokeWidth": {
  339. "value": 1
  340. }
  341. }
  342. }
  343. }
  344. ]
  345. }
  346. ]
  347. }