import numpy as np from bokeh.plotting import figure, show, output_file 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, node1 in enumerate(nodes): for j, node2 in enumerate(nodes): xname.append(node1['name']) yname.append(node2['name']) alpha.append(min(counts[i,j]/4.0, 0.9) + 0.1) if node1['group'] == node2['group']: color.append(colormap[node1['group']]) else: color.append('lightgrey') data=dict( xname=xname, yname=yname, colors=color, alphas=alpha, count=counts.flatten(), ) p = figure(title="Les Mis Occurrences", x_axis_location="above", tools="hover,save", x_range=list(reversed(names)), y_range=names, tooltips = [('names', '@yname, @xname'), ('count', '@count')]) p.plot_width = 800 p.plot_height = 800 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 p.rect('xname', 'yname', 0.9, 0.9, source=data, color='colors', alpha='alphas', line_color=None, hover_line_color='black', hover_color='colors') output_file("les_mis.html", title="les_mis.py example") show(p) # show the plot