Crossfilter#
Download this script from GitHub (right-click to download).
"""
An example demonstrating how to put together a cross-selector app based
on the Auto MPG dataset.
"""
import panel as pn
import panel.widgets as pnw
from bokeh.sampledata.autompg import autompg
import holoviews as hv
df = autompg.copy()
ORIGINS = ["North America", "Europe", "Asia"]
# data cleanup
df.origin = [ORIGINS[x - 1] for x in df.origin]
df["mfr"] = [x.split()[0] for x in df.name]
df.loc[df.mfr == "chevy", "mfr"] = "chevrolet"
df.loc[df.mfr == "chevroelt", "mfr"] = "chevrolet"
df.loc[df.mfr == "maxda", "mfr"] = "mazda"
df.loc[df.mfr == "mercedes-benz", "mfr"] = "mercedes"
df.loc[df.mfr == "toyouta", "mfr"] = "toyota"
df.loc[df.mfr == "vokswagen", "mfr"] = "volkswagen"
df.loc[df.mfr == "vw", "mfr"] = "volkswagen"
del df["name"]
columns = sorted(df.columns)
discrete = [x for x in columns if df[x].dtype == object]
continuous = [x for x in columns if x not in discrete]
quantileable = [x for x in continuous if len(df[x].unique()) > 20]
x = pnw.Select(name="X-Axis", value="mpg", options=quantileable)
y = pnw.Select(name="Y-Axis", value="hp", options=quantileable)
size = pnw.Select(name="Size", value="None", options=["None", *quantileable])
color = pnw.Select(name="Color", value="None", options=["None", *quantileable])
@pn.depends(x.param.value, y.param.value, color.param.value, size.param.value)
def create_figure(x, y, color, size):
opts = dict(cmap="rainbow", width=800, height=600, line_color="black")
if color != "None":
opts["color"] = color
if size != "None":
opts["size"] = hv.dim(size).norm() * 20
return hv.Points(df, [x, y], label=f"{x.title()} vs {y.title()}").opts(**opts)
widgets = pn.WidgetBox(x, y, color, size, width=200)
pn.Row(widgets, create_figure).servable("Cross-selector")