Hexbins

Hexbins are essentially 2-dimensional histograms that leverage color to show the counts (or, “intensity”) of a given region. They can be much more informative than a scatterplot.

Parts of the first example below are taken from a Matplotlib example.

import numpy as np
import matplotlib.pyplot as plt

%matplotlib notebook

Hexbins versus Scatterplots

Set up data.

# Fixing random state for reproducibility
np.random.seed(42)

n = 100000
x = np.random.standard_normal(n)
y = 2.0 + 3.0 * x + 4.0 * np.random.standard_normal(n)
xmin = x.min()
xmax = x.max()
ymin = y.min()
ymax = y.max()

print(str(x.shape[0]) + ' points are plotted')
100000 points are plotted

Scatterplots

Note that with this amount of overlap between data points, typical scatterplots are not informative. Even setting the alpha (transparency) so the points are transparent do not show all the possible detail.

fig, axs = plt.subplots(ncols=2, 
                        sharey=True, 
                        figsize=(9, 4))
fig.subplots_adjust()

ax = axs[0]
sc = ax.scatter(x, 
                y)
ax.axis([xmin, xmax, ymin, ymax])
ax.set_title("Scatterplot without Alpha Set")

ax = axs[1]
alpha=0.01
sc = ax.scatter(x, 
                y,
                alpha=alpha)
ax.axis([xmin, xmax, ymin, ymax])
ax.set_title("Scatterplot with Alpha = {}".format(alpha))

plt.show()
<IPython.core.display.Javascript object>

Hexbins

def plot_hexbin_gridsize(gridsize=50):
    fig, axs = plt.subplots(ncols=2, 
                            sharey=True, 
                            figsize=(9, 4.5))
    fig.subplots_adjust(hspace=0.5, 
                        left=0.07, 
                        right=0.93)
    ax = axs[0]
    hb = ax.hexbin(x, y, 
                   gridsize=gridsize, 
                   cmap='inferno')
    ax.axis([xmin, xmax, ymin, ymax])
    ax.set_title("Linear Color Scale")
    cb = fig.colorbar(hb, ax=ax)
    cb.set_label('counts')

    ax = axs[1]
    hb = ax.hexbin(x, y, 
                   gridsize=gridsize, 
                   bins='log', 
                   cmap='inferno')
    ax.axis([xmin, xmax, ymin, ymax])
    ax.set_title("Log Color Scale")
    cb = fig.colorbar(hb, ax=ax)
    cb.set_label('log10(N)')
    
    plt.suptitle('Hexbin Plots with Gridsize = {}'.format(gridsize))
    plt.show()
for gridsize in [15, 25, 50, 100]:
    plot_hexbin_gridsize(gridsize)
<IPython.core.display.Javascript object>

<IPython.core.display.Javascript object>

<IPython.core.display.Javascript object>