Spaces:
Sleeping
Sleeping
Commit
·
b20b499
1
Parent(s):
0449aa7
upgrade to use solara 1.29
Browse filesWe can now use the pylab interface, so we now use almost the original
notebook.
Polished the UI a bit and added support for dark mode.
- pages/00-readme.py +3 -1
- pages/01-original-with-widgets.ipynb +2 -4
- pages/02-fancy-with-solara.py +25 -20
- requirements.txt +1 -1
pages/00-readme.py
CHANGED
|
@@ -17,4 +17,6 @@ def Page():
|
|
| 17 |
|
| 18 |
@solara.component
|
| 19 |
def Layout(children):
|
| 20 |
-
solara.
|
|
|
|
|
|
|
|
|
| 17 |
|
| 18 |
@solara.component
|
| 19 |
def Layout(children):
|
| 20 |
+
dark_effective = solara.lab.use_dark_effective()
|
| 21 |
+
# I like a dark toolbar always, just a different color in dark mode
|
| 22 |
+
return solara.AppLayout(children=children, toolbar_dark=True, color=None if dark_effective else "primary")
|
pages/01-original-with-widgets.ipynb
CHANGED
|
@@ -82,11 +82,9 @@
|
|
| 82 |
" alpha=0.5,\n",
|
| 83 |
" );\n",
|
| 84 |
" disp.ax_.scatter(X[:, 0], X[:, 1], c=y, edgecolor=\"k\");\n",
|
| 85 |
-
"
|
| 86 |
" disp.ax_.set_title(f\"{classifier.__class__.__name__}\");\n",
|
| 87 |
-
"
|
| 88 |
-
" import solara\n",
|
| 89 |
-
" solara.display(solara.FigureMatplotlib(fig))\n",
|
| 90 |
"widget.observe(on_change, names=[\"data\"])\n",
|
| 91 |
"on_change(None)\n",
|
| 92 |
"page = ipywidgets.HBox([widget, output])\n",
|
|
|
|
| 82 |
" alpha=0.5,\n",
|
| 83 |
" );\n",
|
| 84 |
" disp.ax_.scatter(X[:, 0], X[:, 1], c=y, edgecolor=\"k\");\n",
|
| 85 |
+
" plt.title(f\"{classifier.__class__.__name__}\");\n",
|
| 86 |
" disp.ax_.set_title(f\"{classifier.__class__.__name__}\");\n",
|
| 87 |
+
" plt.show();\n",
|
|
|
|
|
|
|
| 88 |
"widget.observe(on_change, names=[\"data\"])\n",
|
| 89 |
"on_change(None)\n",
|
| 90 |
"page = ipywidgets.HBox([widget, output])\n",
|
pages/02-fancy-with-solara.py
CHANGED
|
@@ -19,7 +19,9 @@ import pandas as pd
|
|
| 19 |
from drawdata import ScatterWidget
|
| 20 |
|
| 21 |
drawdata: solara.Reactive[List[Dict]] = solara.reactive([])
|
| 22 |
-
|
|
|
|
|
|
|
| 23 |
|
| 24 |
@solara.component
|
| 25 |
def ClassifierDraw(classifier, X, y, response_method="predict_proba", figsize=(8, 8)):
|
|
@@ -83,12 +85,13 @@ def Page():
|
|
| 83 |
# TODO: doesn't work, ScatterWidget does not update when data is updated (read only?)
|
| 84 |
# solara.Button(icon_name="mdi-delete", on_click=lambda: drawdata.set([]), icon=True)
|
| 85 |
# demo how solara can dynamically change the layout
|
|
|
|
| 86 |
solara.Button(icon_name="mdi-align-vertical-top" if vertical.value else "mdi-align-horizontal-left", on_click=lambda: vertical.set(not vertical.value), icon=True)
|
| 87 |
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
with solara.Column() if vertical.value else solara.Row():
|
| 93 |
# with solara, we don't just create the widget, but an element that describes it
|
| 94 |
# and instead of observe, we have on_<trait> callbacks
|
|
@@ -97,23 +100,25 @@ def Page():
|
|
| 97 |
ScatterWidget.element(data=drawdata.value, on_data=drawdata.set)
|
| 98 |
# downside of using elements and components: we cannot call method on the widget
|
| 99 |
# so we need to re-create the dataframe ourselves
|
| 100 |
-
with solara.lab.Tabs():
|
| 101 |
with solara.lab.Tab("classifier"):
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
with solara.
|
| 105 |
-
with solara.lab.
|
| 106 |
-
|
| 107 |
-
|
| 108 |
-
LogisticRegressionDraw
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
solara.
|
|
|
|
| 112 |
with solara.lab.Tab("table view"):
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
solara.
|
| 116 |
-
|
|
|
|
| 117 |
|
| 118 |
|
| 119 |
# in the notebook:
|
|
|
|
| 19 |
from drawdata import ScatterWidget
|
| 20 |
|
| 21 |
drawdata: solara.Reactive[List[Dict]] = solara.reactive([])
|
| 22 |
+
# we keep the active tab in a reactive var so the state does not get lost when we change
|
| 23 |
+
# the orientation of the page (vertical or horizontal)
|
| 24 |
+
tab = solara.reactive(0)
|
| 25 |
|
| 26 |
@solara.component
|
| 27 |
def ClassifierDraw(classifier, X, y, response_method="predict_proba", figsize=(8, 8)):
|
|
|
|
| 85 |
# TODO: doesn't work, ScatterWidget does not update when data is updated (read only?)
|
| 86 |
# solara.Button(icon_name="mdi-delete", on_click=lambda: drawdata.set([]), icon=True)
|
| 87 |
# demo how solara can dynamically change the layout
|
| 88 |
+
solara.lab.ThemeToggle(enable_auto=False)
|
| 89 |
solara.Button(icon_name="mdi-align-vertical-top" if vertical.value else "mdi-align-horizontal-left", on_click=lambda: vertical.set(not vertical.value), icon=True)
|
| 90 |
|
| 91 |
+
dark_background = solara.lab.use_dark_effective()
|
| 92 |
+
plt.style.use('dark_background' if dark_background else 'default')
|
| 93 |
+
|
| 94 |
+
|
| 95 |
with solara.Column() if vertical.value else solara.Row():
|
| 96 |
# with solara, we don't just create the widget, but an element that describes it
|
| 97 |
# and instead of observe, we have on_<trait> callbacks
|
|
|
|
| 100 |
ScatterWidget.element(data=drawdata.value, on_data=drawdata.set)
|
| 101 |
# downside of using elements and components: we cannot call method on the widget
|
| 102 |
# so we need to re-create the dataframe ourselves
|
| 103 |
+
with solara.lab.Tabs(value=tab):
|
| 104 |
with solara.lab.Tab("classifier"):
|
| 105 |
+
with solara.Column(classes=["py-4"]): # some nice y padding
|
| 106 |
+
if df is not None and (df["color"].nunique() > 1):
|
| 107 |
+
with solara.Column(style={"max-height": "500px", "padding-top": "0px"}):
|
| 108 |
+
with solara.lab.Tabs():
|
| 109 |
+
with solara.lab.Tab("DecisionTreeClassifier"):
|
| 110 |
+
DecisionTreeClassifierDraw(df)
|
| 111 |
+
with solara.lab.Tab("LogisticRegressionDraw"):
|
| 112 |
+
LogisticRegressionDraw(df)
|
| 113 |
+
else:
|
| 114 |
+
with solara.Column(style={"justify-content": "center"}) if not vertical.value else solara.Row():
|
| 115 |
+
solara.Info("Choose at least two colors to draw a decision boundary.")
|
| 116 |
with solara.lab.Tab("table view"):
|
| 117 |
+
with solara.Column(classes=["py-4"]): # some nice y padding
|
| 118 |
+
if df is not None:
|
| 119 |
+
with solara.FileDownload(data=lambda: df.to_csv(), filename="drawdata.csv"):
|
| 120 |
+
solara.Button("download as csv", icon_name="mdi-download", outlined=True, color="primary")
|
| 121 |
+
solara.DataFrame(df)
|
| 122 |
|
| 123 |
|
| 124 |
# in the notebook:
|
requirements.txt
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
solara==1.
|
| 2 |
drawdata==0.3.0
|
| 3 |
matplotlib
|
| 4 |
scikit-learn
|
|
|
|
| 1 |
+
solara==1.29
|
| 2 |
drawdata==0.3.0
|
| 3 |
matplotlib
|
| 4 |
scikit-learn
|