{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "#### **Title**: HexTiles Element\n", "\n", "**Dependencies** Bokeh\n", "\n", "**Backends** [Bokeh](./HexTiles.ipynb), [Matplotlib](../matplotlib/HexTiles.ipynb)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import holoviews as hv\n", "from holoviews import opts\n", "from holoviews import dim\n", "hv.extension('bokeh')" ] }, { "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.opts(opts.HexTiles(width=500, height=400, tools=['hover'], 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`` option. 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", "overlay = hex_with_values * hv.Points(hex_with_values)\n", "\n", "overlay.opts(\n", " opts.HexTiles(width=400, height=400, aggregator=np.sum, tools=['hover']),\n", " opts.Points(size=1, color='black'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The bokeh backend also supports scaling the size of each hexagon by a value, which can be enabled using the ``scale`` option. Since we do not want zero sized bins we will scale the normalized counts by 0.5 and then add a minimum size of 0.3.\n", "\n", "Here we will generate two separate distributions and visualize them by scaling each bin by the 'Count'." ] }, { "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.opts(scale=(dim('Count').norm()*0.5)+0.3, width=500, height=500)" ] }, { "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": [ "overlay = hex_two_distributions * hv.Bivariate(hex_two_distributions)\n", "\n", "overlay.opts(\n", " opts.HexTiles(min_count=0, width=500, height=500, tools=['hover']),\n", " opts.Bivariate(show_legend=False, line_width=3))" ] } ], "metadata": { "language_info": { "name": "python", "pygments_lexer": "ipython3" } }, "nbformat": 4, "nbformat_minor": 2 }