#!/usr/bin/env python # coding: utf-8 # # Python API to BeakerX Interactive Plotting # # You can access Beaker's native interactive plotting library from Python. # # ## Plot with simple properties # # Python plots has syntax very similar to Groovy plots. Property names are the same. # In[ ]: from beakerx import * import pandas as pd tableRows = pd.read_csv('../resources/data/interest-rates.csv') # In[ ]: Plot(title="Title", xLabel="Horizontal", yLabel="Vertical", initWidth=500, initHeight=200) # ## Plot items # # ### Lines, Bars, Points and Right yAxis # In[ ]: x = [1, 4, 6, 8, 10] y = [3, 6, 4, 5, 9] pp = Plot(title='Bars, Lines, Points and 2nd yAxis', xLabel="xLabel", yLabel="yLabel", legendLayout=LegendLayout.HORIZONTAL, legendPosition=LegendPosition(position=LegendPosition.Position.RIGHT), omitCheckboxes=True) pp.add(YAxis(label="Right yAxis")) pp.add(Bars(displayName="Bar", x=[1,3,5,7,10], y=[100, 120,90,100,80], width=1)) pp.add(Line(displayName="Line", x=x, y=y, width=6, yAxis="Right yAxis")) pp.add(Points(x=x, y=y, size=10, shape=ShapeType.DIAMOND, yAxis="Right yAxis")) # In[ ]: plot = Plot(title= "Setting line properties") ys = [0, 1, 6, 5, 2, 8] ys2 = [0, 2, 7, 6, 3, 8] plot.add(Line(y= ys, width= 10, color= Color.red)) plot.add(Line(y= ys, width= 3, color= Color.yellow)) plot.add(Line(y= ys, width= 4, color= Color(33, 87, 141), style= StrokeType.DASH, interpolation= 0)) plot.add(Line(y= ys2, width= 2, color= Color(212, 57, 59), style= StrokeType.DOT)) plot.add(Line(y= [5, 0], x= [0, 5], style= StrokeType.LONGDASH)) plot.add(Line(y= [4, 0], x= [0, 5], style= StrokeType.DASHDOT)) # In[ ]: plot = Plot(title= "Changing Point Size, Color, Shape") y1 = [6, 7, 12, 11, 8, 14] y2 = [4, 5, 10, 9, 6, 12] y3 = [2, 3, 8, 7, 4, 10] y4 = [0, 1, 6, 5, 2, 8] plot.add(Points(y= y1)) plot.add(Points(y= y2, shape= ShapeType.CIRCLE)) plot.add(Points(y= y3, size= 8.0, shape= ShapeType.DIAMOND)) plot.add(Points(y= y4, size= 12.0, color= Color.orange, outlineColor= Color.red)) # In[ ]: plot = Plot(title= "Changing point properties with list") cs = [Color.black, Color.red, Color.orange, Color.green, Color.blue, Color.pink] ss = [6.0, 9.0, 12.0, 15.0, 18.0, 21.0] fs = [False, False, False, True, False, False] plot.add(Points(y= [5] * 6, size= 12.0, color= cs)) plot.add(Points(y= [4] * 6, size= 12.0, color= Color.gray, outlineColor= cs)) plot.add(Points(y= [3] * 6, size= ss, color= Color.red)) plot.add(Points(y= [2] * 6, size= 12.0, color= Color.black, fill= fs, outlineColor= Color.black)) # In[ ]: plot = Plot() y1 = [1.5, 1, 6, 5, 2, 8] cs = [Color.black, Color.red, Color.gray, Color.green, Color.blue, Color.pink] ss = [StrokeType.SOLID, StrokeType.SOLID, StrokeType.DASH, StrokeType.DOT, StrokeType.DASHDOT, StrokeType.LONGDASH] plot.add(Stems(y= y1, color= cs, style= ss, width= 5)) # In[ ]: plot = Plot(title= "Setting the base of Stems") ys = [3, 5, 2, 3, 7] y2s = [2.5, -1.0, 3.5, 2.0, 3.0] plot.add(Stems(y= ys, width= 2, base= y2s)) plot.add(Points(y= ys)) # In[ ]: plot = Plot(title= "Bars") cs = [Color(255, 0, 0, 128)] * 5 # transparent bars cs[3] = Color.red # set color of a single bar, solid colored bar plot.add(Bars(x= [1, 2, 3, 4, 5], y= [3, 5, 2, 3, 7], color= cs, outlineColor= Color.black, width= 0.3)) # ### Lines, Points with Pandas # In[ ]: plot = Plot(title= "Pandas line") plot.add(Line(y= tableRows.y1, width= 2, color= Color(216, 154, 54))) plot.add(Line(y= tableRows.y10, width= 2, color= Color.lightGray)) plot # In[ ]: plot = Plot(title= "Pandas Series") plot.add(Line(y= pd.Series([0, 6, 1, 5, 2, 4, 3]), width=2)) # In[ ]: plot = Plot(title= "Bars") cs = [Color(255, 0, 0, 128)] * 7 # transparent bars cs[3] = Color.red # set color of a single bar, solid colored bar plot.add(Bars(pd.Series([0, 6, 1, 5, 2, 4, 3]), color= cs, outlineColor= Color.black, width= 0.3)) # ### Areas, Stems and Crosshair # In[ ]: ch = Crosshair(color=Color.black, width=2, style=StrokeType.DOT) plot = Plot(crosshair=ch) y1 = [4, 8, 16, 20, 32] base = [2, 4, 8, 10, 16] cs = [Color.black, Color.orange, Color.gray, Color.yellow, Color.pink] ss = [StrokeType.SOLID, StrokeType.SOLID, StrokeType.DASH, StrokeType.DOT, StrokeType.DASHDOT, StrokeType.LONGDASH] plot.add(Area(y=y1, base=base, color=Color(255, 0, 0, 50))) plot.add(Stems(y=y1, base=base, color=cs, style=ss, width=5)) # In[ ]: plot = Plot() y = [3, 5, 2, 3] x0 = [0, 1, 2, 3] x1 = [3, 4, 5, 8] plot.add(Area(x= x0, y= y)) plot.add(Area(x= x1, y= y, color= Color(128, 128, 128, 50), interpolation= 0)) # In[ ]: p = Plot() p.add(Line(y= [3, 6, 12, 24], displayName= "Median")) p.add(Area(y= [4, 8, 16, 32], base= [2, 4, 8, 16], color= Color(255, 0, 0, 50), displayName= "Q1 to Q3")) # In[ ]: ch = Crosshair(color= Color(255, 128, 5), width= 2, style= StrokeType.DOT) pp = Plot(crosshair= ch, omitCheckboxes= True, legendLayout= LegendLayout.HORIZONTAL, legendPosition= LegendPosition(position=LegendPosition.Position.TOP)) x = [1, 4, 6, 8, 10] y = [3, 6, 4, 5, 9] pp.add(Line(displayName= "Line", x= x, y= y, width= 3)) pp.add(Bars(displayName= "Bar", x= [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], y= [2, 2, 4, 4, 2, 2, 0, 2, 2, 4], width= 0.5)) pp.add(Points(x= x, y= y, size= 10)) # ### Constant Lines, Constant Bands # In[ ]: p = Plot () p.add(Line(y=[-1, 1])) p.add(ConstantLine(x=0.65, style=StrokeType.DOT, color=Color.blue)) p.add(ConstantLine(y=0.1, style=StrokeType.DASHDOT, color=Color.blue)) p.add(ConstantLine(x=0.3, y=0.4, color=Color.gray, width=5, showLabel=True)) # In[ ]: Plot().add(Line(y=[-3, 1, 3, 4, 5])).add(ConstantBand(x=[1, 2], y=[1, 3])) # In[ ]: p = Plot() p.add(Line(x= [-3, 1, 2, 4, 5], y= [4, 2, 6, 1, 5])) p.add(ConstantBand(x= ['-Infinity', 1], color= Color(128, 128, 128, 50))) p.add(ConstantBand(x= [1, 2])) p.add(ConstantBand(x= [4, 'Infinity'])) # In[ ]: from decimal import Decimal pos_inf = Decimal('Infinity') neg_inf = Decimal('-Infinity') print (pos_inf) print (neg_inf) # In[ ]: from beakerx.plot import Text as BeakerxText plot = Plot() xs = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ys = [8.6, 6.1, 7.4, 2.5, 0.4, 0.0, 0.5, 1.7, 8.4, 1] def label(i): if ys[i] > ys[i+1] and ys[i] > ys[i-1]: return "max" if ys[i] < ys[i+1] and ys[i] < ys[i-1]: return "min" if ys[i] > ys[i-1]: return "rising" if ys[i] < ys[i-1]: return "falling" return "" for i in xs: i = i - 1 if i > 0 and i < len(xs)-1: plot.add(BeakerxText(x= xs[i], y= ys[i], text= label(i), pointerAngle= -i/3.0)) plot.add(Line(x= xs, y= ys)) plot.add(Points(x= xs, y= ys)) # In[ ]: plot = Plot(title= "Setting 2nd Axis bounds") ys = [0, 2, 4, 6, 15, 10] ys2 = [-40, 50, 6, 4, 2, 0] ys3 = [3, 6, 3, 6, 70, 6] plot.add(YAxis(label="Spread")) plot.add(Line(y= ys)) plot.add(Line(y= ys2, yAxis="Spread")) plot.setXBound([-2, 10]) #plot.setYBound(1, 5) plot.getYAxes()[0].setBound(1,5) plot.getYAxes()[1].setBound(3,6) plot # In[ ]: plot = Plot(title= "Setting 2nd Axis bounds") ys = [0, 2, 4, 6, 15, 10] ys2 = [-40, 50, 6, 4, 2, 0] ys3 = [3, 6, 3, 6, 70, 6] plot.add(YAxis(label="Spread")) plot.add(Line(y= ys)) plot.add(Line(y= ys2, yAxis="Spread")) plot.setXBound([-2, 10]) plot.setYBound(1, 5) plot # ## TimePlot # In[ ]: import time millis = current_milli_time() hour = round(1000 * 60 * 60) xs = [] ys = [] for i in range(11): xs.append(millis + hour * i) ys.append(i) plot = TimePlot(timeZone="America/New_York") # list of milliseconds plot.add(Points(x=xs, y=ys, size=10, displayName="milliseconds")) # In[ ]: plot = TimePlot() plot.add(Line(x=tableRows['time'], y=tableRows['m3'])) # #### numpy datatime64 # In[ ]: y = pd.Series([7.5, 7.9, 7, 8.7, 8, 8.5]) dates = [np.datetime64('2015-02-01'), np.datetime64('2015-02-02'), np.datetime64('2015-02-03'), np.datetime64('2015-02-04'), np.datetime64('2015-02-05'), np.datetime64('2015-02-06')] plot = TimePlot() plot.add(Line(x=dates, y=y)) # #### Timestamp # In[ ]: y = pd.Series([7.5, 7.9, 7, 8.7, 8, 8.5]) dates = pd.Series(['2015-02-01', '2015-02-02', '2015-02-03', '2015-02-04', '2015-02-05', '2015-02-06'] , dtype='datetime64[ns]') plot = TimePlot() plot.add(Line(x=dates, y=y)) # #### Datetime and date # In[ ]: import datetime y = pd.Series([7.5, 7.9, 7, 8.7, 8, 8.5]) dates = [datetime.date(2015, 2, 1), datetime.date(2015, 2, 2), datetime.date(2015, 2, 3), datetime.date(2015, 2, 4), datetime.date(2015, 2, 5), datetime.date(2015, 2, 6)] plot = TimePlot() plot.add(Line(x=dates, y=y)) # In[ ]: import datetime y = pd.Series([7.5, 7.9, 7, 8.7, 8, 8.5]) dates = [datetime.datetime(2015, 2, 1), datetime.datetime(2015, 2, 2), datetime.datetime(2015, 2, 3), datetime.datetime(2015, 2, 4), datetime.datetime(2015, 2, 5), datetime.datetime(2015, 2, 6)] plot = TimePlot() plot.add(Line(x=dates, y=y)) # ## NanoPlot # In[ ]: millis = current_milli_time() nanos = millis * 1000 * 1000 xs = [] ys = [] for i in range(11): xs.append(nanos + 7 * i) ys.append(i) nanoplot = NanoPlot() nanoplot.add(Points(x=xs, y=ys)) # ## Stacking # In[ ]: y1 = [1,5,3,2,3] y2 = [7,2,4,1,3] p = Plot(title='Plot with XYStacker', initHeight=200) a1 = Area(y=y1, displayName='y1') a2 = Area(y=y2, displayName='y2') stacker = XYStacker() p.add(stacker.stack([a1, a2])) # ## SimpleTime Plot # In[ ]: SimpleTimePlot(tableRows, ["y1", "y10"], # column names timeColumn="time", # time is default value for a timeColumn yLabel="Price", displayNames=["1 Year", "10 Year"], colors = [[216, 154, 54], Color.lightGray], displayLines=True, # no lines (true by default) displayPoints=False) # show points (false by default)) # In[ ]: #time column base on DataFrame index tableRows.index = tableRows['time'] SimpleTimePlot(tableRows, ['m3']) # In[ ]: rng = pd.date_range('1/1/2011', periods=72, freq='H') ts = pd.Series(np.random.randn(len(rng)), index=rng) df = pd.DataFrame(ts, columns=['y']) SimpleTimePlot(df, ['y']) # ## Second Y Axis # The plot can have two y-axes. Just add a `YAxis` to the plot object, and specify its label. # Then for data that should be scaled according to this second axis, # specify the property `yAxis` with a value that coincides with the label given. # You can use `upperMargin` and `lowerMargin` to restrict the range of the data leaving more white, perhaps for the data on the other axis. # In[ ]: p = TimePlot(xLabel= "Time", yLabel= "Interest Rates") p.add(YAxis(label= "Spread", upperMargin= 4)) p.add(Area(x= tableRows.time, y= tableRows.spread, displayName= "Spread", yAxis= "Spread", color= Color(180, 50, 50, 128))) p.add(Line(x= tableRows.time, y= tableRows.m3, displayName= "3 Month")) p.add(Line(x= tableRows.time, y= tableRows.y10, displayName= "10 Year")) # ## Combined Plot # In[ ]: import math points = 100 logBase = 10 expys = [] xs = [] for i in range(0, points): xs.append(i / 15.0) expys.append(math.exp(xs[i])) cplot = CombinedPlot(xLabel= "Linear") logYPlot = Plot(title= "Linear x, Log y", yLabel= "Log", logY= True, yLogBase= logBase) logYPlot.add(Line(x= xs, y= expys, displayName= "f(x) = exp(x)")) logYPlot.add(Line(x= xs, y= xs, displayName= "g(x) = x")) cplot.add(logYPlot, 4) linearYPlot = Plot(title= "Linear x, Linear y", yLabel= "Linear") linearYPlot.add(Line(x= xs, y= expys, displayName= "f(x) = exp(x)")) linearYPlot.add(Line(x= xs, y= xs, displayName= "g(x) = x")) cplot.add(linearYPlot,4) cplot # In[ ]: plot = Plot(title= "Log x, Log y", xLabel= "Log", yLabel= "Log", logX= True, xLogBase= logBase, logY= True, yLogBase= logBase) plot.add(Line(x= xs, y= expys, displayName= "f(x) = exp(x)")) plot.add(Line(x= xs, y= xs, displayName= "f(x) = x")) plot