{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### **Title**: HexTiles Element\n",
    "\n",
    "**Dependencies** Matplotlib\n",
    "\n",
    "**Backends** [Matplotlib](./HexTiles.ipynb), [Bokeh]('../bokeh/HexTiles.ipynb')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import holoviews as hv\n",
    "hv.extension('matplotlib')\n",
    "%output fig='svg' size=200"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "``HexTiles`` provide a representation of the data as a bivariate histogram useful for visualizing the structure in larger datasets. The ``HexTiles`` are computed by tesselating the x-, y-ranges of the data, storing the number of points falling in each hexagonal bin. By default ``HexTiles`` simply counts the data in each bin but it also supports weighted aggregations. Currently only linearly spaced bins are supported when using the bokeh backend.\n",
    "\n",
    "As a simple example we will generate 100,000 normally distributed points and plot them using ``HexTiles``:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(44)\n",
    "hex_tiles = hv.HexTiles(np.random.randn(100000, 2))\n",
    "hex_tiles.options(colorbar=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that the hover shows a ``Count`` by default, representing the number of points falling within each bin.\n",
    "\n",
    "It is also possible to provide additional value dimensions and define an ``aggregator`` to aggregate by value. If multiple value dimensions are defined the dimension to be colormapped may be defined using the ``color_index``. Note however that multiple value dimensions are allowed and will be displayed in the hover tooltip."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "xs, ys = np.random.randn(2, 1000)\n",
    "hex_with_values = hv.HexTiles((xs, ys, xs*(ys/2.), (xs**2)*ys), vdims=['Values', 'Hover Values'])\n",
    "\n",
    "hex_with_values.options(aggregator=np.sum) *\\\n",
    "hv.Points(hex_with_values).options(s=3, color='black')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "By default ``HexTiles`` do not plot bins that do not contain any data but using the ``min_count`` option it is possible to plot bins with zero values as well or alternatively set a higher cutoff. Using this options can result in a more visually appealing plot particularly when overlaid with other elements.\n",
    "\n",
    "Here we will plot the same distributions as above and overlay a ``Bivariate`` plot of the same data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x, y = np.hstack([np.random.randn(2, 10000), np.random.randn(2, 10000)*0.8+2])\n",
    "hex_two_distributions = hv.HexTiles((x, y))\n",
    "hex_two_distributions.options(min_count=0) *\\\n",
    "hv.Bivariate(hex_two_distributions).options(show_legend=False, linewidth=3)"
   ]
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python",
   "pygments_lexer": "ipython3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
