Panel apps
Environment requirements
Your conda environment (used in JHub Apps Launcher's App creation form) must have the following packages for successful app deployment:
jhsingle-native-proxy
>= 0.8.2panel
bokeh-root-cmd
>= 0.1.2nbconvert
- Other libraries used in the app
In some cases, you may need ipywidgets
and ipywidgets-bokeh
Code requirements
If you use Panel templates, for example the Material template, make sure to use it through pn.template.MaterialTemplate()
instead of pn.extension(design='material', template='material')
.
You can write Panel apps in Jupyter Notebooks or Python scripts. If you use Jupyter Notebooks, you need to include nbconvert
in your conda environment.
Example application
To deploy the Panel Iris Kmeans Example using JHub Apps, you can use the following (slightly updated) code and environment:
Code (Jupyter Notebook)
In a Jupyter Notebook, copy the following lines of code.
import numpy as np
import pandas as pd
import panel as pn
import hvplot.pandas
from sklearn.cluster import KMeans
from bokeh.sampledata import iris
pn.extension()
flowers = iris.flowers.copy()
cols = list(flowers.columns)[:-1]
x = pn.widgets.Select(name='x', options=cols)
y = pn.widgets.Select(name='y', options=cols, value='sepal_width')
n_clusters = pn.widgets.IntSlider(name='n_clusters', start=1, end=5, value=3)
def get_clusters(x, y, n_clusters):
kmeans = KMeans(n_clusters=n_clusters, n_init='auto')
est = kmeans.fit(iris.flowers.iloc[:, :-1].values)
flowers['labels'] = est.labels_.astype('str')
centers = flowers.groupby('labels')[[x] if x == y else [x, y]].mean()
return (
flowers.sort_values('labels').hvplot.scatter(
x, y, c='labels', size=100, height=500, responsive=True
) *
centers.hvplot.scatter(
x, y, marker='x', c='black', size=400, padding=0.1, line_width=5
)
)
widgets = pn.WidgetBox(
pn.Column(
"""This app provides an example of **building a simple dashboard using Panel**.\n\nIt demonstrates how to take the output of **k-means clustering on the Iris dataset** using scikit-learn, parameterizing the number of clusters and the variables to plot.\n\nThe entire clustering and plotting pipeline is expressed as a **single reactive function** that responsively returns an updated plot when one of the widgets changes.\n\n The **`x` marks the center** of the cluster.""",
x, y, n_clusters
)
)
clusters = pn.pane.HoloViews(
pn.bind(get_clusters, x, y, n_clusters), sizing_mode='stretch_width'
)
dashboard = pn.template.MaterialTemplate(
title="Iris K-Means Clustering",
sidebar = [widgets],
main=[clusters],
)
dashboard.servable()
Environment specification
Use the following spec to create a conda environment wherever JHub Apps is deployed. If using Nebari, use this spec to create an environment with conda-store.
name: panel-iris-kmeans-app
channels:
- conda-forge
dependencies:
- numpy
- pandas
- hvplot
- panel
- bokeh
- ipykernel
- scikit-learn
- jhsingle-native-proxy>=0.8.2
- bokeh-root-cmd
- nbconvert
- bokeh_sampledata