Title
Dependencies
Matplotlib
Backends
Matplotlib
Bokeh
In [1]:
import numpy as np
import holoviews as hv
hv.extension('matplotlib')


The basic  QuadMesh  is a 2D grid of bins specified as x-/y-values specifying a regular sampling or edges, with arbitrary sampling and an associated 2D array containing the bin values. Here is a simple  QuadMesh  with logarithmic sampling along the 'x' dimensions:

In [2]:
n = 8  # Number of bins in each direction
xs = np.logspace(1, 3, n)
ys = np.linspace(1, 10, n)
zs = np.arange((n-1)**2).reshape(n-1, n-1)
print('Shape of x-coordinates:', xs.shape)
print('Shape of y-coordinates:', ys.shape)
print('Shape of value array:', zs.shape)

Shape of x-coordinates: (8,)
Shape of y-coordinates: (8,)
Shape of value array: (7, 7)

Out[2]:

The coordinate system of a  QuadMesh  is defined by the bin edges, therefore any index falling into a binned region will return the appropriate value. As the bin edges have continuous values, you can use non-linear axes such as log axes:

In [3]:
%%opts QuadMesh [xticks=[10, 100,1000]] QuadMesh.LogScale [logx=True]

Out[3]:

Unlike  Image  objects, slices must be inclusive of the bin edges but otherwise the slicing semantics are the same. The reason for this difference is that  QuadMesh  is really a two-dimensional histogram and when slicing, you only want to see the bins that fall within the specified slice ranges.

In the next example, we specify a slice along the x- and y-axis to extract the lower corner and we set the z-dimension range to maintain the full color range of the colormap:

In [4]:
qmesh = hv.QuadMesh((xs, ys, zs))
qmesh[20:400, :8].redim.range(z=qmesh.range('z'))

Out[4]:

To use an interactive hover tool to inspect the sample values, you can use  QuadMesh  with the hover tool in the Bokeh backend .

For full documentation and the available style and plot options, use  hv.help(hv.QuadMesh). 

## Irregular meshes ¶

In addition to axis aligned meshes like those we worked with above, a  QuadMesh  may also be used to represent irregular or unstructured meshes. In this example we will create an irregular mesh consisting of 2D X, Y and Z arrays defining the position and value of each simplex in the mesh:

In [5]:
n=20
coords = np.linspace(-1.5,1.5,n)
X,Y = np.meshgrid(coords, coords);
Qx = np.cos(Y) - np.cos(X)
Qy = np.sin(Y) + np.sin(X)
Z = np.sqrt(X**2 + Y**2)

print('Shape of x-coordinates:', Qx.shape)
print('Shape of y-coordinates:', Qy.shape)
print('Shape of value array:', Z.shape)

qmesh

Shape of x-coordinates: (20, 20)
Shape of y-coordinates: (20, 20)
Shape of value array: (20, 20)

Out[5]:

To illustrate irregular meshes a bit further we will randomly jitter the mesh coordinates along both dimensions, demonstrating that  QuadMesh  may be used to represent completely arbitrary meshes. It may also be used to represent overlapping meshes, however the behavior during slicing and other operations may not be well defined in such cases.

In [6]:
np.random.seed(13)
xs, ys = np.meshgrid(np.linspace(-20, 20, 10), np.linspace(0, 30, 8))
xs += xs/10 + np.random.rand(*xs.shape)*4
ys += ys/10 + np.random.rand(*ys.shape)*4

zs = np.arange(80).reshape(8, 10)