iris_splom.py — Anaconda Enterprise 4.4 documentation

Anaconda Enterprise: Documentation

# iris_splom.py

    from __future__ import print_function

    from bokeh.document import Document
    from bokeh.embed import file_html
    from bokeh.layouts import gridplot
    from bokeh.models.glyphs import Circle
    from bokeh.models import (BasicTicker, ColumnDataSource, Grid, LinearAxis,
                             DataRange1d, PanTool, Plot, WheelZoomTool)
    from bokeh.resources import INLINE
    from bokeh.sampledata.iris import flowers
    from bokeh.util.browser import view

    colormap = {'setosa': 'red', 'versicolor': 'green', 'virginica': 'blue'}

    flowers['color'] = flowers['species'].map(lambda x: colormap[x])

    source = ColumnDataSource(
        data=dict(
            petal_length=flowers['petal_length'],
            petal_width=flowers['petal_width'],
            sepal_length=flowers['sepal_length'],
            sepal_width=flowers['sepal_width'],
            color=flowers['color']
        )
    )

    xdr = DataRange1d(bounds=None)
    ydr = DataRange1d(bounds=None)

    def make_plot(xname, yname, xax=False, yax=False):
        mbl = 40 if yax else 0
        mbb = 40 if xax else 0
        plot = Plot(
            x_range=xdr, y_range=ydr, background_fill_color="#efe8e2",
            border_fill_color='white', plot_width=200 + mbl, plot_height=200 + mbb,
            min_border_left=2+mbl, min_border_right=2, min_border_top=2, min_border_bottom=2+mbb)

        circle = Circle(x=xname, y=yname, fill_color="color", fill_alpha=0.2, size=4, line_color="color")
        r = plot.add_glyph(source, circle)

        xdr.renderers.append(r)
        ydr.renderers.append(r)

        xticker = BasicTicker()
        if xax:
            xaxis = LinearAxis()
            plot.add_layout(xaxis, 'below')
            xticker = xaxis.ticker
        plot.add_layout(Grid(dimension=0, ticker=xticker))

        yticker = BasicTicker()
        if yax:
            yaxis = LinearAxis()
            plot.add_layout(yaxis, 'left')
            yticker = yaxis.ticker
        plot.add_layout(Grid(dimension=1, ticker=yticker))

        plot.add_tools(PanTool(), WheelZoomTool())

        return plot

    xattrs = ["petal_length", "petal_width", "sepal_width", "sepal_length"]
    yattrs = list(reversed(xattrs))
    plots = []

    for y in yattrs:
        row = []
        for x in xattrs:
            xax = (y == yattrs[-1])
            yax = (x == xattrs[0])
            plot = make_plot(x, y, xax, yax)
            row.append(plot)
        plots.append(row)

    grid = gridplot(plots)

    doc = Document()
    doc.add_root(grid)

    if __name__ == "__main__":
        doc.validate()
        filename = "iris_splom.html"
        with open(filename, "w") as f:
            f.write(file_html(doc, INLINE, "Iris Data SPLOM"))
        print("Wrote %s" % filename)
        view(filename)