Skip to content

Commit 858d6a0

Browse files
committed
Add 2 output figure
1 parent dcedd44 commit 858d6a0

File tree

1 file changed

+123
-18
lines changed

1 file changed

+123
-18
lines changed

panel/simdec_app.py

Lines changed: 123 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import pandas as pd
1010
from pandas.io.formats.style import Styler
1111
import panel as pn
12+
import seaborn as sns
1213

1314
import simdec as sd
1415
from simdec.visualization import sequential_cmaps, single_color_to_colormap
@@ -143,7 +144,7 @@ def explained_variance_80(sensitivity_indices_table):
143144

144145

145146
@pn.cache
146-
def decomposition(dec_limit, si, inputs, output):
147+
def decomposition_(dec_limit, si, inputs, output):
147148
return sd.decomposition(
148149
inputs=inputs,
149150
output=output,
@@ -198,7 +199,11 @@ def n_bins_auto(res):
198199

199200

200201
def display_n_bins(kind):
201-
return False if kind != "Stacked histogram" else True
202+
return False if kind not in ("Stacked histogram", "2 outputs") else True
203+
204+
205+
def display_2_output(kind):
206+
return False if kind != "2 outputs" else True
202207

203208

204209
@pn.cache
@@ -207,15 +212,48 @@ def xlim_auto(output):
207212

208213

209214
@pn.cache
210-
def figure_pn(res, palette, n_bins, xlim, kind, output_name):
211-
kind = "histogram" if kind == "Stacked histogram" else "boxplot"
215+
def figure_pn(res, res2, palette, n_bins, xlim, ylim, r_scatter, kind, output_name):
212216
plt.close("all")
213-
fig, ax = plt.subplots()
214-
_ = sd.visualization(
215-
bins=res.bins, palette=palette, n_bins=n_bins, kind=kind, ax=ax
216-
)
217-
ax.set(xlabel=output_name)
218-
ax.set_xlim(xlim)
217+
218+
if kind != "2 outputs":
219+
fig, ax = plt.subplots()
220+
221+
kind = "histogram" if kind == "Stacked histogram" else "boxplot"
222+
_ = sd.visualization(
223+
bins=res.bins, palette=palette, n_bins=n_bins, kind=kind, ax=ax
224+
)
225+
ax.set(xlabel=output_name)
226+
ax.set_xlim(xlim)
227+
else:
228+
fig, axs = plt.subplots(2, 2)
229+
230+
axs[0][1].axison = False
231+
232+
_ = sd.visualization(
233+
bins=res.bins,
234+
palette=palette,
235+
n_bins=n_bins,
236+
kind="histogram",
237+
ax=axs[0][0],
238+
)
239+
axs[0][0].set_xlim(xlim)
240+
241+
data = pd.concat([pd.melt(res.bins), pd.melt(res2.bins)["value"]], axis=1)
242+
data.columns = ["c", "x", "y"]
243+
data = data.sample(int(r_scatter * len(data)))
244+
_ = sns.scatterplot(
245+
data, x="x", y="y", hue="c", palette=palette, ax=axs[1][0], legend=False
246+
)
247+
248+
_ = sd.visualization(
249+
bins=res2.bins,
250+
palette=palette,
251+
n_bins=n_bins,
252+
kind="histogram",
253+
ax=axs[1][1],
254+
)
255+
axs[1][1].set_xlim(ylim)
256+
219257
return fig
220258

221259

@@ -329,20 +367,62 @@ def csv_data(
329367

330368

331369
interactive_decomposition = pn.bind(
332-
decomposition,
370+
decomposition_,
333371
interactive_explained_variance,
334372
interactive_filtered_si,
335373
interactive_inputs_decomposition,
336374
interactive_output,
337375
)
338376

339-
switch_histogram_boxplot = pn.widgets.RadioButtonGroup(
340-
name="Switch histogram - boxplot",
341-
options=["Stacked histogram", "Boxplot"],
377+
switch_type_visualization = pn.widgets.RadioButtonGroup(
378+
name="Type of visualization",
379+
options=["Stacked histogram", "Boxplot", "2 outputs"],
380+
)
381+
show_n_bins = pn.rx(display_n_bins)(switch_type_visualization)
382+
show_2_output = pn.rx(display_2_output)(switch_type_visualization)
383+
384+
selector_2_output = pn.widgets.Select(
385+
name="Second output",
386+
value=None,
387+
options=interactive_column_output,
388+
visible=show_2_output,
389+
)
390+
interactive_2_output = pn.bind(filtered_data, interactive_file, selector_2_output)
391+
392+
interactive_sensitivity_indices_2 = pn.bind(
393+
sensitivity_indices, interactive_inputs, interactive_2_output
394+
)
395+
interactive_explained_variance_2 = pn.bind(
396+
explained_variance, interactive_sensitivity_indices_2
397+
)
398+
399+
interactive_sensitivity_indices_table_2 = pn.bind(
400+
sensitivity_indices_table, interactive_sensitivity_indices_2, interactive_inputs
401+
)
402+
403+
interactive_filtered_si_2 = pn.bind(
404+
filtered_si, interactive_sensitivity_indices_table_2, selector_inputs_decomposition
405+
)
406+
407+
interactive_decomposition_2 = pn.bind(
408+
decomposition_,
409+
interactive_explained_variance_2,
410+
interactive_filtered_si_2,
411+
interactive_inputs_decomposition,
412+
interactive_2_output,
413+
)
414+
415+
selector_r_scatter = pn.widgets.EditableFloatSlider(
416+
name="Share of data shown",
417+
start=0.0,
418+
end=1.0,
419+
value=1.0,
420+
step=0.1,
421+
# bar_color="#FFFFFF", # does not work
422+
visible=show_2_output,
342423
)
343-
show_n_bins = pn.bind(display_n_bins, switch_histogram_boxplot)
344424

345-
interactive_n_bins_auto = pn.bind(n_bins_auto, interactive_decomposition)
425+
interactive_n_bins_auto = pn.rx(n_bins_auto)(interactive_decomposition)
346426
selector_n_bins = pn.widgets.EditableIntSlider(
347427
name="Number of bins",
348428
start=0,
@@ -364,13 +444,32 @@ def csv_data(
364444
step=0.1,
365445
)
366446

447+
interactive_ylim = pn.rx(xlim_auto)(interactive_2_output)
448+
selector_ylim = pn.widgets.EditableRangeSlider(
449+
name="Y-lim",
450+
start=interactive_ylim.rx()[0],
451+
end=interactive_ylim.rx()[1],
452+
value=interactive_ylim.rx(),
453+
format="0.0[00]",
454+
step=0.1,
455+
visible=show_2_output,
456+
)
457+
367458

368459
def callback_xlim(start, end):
369460
selector_xlim.param.update(dict(value=(start, end)))
370461

371462

372463
selector_xlim.param.watch_values(fn=callback_xlim, parameter_names=["start", "end"])
373464

465+
466+
def callback_ylim(start, end):
467+
selector_ylim.param.update(dict(value=(start, end)))
468+
469+
470+
selector_ylim.param.watch_values(fn=callback_ylim, parameter_names=["start", "end"])
471+
472+
374473
interactive_states = pn.bind(
375474
states_from_data, interactive_decomposition, interactive_inputs_decomposition
376475
)
@@ -398,10 +497,13 @@ def callback_xlim(start, end):
398497
interactive_figure = pn.bind(
399498
figure_pn,
400499
interactive_decomposition,
500+
interactive_decomposition_2,
401501
interactive_palette,
402502
selector_n_bins,
403503
selector_xlim,
404-
switch_histogram_boxplot,
504+
selector_ylim,
505+
selector_r_scatter,
506+
switch_type_visualization,
405507
selector_output,
406508
)
407509

@@ -424,9 +526,12 @@ def callback_xlim(start, end):
424526
selector_inputs_decomposition,
425527
indicator_explained_variance,
426528
pn.pane.Markdown("## Visualization", styles={"color": blue_color}),
427-
switch_histogram_boxplot,
529+
switch_type_visualization,
530+
selector_2_output,
428531
selector_n_bins,
532+
selector_r_scatter,
429533
selector_xlim,
534+
selector_ylim,
430535
dummy_color_pickers_bind,
431536
color_pickers,
432537
sizing_mode="stretch_width",

0 commit comments

Comments
 (0)