{ "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", "from holoviews import opts\n", "\n", "hv.extension('matplotlib')\n", "hv.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.opts(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 ``size``. 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", "points = hv.Points(hex_with_values)\n", "\n", "(hex_with_values * points).opts(\n", " opts.HexTiles(aggregator=np.sum),\n", " opts.Points(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", "bivariate = hv.Bivariate((x, y))\n", "\n", "(hex_two_distributions * bivariate).opts(\n", " opts.Bivariate(linewidth=3, show_legend=False),\n", " opts.HexTiles(min_count=0))" ] } ], "metadata": { "language_info": { "name": "python", "pygments_lexer": "ipython3" } }, "nbformat": 4, "nbformat_minor": 2 }