mattijn
7/21/2017 - 9:44 AM

vega3_verticalvoronoi_zoom_tooltip.json

{
  "$schema": "https://vega.github.io/schema/vega/v3.0.json",
  "width": 500,
  "height": 400,
  "padding": {
    "top": 10,
    "left": 30,
    "bottom": 50,
    "right": 10
  },
  "autosize": "none",
  "data": [
    {
      "name": "table",
      "values": [
        {
          "u": 0,
          "v": 38,
          "c": 32
        },
        {
          "u": 2,
          "v": 31,
          "c": 32
        },
        {
          "u": 4,
          "v": 32,
          "c": 32
        },
        {
          "u": 6,
          "v": 27,
          "c": 32
        },
        {
          "u": 8,
          "v": 38,
          "c": 32
        },
        {
          "u": 10,
          "v": 33,
          "c": 32
        },
        {
          "u": 12,
          "v": 39,
          "c": 32
        },
        {
          "u": 14,
          "v": 34,
          "c": 32
        },
        {
          "u": 16,
          "v": 27,
          "c": 32
        },
        {
          "u": 18,
          "v": 39,
          "c": 32
        }
      ],
      "transform": [     
        {
          "type": "extent",
          "field": "u",
          "signal": "xext"
        },
        {
          "type": "extent",
          "field": "v",
          "signal": "yext"
        }
      ]
    },
    {
      "name": "voronMean",
      "source": "table",
      "transform": [ 
        {
          "type": "aggregate",
          "ops": [
            "mean"
          ],
          "fields": [
            "v"
          ],
          "as": [
            "mean_v"
          ]
        } ,
        {
          "type": "formula",
          "expr": "datum.v - datum.mean_v",
          "as": "voron_v"
        } 
      ]
    },
    {
      "name": "highlightedPoint",
      "source": "table",
      "transform": [
        {
          "type": "filter",
          "expr": "hovervoron && hovervoron.datum.u === datum.u && hovervoron.datum.c === datum.c"
        }
      ]
    }
  ],  
  "signals": [    
    {
      "name": "hover",
      "on": [
        {"events": "*:mouseover", "encode": "hover"},
        {"events": "*:mouseout",  "encode": "leave"},
        {"events": "*:mousedown", "encode": "select"},
        {"events": "*:mouseup",   "encode": "release"}
      ]
    },    
    {
      "name": "hovervoron",
      "value": null,
      "on": [                 
        {
          "events": "*:mouseover",
          "update": "datum"
        },           
        {
          "events": "*:mouseout",
          "update": "null"
        }
      ]
    },
    {
    "name": "title",
    "value": "x y", 
    "update": "hovervoron ? 'x: ' + format(hovervoron.datum.u, ',.2f') + ' y: ' + format(hovervoron.datum.v, ',.2f')  : 'hover for value'"
  },    
    {
      "name": "yLocationHighligthed", 
      "update": "hovervoron ? - height + hovervoron.y  : -15"
    },  
    {
      "name": "xoffset",
      "update": "-(height + padding.bottom)"
    },
    {
      "name": "yoffset",
      "update": "-(width + padding.left)"
    },
    {
      "name": "xrange",
      "update": "[0, width]"
    },
    {
      "name": "yrange",
      "update": "[height, 0]"
    },
    {
      "name": "down",
      "value": null,
      "on": [
        {
          "events": "touchend",
          "update": "null"
        },
        {
          "events": "mousedown, touchstart",
          "update": "xy()"
        }
      ]
    },
    {
      "name": "xcur",
      "value": null,
      "on": [
        {
          "events": "mousedown, touchstart, touchend",
          "update": "slice(xdom)"
        }
      ]
    },
    {
      "name": "ycur",
      "value": null,
      "on": [
        {
          "events": "mousedown, touchstart, touchend",
          "update": "slice(ydom)"
        }
      ]
    },
    {
      "name": "delta",
      "value": [
        0,
        0
      ],
      "on": [
        {
          "events": [
            {
              "source": "window",
              "type": "mousemove",
              "consume": true,
              "between": [
                {
                  "type": "mousedown"
                },
                {
                  "source": "window",
                  "type": "mouseup"
                }
              ]
            },
            {
              "type": "touchmove",
              "consume": true,
              "filter": "event.touches.length === 1"
            }
          ],
          "update": "down ? [down[0]-x(), y()-down[1]] : [0,0]"
        }
      ]
    },
    {
      "name": "anchor",
      "value": [
        0,
        0
      ],
      "on": [
        {
          "events": "wheel",
          "update": "[invert('xscale', x()), invert('yscale', y())]"
        },
        {
          "events": {
            "type": "touchstart",
            "filter": "event.touches.length===2"
          },
          "update": "[(xdom[0] + xdom[1]) / 2, (ydom[0] + ydom[1]) / 2]"
        }
      ]
    },
    {
      "name": "zoom",
      "value": 2,
      "on": [
        {
          "events": "wheel!",
          "force": true,
          "update": "pow(1.005, event.deltaY * pow(16, event.deltaMode))"
        },
        {
          "events": {
            "signal": "dist2"
          },
          "force": true,
          "update": "dist1 / dist2"
        }
      ]
    },
    {
      "name": "dist1",
      "value": 0,
      "on": [
        {
          "events": {
            "type": "touchstart",
            "filter": "event.touches.length===2"
          },
          "update": "pinchDistance(event)"
        },
        {
          "events": {
            "signal": "dist2"
          },
          "update": "dist2"
        }
      ]
    },
    {
      "name": "dist2",
      "value": 0,
      "on": [
        {
          "events": {
            "type": "touchmove",
            "consume": true,
            "filter": "event.touches.length===2"
          },
          "update": "pinchDistance(event)"
        }
      ]
    },
    {
      "name": "xdom",
      "update": "slice(xext)",
      "react": false,
      "on": [
        {
          "events": {
            "signal": "delta"
          },
          "update": "[xcur[0] + span(xcur) * delta[0] / width, xcur[1] + span(xcur) * delta[0] / width]"
        },
        {
          "events": {
            "signal": "zoom"
          },
          "update": "[anchor[0] + (xdom[0] - anchor[0]) * zoom, anchor[0] + (xdom[1] - anchor[0]) * zoom]"
        }
      ]
    },
    {
      "name": "ydom",
      "update": "slice(yext)",
      "react": false,
      "on": [
        {
          "events": {
            "signal": "delta"
          },
          "update": "[ycur[0] + span(ycur) * delta[1] / height, ycur[1] + span(ycur) * delta[1] / height]"
        },
        {
          "events": {
            "signal": "zoom"
          },
          "update": "[anchor[1] + (ydom[0] - anchor[1]) * zoom, anchor[1] + (ydom[1] - anchor[1]) * zoom]"
        }
      ]
    },
    {
      "name": "size",
      "update": "clamp(20 / span(xdom), 1, 1000)"
    },
    {
      "name": "x_scale_move",
      "value": 4,
      "on": [
        {
          "events": "mousemove",
          "update": "invert('xscale', clamp(x(), 0, width))"
        }
      ]
    }    
  ],
  "scales": [
    {
      "name": "xscale",
      "zero": false,
      "domain": {
        "signal": "xdom"
      },
      "range": {
        "signal": "xrange"
      }
    },
    {
      "name": "yscale",
      "type": "linear",
      "zero": false,
      "domain": {
        "signal": "ydom"
      },
      "range": {
        "signal": "yrange"
      }
    }
  ],
  "axes": [
    {
      "scale": "xscale",
      "orient": "bottom",
      "domain": true,
      "encode": {
        "labels": {
          "enter": {
            "font": {
              "value": "Monaco, Courier New"
            }
          }
        }
      }
    },
    {
      "scale": "yscale",
      "orient": "left",
      "domain": true,
      "encode": {
        "labels": {
          "enter": {
            "font": {
              "value": "Monaco, Courier New"
            }
          }
        }
      }
    }
  ],
  "marks": [
    {
      "type": "line",
      "from": {
        "data": "table"
      },   
      "encode": {
        "update": {
          "x": {
            "scale": "xscale",
            "field": "u"
          },
          "y": {
            "scale": "yscale",
            "field": "v"
          },
          "stroke":{"value":"#00B4AA"},
          "strokeWidth": {
            "signal": "size"
          }
        }
      },
      "clip": true
    },
    {
      "name": "points",
      "type": "symbol",
      "zindex": 1,
      "from": {"data": "table"},
      "interactive": false,
      "encode": {
        "update": {
          "x": {"scale": "xscale", "field": "u"},
          "y": {"scale": "yscale", "field": "v"},
         "size": {
            "value": 100
          },
          "shape": {
            "value": "circle"
          },
          "opacity": {
            "value": 1.0
          },
          "strokeWidth": {
            "value": 1.5
          },
          "stroke": {
            "value": "white"
          },
          "fill": {
            "value": "steelblue"
          },
          "fillOpacity": {
            "value": 0.5
          }          
        }
      },
      "clip": true
    },
    {
      "name": "voron",
      "type": "symbol",
      "role": "point",
      "from": {
        "data": "table"
      },
      "interactive": false,   
      "encode": {
        "update": {
          "fill": {"value": "gray"},
          "size": {"value": 36},
          "x": {"scale": "xscale", "field": "u"},
          "y": {"scale": "yscale", "field": "c"}
        }
      },
      "clip": true
    },    
    {
      "type": "path",
      "from": {"data": "voron"},
      "encode": {
        "update": {
          "fill": {"value": "transparent"},
          "stroke": {"value": "firebrick"},
          "strokeWidth": {"value": 0.35},
          "opacity":{"value":1}
        }
      },
      "transform": [
        {
          "type": "voronoi",
          "x": "datum.x", "y": "datum.y",
          "size": [{"signal": "width"}, {"signal": "height"}]
        }
      ]
    },
    {
      "type": "symbol",
      "from": {
        "data": "highlightedPoint"
      },
      "interactive": false,
      "encode": {
        "update": {
          "x": {
            "scale": "xscale",
            "field": "u"
          },
          "y": {
            "scale": "yscale",
            "field": "v"
          },
          "strokeWidth": {
            "value": 30
          },
          "size": {
            "value": 250
          },
          "stroke": {
            "value": "#00B4AA"
          },
          "strokeOpacity": {
            "value": 0.3
          },
          "tooltip": {
            "field": "tooltip"
          }
        }
      },
      "clip": true
    },    
    {
      "type": "rule",
      "interactive": false,
      "encode": {
        "update": {
          "x": {
            "scale": "xscale",
            "signal": "x_scale_move",
            "offset": 0.5
          },
          "y": {
            "value": 0
          },
          "y2": {
            "signal": "height"
          },
          "stroke": {
            "value": "orange"
          },
          "strokeWidth": {
            "value": 2
          },
          "opacity": {
            "value": 1
          }
        }
      }
    },
    {
      "type": "group",
      "encode": {
        "update": {
          "x": {
            "scale": "xscale",
            "signal": "x_scale_move",
            "offset": 10
          },
          "y2": {
            "field": {
              "group": "height"
            },
            "offset": 10
          }
        }
      },
      "marks": [
        {
          "type": "text",
          "encode": {
            "update": {
              "x": {
                "field": "tooltip"
              },
              "y": {
                "signal":"yLocationHighligthed"
              },
         "text": {
            "signal": "title"
          },
              "fontSize": {
                "value": 16
              },
              "align": {
                "value": "left"
              }
            }
          }
        }
      ]
    }      
  ]
}