99import pandas as pd
1010from pandas .io .formats .style import Styler
1111import panel as pn
12+ import seaborn as sns
1213
1314import simdec as sd
1415from 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
200201def 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
331369interactive_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 )
346426selector_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
368459def callback_xlim (start , end ):
369460 selector_xlim .param .update (dict (value = (start , end )))
370461
371462
372463selector_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+
374473interactive_states = pn .bind (
375474 states_from_data , interactive_decomposition , interactive_inputs_decomposition
376475)
@@ -398,10 +497,13 @@ def callback_xlim(start, end):
398497interactive_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