Using scales

Instead of the (default) linear scales, ipyvolume also support bqlot’s scales, for instance, the logaritmic scales.

import ipyvolume as ipv
import bqplot.scales
import numpy as np
import ipywidgets as widgets
N = 500
x, y, z = np.random.normal(0, 1, (3, N))
x = 10**x
r = np.sqrt(np.log10(x)**2 + y**2 + z**2)
scales = {
    'x': bqplot.scales.LogScale(min=10**-3, max=10**3),
    'y': bqplot.scales.LinearScale(min=-3, max=3),
    'z': bqplot.scales.LinearScale(min=-3, max=3),
color_scale = bqplot.scales.ColorScale(min=0, max=3, colors=["#f00", "#0f0", "#00f"])
fig = ipv.figure(scales=scales)
scatter = ipv.scatter(x, y, z, color=r, color_scale=color_scale)
ipv.view(150, 30, distance=2.5)

Note that the x-axis is logarithmically spaced and labeled.

We also use the bqplot color scale, and instead of setting a list of colors, we can also set a famour color scheme:

scatter.color_scale.colors = []
scatter.color_scale.scheme = 'viridis'

Linking a widget to the scale, allows us to easily change its properties

color_max_slider = widgets.FloatSlider(min=1, max=5, description='Color max')
widgets.jslink((color_scale, 'max'), (color_max_slider, 'value'))
z_max_slider = widgets.FloatSlider(min=1, max=10, description='Z max')
widgets.jslink((fig.scales['z'], 'max'), (z_max_slider, 'value'))

Using the same scales in bqplot

import bqplot.pyplot as plt
fig2d = plt.figure(layout={'width': '500px'})
scatter2d = plt.scatter(x=(x), y=y, color=scatter.color, scales={
    "x": fig.scales["x"],
    "y": fig.scales["y"],
    "color": scatter.color_scale

Try zooming/panning in both bqplot and ipyvolume! For ipyvolume, keep the option key pressed, while using scroll or drag.

# Putting the 2 figures next to eachother.
# TODO: currently not working
# widgets.VBox([fig, fig2d])