les_mis

< glucose | back to Gallery | unemployment >

            inspect
            • Hover Tool
            from collections import OrderedDict
            
            import numpy as np
            
            from bokeh.plotting import *
            from bokeh.models import HoverTool, ColumnDataSource
            from bokeh.sampledata.les_mis import data
            
            nodes = data['nodes']
            names = [node['name'] for node in sorted(data['nodes'], key=lambda x: x['group'])]
            
            N = len(nodes)
            counts = np.zeros((N, N))
            for link in data['links']:
                counts[link['source'], link['target']] = link['value']
                counts[link['target'], link['source']] = link['value']
            
            colormap = [
                "#444444", "#a6cee3", "#1f78b4", "#b2df8a", "#33a02c", "#fb9a99",
                "#e31a1c", "#fdbf6f", "#ff7f00", "#cab2d6", "#6a3d9a"
            ]
            
            xname = []
            yname = []
            color = []
            alpha = []
            for i, n1 in enumerate(nodes):
                for j, n2 in enumerate(nodes):
                    xname.append(n1['name'])
                    yname.append(n2['name'])
            
                    a = min(counts[i,j]/4.0, 0.9) + 0.1
                    alpha.append(a)
            
                    if n1['group'] == n2['group']:
                        color.append(colormap[n1['group']])
                    else:
                        color.append('lightgrey')
            
            
            source = ColumnDataSource(
                data=dict(
                    xname=xname,
                    yname=yname,
                    colors=color,
                    alphas=alpha,
                    count=counts.flatten(),
                )
            )
            
            output_file("les_mis.html")
            
            p = figure(title="Les Mis Occurrences",
                x_axis_location="above", tools="resize,hover,save",
                x_range=list(reversed(names)), y_range=names)
            p.plot_width = 800
            p.plot_height = 800
            
            p.rect('xname', 'yname', 0.9, 0.9, source=source,
                 color='colors', alpha='alphas', line_color=None)
            
            p.grid.grid_line_color = None
            p.axis.axis_line_color = None
            p.axis.major_tick_line_color = None
            p.axis.major_label_text_font_size = "5pt"
            p.axis.major_label_standoff = 0
            p.xaxis.major_label_orientation = np.pi/3
            
            hover = p.select(dict(type=HoverTool))
            hover.tooltips = OrderedDict([
                ('names', '@yname, @xname'),
                ('count', '@count'),
            ])
            
            show(p)      # show the plot
            

            Image Preview (right click -> 'Save As' to save PNG)