def bokeh(self, glyphType="line", glyphSize=1, fillColor="red", lineColor="black", lineAlpha=1, fillAlpha=0.1, lineDash='solid'): #glyphs from bokeh.models.glyphs import Rect, Segment, Line, Patches, Arc from bokeh.models.renderers import GlyphRenderer from bokeh.models.markers import (Marker, Asterisk, Circle, CircleCross, CircleX, Cross, Diamond, DiamondCross, InvertedTriangle, Square, SquareCross, SquareX, Triangle, X) #data from bokeh.models import ColumnDataSource from math import sqrt #Parameters of the histogram l = self.low h = self.high num = self.num bin_width = (h - l) / num x = list() y = list() center = l for v in self.values: if not math.isnan(v.mean): y.append(v.mean) x.append(center + bin_width / 2) center += bin_width source = ColumnDataSource(data=dict(x=x, y=y)) glyph = None if glyphType == "square": glyph = Square(x='x', y='y', line_color=lineColor, fill_color=fillColor, line_alpha=lineAlpha, size=glyphSize, line_dash=lineDash) elif glyphType == "diamond": glyph = Diamond(x='x', y='y', line_color=lineColor, fill_color=fillColor, line_alpha=lineAlpha, size=glyphSize, line_dash=lineDash) elif glyphType == "cross": glyph = Cross(x='x', y='y', line_color=lineColor, fill_color=fillColor, line_alpha=lineAlpha, size=glyphSize, line_dash=lineDash) elif glyphType == "triangle": glyph = Triangle(x='x', y='y', line_color=lineColor, fill_color=fillColor, line_alpha=lineAlpha, size=glyphSize, line_dash=lineDash) elif glyphType == "circle": glyph = Circle(x='x', y='y', line_color=lineColor, fill_color=fillColor, line_alpha=lineAlpha, size=glyphSize, line_dash=lineDash) elif glyphType == "errors": w = [bin_width for _ in x] h = [ sqrt(v.variance / v.entries) if v.entries > 0 else 0.0 for v in self.values ] source = ColumnDataSource(dict(x=x, y=y, w=w, h=h)) glyph = Rect(x='x', y='y', width='w', height='h', fill_alpha=fillAlpha, line_color=lineColor, fill_color=fillColor) elif glyphType == "histogram": w = [bin_width for _ in x] h = y y = [yy / 2 for yy in y] source = ColumnDataSource(dict(x=x, y=y, w=w, h=h)) glyph = Rect(x='x', y='y', width='w', height='h', fill_alpha=fillAlpha, line_color=lineColor, fill_color=fillColor) else: glyph = Line(x='x', y='y', line_color=lineColor, line_alpha=lineAlpha, line_width=glyphSize, line_dash=lineDash) return GlyphRenderer(glyph=glyph, data_source=source)
from bokeh.models import ColumnDataSource, Plot, LinearAxis, Grid from bokeh.models.markers import Diamond from bokeh.io import curdoc, show N = 9 x = np.linspace(-2, 2, N) y = x**2 sizes = np.linspace(10, 20, N) source = ColumnDataSource(dict(x=x, y=y, sizes=sizes)) plot = Plot( title=None, plot_width=300, plot_height=300, h_symmetry=False, v_symmetry=False, min_border=0, toolbar_location=None) glyph = Diamond(x="x", y="y", size="sizes", line_color="#1c9099", line_width=2, fill_color=None) plot.add_glyph(source, glyph) xaxis = LinearAxis() plot.add_layout(xaxis, 'below') yaxis = LinearAxis() plot.add_layout(yaxis, 'left') plot.add_layout(Grid(dimension=0, ticker=xaxis.ticker)) plot.add_layout(Grid(dimension=1, ticker=yaxis.ticker)) curdoc().add_root(plot) show(plot)
def bokeh(self, glyphType="line", glyphSize=1, fillColor="red", lineColor="black", lineAlpha=1, fillAlpha=0.1, lineDash='solid'): #glyphs from bokeh.models.glyphs import Rect, Segment, Line, Patches, Arc from bokeh.models.renderers import GlyphRenderer from bokeh.models.markers import (Marker, Asterisk, Circle, CircleCross, CircleX, Cross, Diamond, DiamondCross, InvertedTriangle, Square, SquareCross, SquareX, Triangle, X) #data from bokeh.models import ColumnDataSource #Parameters of the histogram l = self.low h = self.high num = self.num bin_width = (h - l) / num x = list() center = l for _ in range(num): x.append(center + bin_width / 2) center += bin_width y = self.numericalValues ci = [2. * v for v in self.confidenceIntervalValues()] source = ColumnDataSource(data=dict(x=x, y=y, ci=ci)) glyph = None if glyphType == "square": glyph = Square(x='x', y='y', line_color=lineColor, fill_color=fillColor, line_alpha=lineAlpha, size=glyphSize, line_dash=lineDash) elif glyphType == "diamond": glyph = Diamond(x='x', y='y', line_color=lineColor, fill_color=fillColor, line_alpha=lineAlpha, size=glyphSize, line_dash=lineDash) elif glyphType == "cross": glyph = Cross(x='x', y='y', line_color=lineColor, fill_color=fillColor, line_alpha=lineAlpha, size=glyphSize, line_dash=lineDash) elif glyphType == "triangle": glyph = Triangle(x='x', y='y', line_color=lineColor, fill_color=fillColor, line_alpha=lineAlpha, size=glyphSize, line_dash=lineDash) elif glyphType == "circle": glyph = Circle(x='x', y='y', line_color=lineColor, fill_color=fillColor, line_alpha=lineAlpha, size=glyphSize, line_dash=lineDash) elif glyphType == "rect": glyph = Rect(x='x', y='y', width=bin_width, height=0.1, fill_alpha=fillAlpha, line_color=lineColor, fill_color=fillColor) elif glyphType == "errors": glyph = Rect(x='x', y='y', width=bin_width, height='ci', fill_alpha=fillAlpha, line_color=lineColor, fill_color=fillColor) elif glyphType == "histogram": h = y y = [yy / 2 for yy in y] source = ColumnDataSource(dict(x=x, y=y, h=h)) glyph = Rect(x='x', y='y', width=bin_width, height='h', fill_alpha=fillAlpha, line_color=lineColor, fill_color=fillColor) else: glyph = Line(x='x', y='y', line_color=lineColor, line_alpha=lineAlpha, line_width=glyphSize, line_dash=lineDash) return GlyphRenderer(glyph=glyph, data_source=source)
def prepare_graph(): try: #____________ # ---- Importing & Creating base figure from Google Maps ---- #____________ knotel_off, patch_source = prepare_data() # the map is set to Manhattan map_options = GMapOptions(lat=40.741, lng=-73.995, map_type="roadmap", zoom=13, styles=json.dumps(map_other_config)) #importing GMap into a Bokeh figure p = gmap(MH_GMAPS_KEY, map_options, title="Manhattan Heatmap — A Prototype", plot_width=1070, plot_height=800, output_backend="webgl", tools=['pan', 'wheel_zoom', 'reset', 'box_select', 'tap']) #____________ # ---- OFFICES GLYPH ---- #____________ initial_office = Diamond(x="long", y="lat", size=18, fill_color="blue", fill_alpha=0.7, line_color="black", line_alpha=0.7) selected_office = Diamond(fill_color="blue", fill_alpha=1) nonselected_office = Diamond(fill_color="blue", fill_alpha=0.15, line_alpha=0.15) # glyph gets added to the plot office_renderer = p.add_glyph(knotel_off, initial_office, selection_glyph=selected_office, nonselection_glyph=nonselected_office) # hover behavior pointing to office glyph office_hover = HoverTool(renderers=[office_renderer], tooltips=[("Revenue", "@revenue{$00,}"), ("Rentable SQF", "@rentable_sqf{00,}"), ("People density", "@ppl_density"), ("Address", "@formatted_address")]) p.add_tools(office_hover) #____________ # ---- TRACT GLYPH ---- #____________ tract_renderer = p.patches(xs='xs', ys='ys', source=patch_source, fill_alpha=0, line_color='red', line_dash='dashed', hover_color='red', hover_fill_alpha=0.5) # hack to make tracts unselectable initial_tract = Patches(fill_alpha=0, line_color='red', line_dash='dashed') tract_renderer.selection_glyph = initial_tract tract_renderer.nonselection_glyph = initial_tract # hover behavior pointing to tract glyph tract_hover = HoverTool(renderers=[tract_renderer], tooltips=[("Median Household Income", "@MHI{$00,}")], mode='mouse') # p.add_tools(tract_hover) # Other figure configurations p.yaxis.axis_label = "Latitude" p.xaxis.axis_label = "Longitude" p.toolbar.active_inspect = [tract_hover, office_hover] p.toolbar.active_tap = "auto" p.toolbar.active_scroll = "auto" #____________ # ---- Adding widgets & Interactions to figure #____________ # creates a Toggle button show_office_toggle = Toggle(label='Show Leased Bldgs.', active=True, button_type='primary') # callback function for button def remove_add_office(active): office_renderer.visible = True if active else False # event handler show_office_toggle.on_click(remove_add_office) # same exact logic for tracts. To be combined into a single handler as an improvement! show_tract_toggle = Toggle(label='Show Census Tracts', active=True, button_type='danger') def remove_add_tract(active): tract_renderer.visible = True if active else False show_tract_toggle.on_click(remove_add_tract) # plotting layout = row(p, widgetbox(show_office_toggle, show_tract_toggle)) return layout except Exception as err: print("ERROR found on prepare_graph:\n{}".format(err))
def plotbokeh(self, glyphType="line", glyphSize=1, fillColor="red", lineColor="black", lineAlpha=1, fillAlpha=0.1, lineDash='solid'): # glyphs from bokeh.models.glyphs import Rect, Line from bokeh.models.renderers import GlyphRenderer from bokeh.models.markers import (Circle, Cross, Diamond, Square, Triangle) # data from bokeh.models import ColumnDataSource # Parameters of the histogram lo = self.low hi = self.high num = self.num bin_width = (hi-lo)/num x = list() y = list() center = lo for v in self.values: if not math.isnan(v.mean): y.append(v.mean) x.append(center+bin_width/2) center += bin_width source = ColumnDataSource(data=dict(x=x, y=y)) glyph = None if glyphType == "square": glyph = Square( x='x', y='y', line_color=lineColor, fill_color=fillColor, line_alpha=lineAlpha, size=glyphSize, line_dash=lineDash) elif glyphType == "diamond": glyph = Diamond( x='x', y='y', line_color=lineColor, fill_color=fillColor, line_alpha=lineAlpha, size=glyphSize, line_dash=lineDash) elif glyphType == "cross": glyph = Cross( x='x', y='y', line_color=lineColor, fill_color=fillColor, line_alpha=lineAlpha, size=glyphSize, line_dash=lineDash) elif glyphType == "triangle": glyph = Triangle( x='x', y='y', line_color=lineColor, fill_color=fillColor, line_alpha=lineAlpha, size=glyphSize, line_dash=lineDash) elif glyphType == "circle": glyph = Circle( x='x', y='y', line_color=lineColor, fill_color=fillColor, line_alpha=lineAlpha, size=glyphSize, line_dash=lineDash) elif glyphType == "histogram": w = [bin_width for _ in x] h = y y = [yy/2 for yy in y] source = ColumnDataSource(dict(x=x, y=y, w=w, h=h)) glyph = Rect( x='x', y='y', width='w', height='h', fill_alpha=fillAlpha, line_color=lineColor, fill_color=fillColor) else: glyph = Line( x='x', y='y', line_color=lineColor, line_alpha=lineAlpha, line_width=glyphSize, line_dash=lineDash) return GlyphRenderer(glyph=glyph, data_source=source)
def plotbokeh(self, glyphType="line", glyphSize=1, fillColor="red", lineColor="black", lineAlpha=1, fillAlpha=0.1, lineDash='solid'): # glyphs from bokeh.models.glyphs import Rect, Line from bokeh.models.renderers import GlyphRenderer from bokeh.models.markers import (Circle, Cross, Diamond, Square, Triangle) # data from bokeh.models import ColumnDataSource # Parameters of the histogram lo = self.low hi = self.high num = self.numFilled bin_width = (hi-lo)/num x = list() center = lo for _ in range(num): x.append(center+bin_width/2) center += bin_width y = [v.entries for _, v in sorted(self.bins.items())] source = ColumnDataSource(data=dict(x=x, y=y)) glyph = None if glyphType == "square": glyph = Square( x='x', y='y', line_color=lineColor, fill_color=fillColor, line_alpha=lineAlpha, size=glyphSize, line_dash=lineDash) elif glyphType == "diamond": glyph = Diamond( x='x', y='y', line_color=lineColor, fill_color=fillColor, line_alpha=lineAlpha, size=glyphSize, line_dash=lineDash) elif glyphType == "cross": glyph = Cross( x='x', y='y', line_color=lineColor, fill_color=fillColor, line_alpha=lineAlpha, size=glyphSize, line_dash=lineDash) elif glyphType == "triangle": glyph = Triangle( x='x', y='y', line_color=lineColor, fill_color=fillColor, line_alpha=lineAlpha, size=glyphSize, line_dash=lineDash) elif glyphType == "circle": glyph = Circle( x='x', y='y', line_color=lineColor, fill_color=fillColor, line_alpha=lineAlpha, size=glyphSize, line_dash=lineDash) elif glyphType == "rect": glyph = Rect( x='x', y='y', width=bin_width, height=0.1, fill_alpha=fillAlpha, line_color=lineColor, fill_color=fillColor) elif glyphType == "errors": ci = [2.*v for v in self.confidenceIntervalValues()] source = ColumnDataSource(data=dict(x=x, y=y, ci=ci)) glyph = Rect( x='x', y='y', width=bin_width, height='ci', fill_alpha=fillAlpha, line_color=lineColor, fill_color=fillColor) elif glyphType == "histogram": h = y y = [yy/2 for yy in y] source = ColumnDataSource(dict(x=x, y=y, h=h)) glyph = Rect( x='x', y='y', width=bin_width, height='h', fill_alpha=fillAlpha, line_color=lineColor, fill_color=fillColor) else: glyph = Line( x='x', y='y', line_color=lineColor, line_alpha=lineAlpha, line_width=glyphSize, line_dash=lineDash) return GlyphRenderer(glyph=glyph, data_source=source)
crosses = [2]*len(x) triangles = [3]*len(x) exes = [4]*len(x) asterisks = [5]*len(x) diamonds = [6]*len(x) squares = [7]*len(x) scatter_data = ColumnDataSource(dict(x=x, circles=circles, crosses=crosses, triangles=triangles, exes=exes, asterisks=asterisks, diamonds=diamonds, squares=squares, sizes=sizes)) glyphs = [] glyphs.append(Circle(x="x", y="circles", size="sizes", fill_color="red", name="the_circles")) glyphs.append(Cross(x="x", y="crosses", size="sizes", fill_color="blue", name="the_crosses")) glyphs.append(Triangle(x="x", y="triangles", size="sizes", fill_color="green", name="the_triangles")) glyphs.append(X(x="x", y="exes", size="sizes", fill_color="purple", name="the_xs")) glyphs.append(Asterisk(x="x", y="asterisks", size="sizes", fill_color="orange", name="the_asterisks")) glyphs.append(Diamond(x="x", y="diamonds", size="sizes", fill_color="yellow", name="the_diamonds")) glyphs.append(Square(x="x", y="squares", size="sizes", fill_color="gray", name="the_squares")) legend_items = [] for glyph in glyphs: renderer = p.add_glyph(scatter_data, glyph) renderer.name = glyph.name legend_items.append((renderer.name, [renderer])) legend = Legend( items=legend_items, name="the_legend", label_text_font_size='5pt', glyph_width=20, glyph_height=10, location="center_right",