Jupyter¶
To get these examples to work in Jupyter
, you will need to install the following.
Widgets¶
Let’s see how we can use zava
to work with ipywidgets
. First, we got to get some data.
[1]:
import numpy as np
import pandas as pd
M = np.array([
[1, 1, 1, 1],
[2, 2, 2, 1],
[3, 3, 3, 3],
[1, 2, 3, 4],
[2, 2, 1, 1],
[1, 1, 3, 3]
])
Now we create an instance of GrandTour
with the data and also specifying the minimum c
and maximum d
values for scaling.
[2]:
from zava.core import GrandTour
c = 0
d = 1
grand_tour = GrandTour(M, c, d)
Finally, we use a function f
annotated with @interact
to create an interactive visualization with parallel coordinates and Grand Tour.
[3]:
import matplotlib.pyplot as plt
from ipywidgets import interact
@interact(degree=(0, 360 * 4, 0.5))
def f(degree=0):
S = grand_tour.rotate(degree)
fig, ax = plt.subplots(figsize=(15, 3))
params = {
'kind': 'line',
'ax': ax,
'color': 'r',
'marker': 'h',
'markeredgewidth': 1,
'markersize': 5,
'linewidth': 0.8
}
_ = S.plot(**params)
_ = ax.get_legend().remove()
_ = ax.set_xticks(np.arange(len(S.index)))
_ = ax.set_xticklabels(S.index)
_ = ax.get_yaxis().set_ticks([])
_ = ax.set_title('Grand Tour')
Animations¶
Now let’s see how we can create HTML5 animations in a notebook using matplotlib.animation
. Again, start with some data.
[4]:
import numpy as np
import pandas as pd
M = np.array([
[1, 1, 1, 1],
[2, 2, 2, 1],
[3, 3, 3, 3],
[1, 2, 3, 4],
[2, 2, 1, 1],
[1, 1, 3, 3]
])
Create a GrandTour
instance with the data.
[5]:
from zava.core import GrandTour
c = 0
d = 1
grand_tour = GrandTour(M, c, d)
We have to wrap the GrandTour
instance with a SinglePlotter
. The SinglePlotter
plots only a single set of data with an axis
and does not concern itself with the greater plot (e.g. the title). The params
argument is a dictionary that you can override to change the line drawings.
[6]:
from zava.plot import SinglePlotter
single_plotter = SinglePlotter(grand_tour, params={'color': 'r'})
The MultiPlotter
controls all the plots and takes in a list of SinglePlotters
as well as an axis
. You can then use an instance of this object with animation.FuncAnimation()
as usual to produce an animation.
[7]:
from zava.plot import MultiPlotter
from matplotlib import animation
fig, ax = plt.subplots(figsize=(5, 3))
multi_plotter = MultiPlotter([single_plotter], ax=ax)
params = {
'fig': fig,
'func': multi_plotter,
'frames': np.linspace(0, 360, 360),
'interval': 20,
'init_func': multi_plotter.init
}
anim = animation.FuncAnimation(**params)
plt.close(fig)
Finally, render the video.
[8]:
%%time
from IPython.display import HTML
HTML(anim.to_html5_video())
CPU times: user 21.4 s, sys: 574 ms, total: 22 s
Wall time: 22.1 s
[8]:
Animation, colors¶
You might find yourself doing cluster analysis of high-dimensional data. If you recover some clusters, you can break the data apart according to the clusters and visualize them with different colors. Here’s a full working example (without the clustering) of how to visualize two datasets.
[9]:
%%time
# 1. here are your two datasets, M1 and M2
columns = ['v0', 'v1', 'v2', 'v3']
M1 = np.array([
[1, 1, 1, 1],
[2, 2, 2, 1],
[3, 3, 3, 3]
])
M2 = np.array([
[1, 2, 3, 4],
[2, 2, 1, 1],
[1, 1, 3, 3]
])
M1 = pd.DataFrame(M1, columns=columns)
M2 = pd.DataFrame(M2, columns=columns)
# 2. create your GrandTour instances
c = 0.0
d = 100.0
gt1 = GrandTour(M1, c, d)
gt2 = GrandTour(M2, c, d)
# 3. create corresponding SinglePlotters
sp1 = SinglePlotter(gt1, params={'color': 'r'})
sp2 = SinglePlotter(gt2, params={'color': 'g'})
# 4. create a MultiPlotter from the SinglePlotters
fig, ax = plt.subplots(figsize=(5, 3))
mp = MultiPlotter([sp1, sp2], ax=ax)
params = {
'fig': fig,
'func': mp,
'frames': np.linspace(0, 360, 360),
'interval': 20,
'init_func': mp.init
}
anim = animation.FuncAnimation(**params)
plt.close(fig)
# 5. display the animation
HTML(anim.to_html5_video())
CPU times: user 25 s, sys: 608 ms, total: 25.6 s
Wall time: 25.7 s
[9]: