def display_network_analyis_gui(wti_index, plot_data): box = widgets.Layout() def lw(w='170px'): return widgets.Layout(width=w) party_preset_widget = widgets_config.dropdown('Presets', config.PARTY_PRESET_OPTIONS, None, layout=lw()) # period_group=widgets_config.period_group_widget(layout=lw()), period_group_index_widget = widgets_config.period_group_widget( index_as_value=True, layout=lw()) topic_group_widget = widgets_config.topic_groups_widget2(layout=lw()) party_name_widget = widgets_config.party_name_widget(layout=lw()) treaty_filter_widget = widgets_config.dropdown( 'Filter', config.TREATY_FILTER_OPTIONS, 'is_cultural', layout=lw()) recode_is_cultural_widget = widgets_config.toggle('Recode 7CORR', True, layout=lw(w='100px')) parties_widget = widgets_config.parties_widget( options=wti_index.get_countries_list(), value=['FRANCE'], layout=lw()) palette_widget = widgets_config.dropdown('Color', PALETTE_OPTIONS, None, layout=lw()) node_size_widget = widgets_config.dropdown('Node size', NODE_SIZE_OPTIONS, None, layout=lw()) node_size_range_widget = widgets_config.rangeslider('Range', 5, 100, [20, 49], step=1, layout=box) C_widget = widgets_config.slider('C', 0, 100, 1, step=1, layout=box, continuous_update=False) K_widget = widgets_config.sliderf('K', 0.01, 1.0, 0.01, 0.10, layout=box, continuous_update=False) p_widget = widgets_config.sliderf('p', 0.01, 2.0, 0.01, 1.10, layout=box, continuous_update=False) fig_width_widget = widgets_config.slider('Width', 600, 1600, 900, step=100, layout=box, continuous_update=False) fig_height_widget = widgets_config.slider('Height', 600, 1600, 700, step=100, layout=box, continuous_update=False) output_widget = widgets_config.dropdown('Output', OUTPUT_OPTIONS, 'network', layout=lw()) layout_algorithm_widget = widgets_config.dropdown('Layout', NETWORK_LAYOUT_OPTIONS, 'nx_spring_layout', layout=lw()) progress_widget = widgets_config.progress(0, 4, 1, 0, layout=lw("300px")) node_partition_widget = widgets_config.dropdown('Partition', COMMUNITY_OPTIONS, None, layout=lw()) simple_mode_widget = widgets_config.toggle('Simple', False, tooltip='Simple view', layout=lw(w='100px')) slice_range_type_widget = widgets_config.dropdown('Unit', SLICE_TYPE_OPTIONS, SLICE_TYPE_DEFAULT, layout=lw()) time_travel_range_widget = widgets_config.rangeslider( 'Time travel', 0, 100, [0, 100], layout=lw('60%'), continuous_update=False) time_travel_label_widget = widgets.Label(value="") label_map = { 'graphtool_sfdp': { 'K': 'K', 'C': 'C', 'p': 'gamma' }, 'graphtool_arf': { 'K': 'd', 'C': 'a', 'p': '_' }, 'graphtool_fr': { 'K': 'a/(2*N)', 'C': 'r/2', 'p': '_' }, 'nx_spring_layout': { 'K': 'k', 'C': '_', 'p': '_' }, 'nx_spectral_layout': { 'K': '_', 'C': '_', 'p': '_' }, 'nx_circular_layout': { 'K': '_', 'C': '_', 'p': '_' }, 'nx_shell_layout': { 'K': '_', 'C': '_', 'p': '_' }, 'nx_kamada_kawai_layout': { 'K': '_', 'C': '_', 'p': '_' }, 'other': { 'K': 'K', 'C': '_', 'p': '_' }, } def on_layout_type_change(change): layout = change['new'] opts = label_map.get(layout, label_map.get('other')) gv = [ 'graphviz_neato', 'graphviz_dot', 'graphviz_circo', 'graphviz_fdp', 'graphviz_sfdp' ] C_widget.disabled = layout not in [ 'graphtool_sfdp', 'graphtool_arf', 'graphtool_fr' ] C_widget.description = ' ' if C_widget.disabled else opts.get('C') K_widget.disabled = layout not in [ 'graphtool_sfdp', 'graphtool_arf', 'graphtool_fr', 'nx_spring_layout' ] + gv K_widget.description = ' ' if K_widget.disabled else opts.get('K') p_widget.disabled = layout not in [ 'graphtool_sfdp', ] p_widget.description = ' ' if p_widget.disabled else opts.get('p') def on_simple_mode_value_change(change): display_mode = 'none' if change['new'] is True else '' node_partition_widget.layout.display = display_mode node_size_widget.layout.display = display_mode node_size_range_widget.layout.display = display_mode layout_algorithm_widget.layout.display = display_mode C_widget.layout.display = display_mode K_widget.layout.display = display_mode p_widget.layout.display = display_mode fig_width_widget.layout.display = display_mode fig_height_widget.layout.display = display_mode palette_widget.layout.display = display_mode if change['new'] is True: on_layout_type_change(dict(new=layout_algorithm_widget.value)) def progress_callback(step=0): progress_widget.value = step def update_slice_range(slice_range_type): """ Called whenever display of new plot_data is done. """ slice_range_type = slice_range_type or plot_data.slice_range_type sign_dates = plot_data.edges['signed'] if slice_range_type == 1: range_min, range_max = 0, len(sign_dates) else: range_min, range_max = min(sign_dates).year, max(sign_dates).year plot_data.update(slice_range_type=slice_range_type, slice_range=(range_min, range_max)) time_travel_range_widget.min = 0 time_travel_range_widget.max = 10000 time_travel_range_widget.min = range_min time_travel_range_widget.max = range_max time_travel_range_widget.value = (range_min, range_max) def slice_changed_callback(min_year, max_year): time_travel_range_widget.description = '{}-{}'.format( min_year, max_year) def on_slice_range_type_change(change): update_slice_range(change['new']) def on_party_preset_change(change): # pylint: disable=W0613 if party_preset_widget.value is None: return parties_widget.value = parties_widget.options if 'ALL' in party_preset_widget.value \ else party_preset_widget.value slice_range_type_widget.observe(on_slice_range_type_change, names='value') simple_mode_widget.observe(on_simple_mode_value_change, names='value') layout_algorithm_widget.observe(on_layout_type_change, names='value') party_preset_widget.observe(on_party_preset_change, names='value') simple_mode_widget.value = True wn = widgets.interactive(display_party_network, parties=parties_widget, period_group_index=period_group_index_widget, treaty_filter=treaty_filter_widget, plot_data=widgets.fixed(plot_data), topic_group=topic_group_widget, recode_is_cultural=recode_is_cultural_widget, layout_algorithm=layout_algorithm_widget, C=C_widget, K=K_widget, p1=p_widget, output=output_widget, party_name=party_name_widget, node_size_range=node_size_range_widget, palette_name=palette_widget, width=fig_width_widget, height=fig_height_widget, node_size=node_size_widget, node_partition=node_partition_widget, year_limit=widgets.fixed(None), wti_index=widgets.fixed(wti_index), progress=widgets.fixed(progress_callback), done_callback=widgets.fixed(update_slice_range)) boxes = widgets.HBox([ widgets.VBox([ period_group_index_widget, topic_group_widget, party_name_widget, treaty_filter_widget, party_preset_widget ]), widgets.VBox([parties_widget]), widgets.VBox([ widgets.HBox([ recode_is_cultural_widget, simple_mode_widget, progress_widget ]), widgets.HBox([ widgets.VBox([ output_widget, layout_algorithm_widget, palette_widget, node_size_widget, node_partition_widget ]), widgets.VBox([ K_widget, C_widget, p_widget, fig_width_widget, fig_height_widget, node_size_range_widget ]) ]) ]) ]) display(widgets.VBox([boxes, wn.children[-1]])) wn.update() iw_time_travel = widgets.interactive( display_partial_party_network, plot_data=widgets.fixed(plot_data), slice_range_type=slice_range_type_widget, slice_range=time_travel_range_widget, slice_changed_callback=widgets.fixed(slice_changed_callback)) time_travel_box = widgets.VBox([ widgets.HBox([ time_travel_label_widget, time_travel_range_widget, slice_range_type_widget ]), iw_time_travel.children[-1] ]) display(time_travel_box) slice_range_type_widget.value = 2
def display_gui(wti_index, print_args=False): def lw(width='180px', left='0'): return widgets.Layout(width=width) def parties_options(): return ['ALL'] + sorted([ x for x in wti_index.get_countries_list() if x not in ['ALL', 'ALL OTHER']]) period_group_index_widget = widgets_config.period_group_widget(index_as_value=True) topic_group_name_widget = widgets_config.topic_groups_widget(layout=lw()) parties_widget = widgets_config.parties_widget(options=parties_options(), value=['ALL'], rows=10) recode_7corr_widget = widgets_config.toggle('Recode 7CULT', True, tooltip='Recode all treaties with cultural=yes as 7CORR', layout=lw(width='110px')) use_lemma_widget = widgets_config.toggle('Use LEMMA', False, tooltip='Use WordNet lemma', layout=lw(width='110px')) remove_stopwords_widget = widgets_config.toggle('Remove STOP', True, tooltip='Do not include stopwords', layout=lw(width='110px')) compute_co_occurance_widget = widgets_config.toggle('Cooccurrence', True, tooltip='Compute Cooccurrence', layout=lw(width='110px')) extra_groupbys_widget = widgets_config.dropdown('Groupbys', EXTRA_GROUPBY_OPTIONS, None, layout=lw()) min_word_size_widget = widgets_config.itext(0, 5, 2, description='Min word', layout=lw()) # plot_style_widget = widgets_config.plot_style_widget(layout=lw()) n_top_widget = widgets_config.slider('Top/grp #', 2, 100, 25, step=10, layout=lw(width='200px')) n_min_count_widget = widgets_config.slider('Min count', 1, 10, 5, step=1, tooltip='Filter out words with count less than specified value', layout=lw(width='200px')) treaty_filter_widget = widgets_config.dropdown('Filter', config.TREATY_FILTER_OPTIONS, 'is_cultural', layout=lw()) output_format_widget = widgets_config.dropdown('Output', OUTPUT_OPTIONS, 'plot_stacked_bar', layout=lw()) progress_widget = widgets_config.progress(0, 8, 1, 0, layout=lw(width='95%')) def progress(x=None): progress_widget.value = progress_widget.value + 1 if x is None else x iw = widgets.interactive( display_headnote_toplist, period_group_index=period_group_index_widget, topic_group_name=topic_group_name_widget, recode_7corr=recode_7corr_widget, treaty_filter=treaty_filter_widget, parties=parties_widget, extra_groupbys=extra_groupbys_widget, n_min_count=n_min_count_widget, n_top=n_top_widget, min_word_size=min_word_size_widget, use_lemma=use_lemma_widget, compute_co_occurance=compute_co_occurance_widget, remove_stopwords=remove_stopwords_widget, output_format=output_format_widget, progress=widgets.fixed(progress), wti_index=widgets.fixed(wti_index), print_args=widgets.fixed(print_args) # plot_style=plot_style ) boxes = widgets.HBox( [ widgets.VBox([ period_group_index_widget, parties_widget ]), widgets.VBox([ topic_group_name_widget, extra_groupbys_widget, n_top_widget, min_word_size_widget, n_min_count_widget]), widgets.VBox([ recode_7corr_widget, use_lemma_widget, remove_stopwords_widget, compute_co_occurance_widget ]), widgets.VBox([ treaty_filter_widget, output_format_widget, progress_widget]), ] ) display(widgets.VBox([boxes, iw.children[-1]])) iw.update()
def display_gui(wti_index, print_args=False): def lw(width='100px', left='0'): return widgets.Layout(width=width, left=left) def period_group_window(period_group_index): '''Returns (min_year, max_year) for the period group. Periods are either a list of years, or a list of tuples (from-year, to-year) ''' period_group = config.DEFAULT_PERIOD_GROUPS[period_group_index] periods = period_group['periods'] if period_group['type'] == 'divisions': periods = list(itertools.chain(*periods)) return min(periods), max(periods) treaty_source_options = wti_index.unique_sources party_preset_options = wti_index.get_party_preset_options() period_group_index_widget = widgets_config.period_group_widget( index_as_value=True) min_year, max_year = period_group_window(period_group_index_widget.value) gui = types.SimpleNamespace( year_limit=widgets_config.rangeslider('Window', min_year, max_year, [min_year, max_year], layout=lw('900px'), continuous_update=False), sources=widgets_config.select_multiple(description='Sources', options=treaty_source_options, values=treaty_source_options, disabled=False, layout=lw('200px')), period_group_index=period_group_index_widget, party_name=widgets_config.party_name_widget(), normalize_values=widgets_config.toggle('Display %', False, icon='', layout=lw('100px')), chart_type_name=widgets_config.dropdown('Output', config.CHART_TYPE_NAME_OPTIONS, "plot_stacked_bar", layout=lw('200px')), plot_style=widgets_config.plot_style_widget(), top_n_parties=widgets_config.slider('Top #', 0, 10, 0, continuous_update=False, layout=lw(width='200px')), party_preset=widgets_config.dropdown('Presets', party_preset_options, None, layout=lw(width='200px')), parties=widgets_config.parties_widget( options=wti_index.get_countries_list( excludes=['ALL', 'ALL OTHER']), value=['FRANCE'], rows=8, ), treaty_filter=widgets_config.dropdown('Filter', config.TREATY_FILTER_OPTIONS, 'is_cultural', layout=lw(width='200px')), extra_category=widgets_config.dropdown('Include', OTHER_CATEGORY_OPTIONS, '', layout=lw(width='200px')), #overlay_option = widgets_config.toggle('Overlay', True, icon='', layout=lw()), progress=widgets_config.progress(0, 5, 1, 0, layout=lw('95%')), info=widgets.Label(value="", layout=lw('95%'))) def stepper(step=None): gui.progress.value = gui.progress.value + 1 if step is None else step itw = widgets.interactive( display_quantity_by_party, period_group_index=period_group_index_widget, year_limit=gui.year_limit, party_name=gui.party_name, parties=gui.parties, treaty_filter=gui.treaty_filter, extra_category=gui.extra_category, normalize_values=gui.normalize_values, chart_type_name=gui.chart_type_name, plot_style=gui.plot_style, top_n_parties=gui.top_n_parties, overlay=widgets.fixed(False), # overlay_option, progress=widgets.fixed(stepper), wti_index=widgets.fixed(wti_index), print_args=widgets.fixed(print_args), treaty_sources=gui.sources) def on_party_preset_change(change): # pylint: disable=W0613 if gui.party_preset.value is None: return try: gui.parties.unobserve(on_parties_change, names='value') gui.top_n_parties.unobserve(on_top_n_parties_change, names='value') if 'ALL' in gui.party_preset.value: gui.parties.value = gui.parties.options else: gui.parties.value = gui.party_preset.value if gui.top_n_parties.value > 0: gui.top_n_parties.value = 0 except Exception as ex: logger.info(ex) finally: gui.parties.observe(on_parties_change, names='value') gui.top_n_parties.observe(on_top_n_parties_change, names='value') def on_parties_change(change): # pylint: disable=W0613 try: if gui.top_n_parties.value != 0: gui.top_n_parties.unobserve(on_top_n_parties_change, names='value') gui.top_n_parties.value = 0 gui.top_n_parties.observe(on_top_n_parties_change, names='value') except Exception as ex: # pylint: disable=W0703 logger.info(ex) def on_top_n_parties_change(change): # pylint: disable=W0613 try: if gui.top_n_parties.value > 0: gui.parties.unobserve(on_parties_change, names='value') gui.parties.disabled = True gui.party_preset.disabled = True if len(gui.parties.value) > 0: gui.parties.value = [] else: gui.parties.observe(on_parties_change, names='value') gui.parties.disabled = False gui.party_preset.disabled = False except Exception as ex: # pylint: disable=W0703 logger.info(ex) def set_years_window(period_group_index): try: min_year, max_year = period_group_window(period_group_index) gui.year_limit.min, gui.year_limit.max = min_year, max_year gui.year_limit.value = (min_year, max_year) period_group = config.DEFAULT_PERIOD_GROUPS[period_group_index] gui.year_limit.disabled = (period_group['type'] != 'range') except Exception as ex: # pylint: disable=W0703 logger.info(ex) def on_period_change(change): period_group_index = change['new'] set_years_window(period_group_index) gui.parties.observe(on_parties_change, names='value') gui.period_group_index.observe(on_period_change, names='value') gui.party_preset.observe(on_party_preset_change, names='value') gui.top_n_parties.observe(on_top_n_parties_change, names='value') set_years_window(gui.period_group_index.value) boxes = widgets.HBox([ widgets.VBox([ gui.period_group_index, gui.party_name, gui.top_n_parties, gui.party_preset ]), widgets.VBox([gui.parties]), widgets.VBox([ widgets.HBox([ widgets.VBox( [gui.treaty_filter, gui.extra_category, gui.sources]), widgets.VBox([gui.chart_type_name, gui.plot_style]), widgets.VBox([gui.normalize_values]) ]), gui.progress, gui.info ]) ]) display(widgets.VBox([boxes, gui.year_limit, itw.children[-1]])) itw.update()