ipyvolume

[1]:
import ipyvolume as ipv
import ipywidgets as widgets
import numpy as np
[2]:
x, y, z = np.random.random((3, 10000))
ipv.figure()
scatter = ipv.scatter(x, y, z, size=1, marker="sphere")
ipv.show()
[3]:
x, y, z, u, v, w = np.random.random((6, 1000)) * 2 - 1
selected = np.random.randint(0, 1000, 100)
fig = ipv.figure()
quiver = ipv.quiver(
    x, y, z, u, v, w, size=5, size_selected=8, selected=selected
)
ipv.show()
[4]:
size = widgets.FloatSlider(min=0, max=30, step=0.1)
size_selected = widgets.FloatSlider(min=0, max=30, step=0.1)
color = widgets.ColorPicker()
color_selected = widgets.ColorPicker()
widgets.jslink((quiver, "size"), (size, "value"))
widgets.jslink((quiver, "size_selected"), (size_selected, "value"))
widgets.jslink((quiver, "color"), (color, "value"))
widgets.jslink((quiver, "color_selected"), (color_selected, "value"))
widgets.VBox([size, size_selected, color, color_selected])

Animations

[5]:
# create 2d grids: x, y, and r
u = np.linspace(-10, 10, 25)
x, y = np.meshgrid(u, u)
r = np.sqrt(x**2 + y**2)
print("x,y and z are of shape", x.shape)
# and turn them into 1d
x = x.flatten()
y = y.flatten()
r = r.flatten()
print("and flattened of shape", x.shape)
x,y and z are of shape (25, 25)
and flattened of shape (625,)
[6]:
# create a sequence of 15 time elements
time = np.linspace(0, np.pi * 2, 15)
z = np.array([(np.cos(r + t) * np.exp(-r / 5)) for t in time])
print("z is of shape", z.shape)
z is of shape (15, 625)
[7]:
# draw the scatter plot, and add controls with animate_glyphs
ipv.figure()
s = ipv.scatter(x, z, y, marker="sphere")
ipv.animation_control(s, interval=200)
ipv.ylim(-3, 3)
ipv.show()
[8]:
# Now also include, color, which contains rgb values
color = np.array([[np.cos(r + t), 1-np.abs(z[i]), 0.1+z[i]*0] for i, t in enumerate(time)])
size = (z+1)
print("color is of shape", color.shape)
color is of shape (15, 3, 625)
[9]:
color = np.transpose(color, (0, 2, 1))  # flip the last axes
[10]:
ipv.figure()
s = ipv.scatter(x, z, y, color=color, size=size, marker="sphere")
ipv.animation_control(s, interval=200)
ipv.ylim(-3, 3)
ipv.show()

See also: