#!/usr/bin/env python # coding: utf-8 # ### Creating a bullet graph using Bokeh # # This is the notebook associated with the article at [Pbpython.com](http://pbpython.com/bokeh-bullet-waterfall.html) # In[1]: from bokeh.io import show, output_notebook from bokeh.palettes import PuBu4 from bokeh.plotting import figure from bokeh.models import Label # In[2]: output_notebook() # In[3]: # Load in the data data= [("John Smith", 105, 120), ("Jane Jones", 99, 110), ("Fred Flintstone", 109, 125), ("Barney Rubble", 135, 123), ("Mr T", 45, 105)] limits = [0, 20, 60, 100, 160] labels = ["Poor", "OK", "Good", "Excellent"] cats = [x[0] for x in data] # In[4]: # Create the base figure p=figure(title="Sales Rep Performance", plot_height=350, plot_width=800, y_range=cats) p.x_range.range_padding = 0 p.grid.grid_line_color = None p.xaxis[0].ticker.num_minor_ticks = 0 # In[5]: # Here's the format of the data we need print(list(zip(limits[:-1], limits[1:], PuBu4[::-1]))) # In[6]: for left, right, color in zip(limits[:-1], limits[1:], PuBu4[::-1]): p.hbar(y=cats, left=left, right=right, height=0.8, color=color) # In[7]: show(p) # In[8]: # Now add the black bars for the actual performance perf = [x[1] for x in data] p.hbar(y=cats, left=0, right=perf, height=0.3, color="black") # In[9]: show(p) # In[10]: # Add the segment for the target comp = [x[2]for x in data] p.segment(x0=comp, y0=[(x, -0.5) for x in cats], x1=comp, y1=[(x, 0.5) for x in cats], color="white", line_width=2) # In[11]: show(p) # In[12]: # Add the labels for start, label in zip(limits[:-1], labels): p.add_layout(Label(x=start, y=0, text=label, text_font_size="10pt", text_color='black', y_offset=5, x_offset=15)) # In[13]: show(p)