Slide 1

Slide 1 text

@jakevdp Jake VanderPlas Jake VanderPlas @jakevdp #PyCon2017 Python’s Visualization Landscape

Slide 2

Slide 2 text

@jakevdp Jake VanderPlas [Python’s Visualization Landscape] From the abstract: “In this talk I’ll give an overview of the landscape of dataviz tools in Python . . .”

Slide 3

Slide 3 text

@jakevdp Jake VanderPlas [Python’s Visualization Landscape] From the abstract: “In this talk I’ll give an overview of the landscape of dataviz tools in Python . . .”

Slide 4

Slide 4 text

@jakevdp Jake VanderPlas From the abstract: “In this talk I’ll give an overview of the landscape of dataviz tools in Python . . .” [Python’s Visualization Landscape]

Slide 5

Slide 5 text

@jakevdp Jake VanderPlas From the abstract: “In this talk I’ll give an overview of the landscape of dataviz tools in Python . . .” [Python’s Visualization Landscape]

Slide 6

Slide 6 text

@jakevdp Jake VanderPlas From the abstract: “In this talk I’ll give an overview of the landscape of dataviz tools in Python . . .” [Python’s Visualization Landscape]

Slide 7

Slide 7 text

@jakevdp Jake VanderPlas From the abstract: “In this talk I’ll give an overview of the landscape of dataviz tools in Python . . .” [Python’s Visualization Landscape]

Slide 8

Slide 8 text

@jakevdp Jake VanderPlas From the abstract: “In this talk I’ll give an overview of the landscape of dataviz tools in Python . . .” [Python’s Visualization Landscape]

Slide 9

Slide 9 text

@jakevdp Jake VanderPlas From the abstract: “In this talk I’ll give an overview of the landscape of dataviz tools in Python . . .” [Python’s Visualization Landscape] From the abstract: “In this talk I’ll give an overview of the landscape of dataviz tools in Python . . .”

Slide 10

Slide 10 text

@jakevdp Jake VanderPlas [Python’s Visualization Landscape] From the abstract: “In this talk I’ll give an overview of the landscape of dataviz tools in Python . . .”

Slide 11

Slide 11 text

@jakevdp Jake VanderPlas [Making Sense of the Deluge]

Slide 12

Slide 12 text

@jakevdp Jake VanderPlas matplotlib

Slide 13

Slide 13 text

@jakevdp Jake VanderPlas matplotlib basemap/ cartopy

Slide 14

Slide 14 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas basemap/ cartopy

Slide 15

Slide 15 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy networkx basemap/ cartopy

Slide 16

Slide 16 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap/ cartopy

Slide 17

Slide 17 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy

Slide 18

Slide 18 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy

Slide 19

Slide 19 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy javascript

Slide 20

Slide 20 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy javascript bokeh plotly

Slide 21

Slide 21 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy javascript bqplot bokeh toyplot plotly

Slide 22

Slide 22 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy javascript pythreejs bqplot bokeh toyplot plotly ipyvolume ipyleaflet

Slide 23

Slide 23 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy javascript pythreejs bqplot bokeh toyplot plotly ipyvolume cufflinks ipyleaflet

Slide 24

Slide 24 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy javascript pythreejs bqplot bokeh toyplot plotly ipyvolume cufflinks ipyleaflet

Slide 25

Slide 25 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy javascript pythreejs bqplot bokeh toyplot plotly ipyvolume cufflinks d3js mpld3 ipyleaflet

Slide 26

Slide 26 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy javascript pythreejs bqplot bokeh toyplot plotly ipyvolume cufflinks d3js mpld3 ipyleaflet Vega-Lite Vega

Slide 27

Slide 27 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy javascript pythreejs bqplot bokeh toyplot plotly ipyvolume cufflinks d3js mpld3 Altair Vincent ipyleaflet d3po Vega-Lite Vega

Slide 28

Slide 28 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy javascript pythreejs bqplot bokeh toyplot plotly ipyvolume cufflinks d3js mpld3 Altair Vincent ipyleaflet d3po Vega-Lite Vega

Slide 29

Slide 29 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy javascript pythreejs bqplot bokeh toyplot plotly ipyvolume cufflinks datashader d3js mpld3 Altair Vincent ipyleaflet d3po Vega-Lite Vega

Slide 30

Slide 30 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy javascript pythreejs bqplot bokeh toyplot plotly ipyvolume cufflinks datashader d3js mpld3 Altair Vincent ipyleaflet d3po Vega-Lite Vega Vaex

Slide 31

Slide 31 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy javascript pythreejs bqplot bokeh toyplot plotly ipyvolume cufflinks holoviews datashader d3js mpld3 Altair Vincent ipyleaflet d3po Vega-Lite Vega Vaex

Slide 32

Slide 32 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy javascript pythreejs bqplot bokeh toyplot plotly ipyvolume cufflinks holoviews datashader d3js mpld3 Altair Vincent OpenGL ipyleaflet d3po Vega-Lite Vega Vaex

Slide 33

Slide 33 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy javascript pythreejs bqplot bokeh toyplot plotly ipyvolume cufflinks holoviews datashader d3js mpld3 Altair Vincent OpenGL Glumpy Vispy ipyleaflet d3po Vega-Lite Vega Vaex

Slide 34

Slide 34 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy javascript pythreejs bqplot bokeh toyplot plotly ipyvolume cufflinks holoviews datashader d3js mpld3 Altair Vincent OpenGL Glumpy Vispy ipyleaflet d3po Vega-Lite Vega graphviz Vaex graph-tool

Slide 35

Slide 35 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy javascript pythreejs bqplot bokeh toyplot plotly ipyvolume cufflinks holoviews datashader d3js mpld3 Altair Vincent OpenGL Glumpy Vispy ipyleaflet Lightning GlueViz YT d3po Vega-Lite Vega MayaVi graphviz GR framework PyQTgraph pygal chaco Vaex graph-tool

Slide 36

Slide 36 text

@jakevdp Jake VanderPlas Python’s Visualization Landscape matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy javascript pythreejs bqplot bokeh toyplot plotly ipyvolume cufflinks holoviews datashader d3js mpld3 Altair Vincent OpenGL Glumpy Vispy ipyleaflet Lightning GlueViz YT d3po Vega-Lite Vega MayaVi graphviz GR framework PyQTgraph pygal chaco Vaex graph-tool

Slide 37

Slide 37 text

@jakevdp Jake VanderPlas

Slide 38

Slide 38 text

@jakevdp Jake VanderPlas How did we get here?

Slide 39

Slide 39 text

@jakevdp Jake VanderPlas In the beginning was matplotlib* * well, actually… Python visualization existed before matplotlib, but was not very mature.

Slide 40

Slide 40 text

@jakevdp Jake VanderPlas Plotting with Matplotlib Strengths: - Designed like MatLab: switching was easy

Slide 41

Slide 41 text

@jakevdp Jake VanderPlas Plotting with Matplotlib Strengths: - Designed like MatLab: switching was easy - Many rendering backends

Slide 42

Slide 42 text

@jakevdp Jake VanderPlas Plotting with Matplotlib Strengths: - Designed like MatLab: switching was easy - Many rendering backends - Can reproduce just about any plot (with a bit of effort)

Slide 43

Slide 43 text

@jakevdp Jake VanderPlas Plotting with Matplotlib Strengths: - Designed like MatLab: switching was easy - Many rendering backends - Can reproduce just about any plot (with a bit of effort) - Well-tested, standard tool for over a decade

Slide 44

Slide 44 text

@jakevdp Jake VanderPlas Matplotlib Gallery

Slide 45

Slide 45 text

@jakevdp Jake VanderPlas import pandas as pd iris = pd.read_csv('iris.csv') iris.head() Tidy data: i.e. rows are samples, columns are features Example: Statistical Data

Slide 46

Slide 46 text

@jakevdp Jake VanderPlas “I want to scatter petal length vs. sepal length, and color by species” Just a simple visualization . . .

Slide 47

Slide 47 text

@jakevdp Jake VanderPlas color_map = dict(zip(iris.species.unique(), ['blue', 'green', 'red'])) for species, group in iris.groupby('species'): plt.scatter(group['petalLength'], group['sepalLength'], color=color_map[species], alpha=0.3, edgecolor=None, label=species) plt.legend(frameon=True, title='species') plt.xlabel('petalLength') plt.ylabel('sepalLength') Just a simple visualization . . .

Slide 48

Slide 48 text

@jakevdp Jake VanderPlas Plotting with Matplotlib Strengths: - Designed like MatLab: switching was easy - Many rendering backends - Can reproduce just about any plot with a bit of effort - Well-tested, standard tool for over a decade Weaknesses: - API is imperative & often overly verbose - Sometimes poor stylistic defaults - Poor support for web/interactive graphs - Often slow for large & complicated data

Slide 49

Slide 49 text

@jakevdp Jake VanderPlas Everyone’s Goal: Improve on the weaknesses of matplotlib (without sacrificing the strengths!)

Slide 50

Slide 50 text

@jakevdp Jake VanderPlas Building on Matplotlib. . . matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy

Slide 51

Slide 51 text

@jakevdp Jake VanderPlas Building on Matplotlib. . . Common Idea: Keep matplotlib as a versatile, well-tested backend, and provide a new domain-specific API. matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy

Slide 52

Slide 52 text

@jakevdp Jake VanderPlas Building on Matplotlib. . . matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy

Slide 53

Slide 53 text

@jakevdp Jake VanderPlas Pandas plotting API Key Features: - Pandas provides a DataFrame object - Also provides a simple API for plotting DataFrames

Slide 54

Slide 54 text

@jakevdp Jake VanderPlas iris.plot.scatter('petalLength', 'petalWidth')

Slide 55

Slide 55 text

@jakevdp Jake VanderPlas from pandas.tools.plotting import andrews_curves andrews_curves(iris, 'species') - More sophisticated statistical visualization tools have recently been added

Slide 56

Slide 56 text

@jakevdp Jake VanderPlas http://seaborn.pydata.org Key Features: - Like Pandas, wraps matplotlib - Nice set of color palettes & plot styles - Focus on statistical visualization & modeling Seaborn: statistical data visualization

Slide 57

Slide 57 text

@jakevdp Jake VanderPlas import seaborn as sns sns.lmplot('petalLength', 'sepalWidth', iris, hue='species', fit_reg=False) Seaborn examples

Slide 58

Slide 58 text

@jakevdp Jake VanderPlas sns.pairplot(iris, hue='species') Seaborn examples

Slide 59

Slide 59 text

@jakevdp Jake VanderPlas Javascript-based Viz: javascript pythreejs bqplot bokeh toyplot plotly ipyvolume cufflinks ipyleaflet

Slide 60

Slide 60 text

@jakevdp Jake VanderPlas Javascript-based Viz: Common Idea: build a new API that produces a plot serialization (often JSON) that can be displayed in the browser (often in Jupyter notebooks) javascript pythreejs bqplot bokeh toyplot plotly ipyvolume cufflinks ipyleaflet

Slide 61

Slide 61 text

@jakevdp Jake VanderPlas Javascript-based Viz: javascript pythreejs bqplot toyplot ipyvolume cufflinks ipyleaflet bokeh plotly

Slide 62

Slide 62 text

@jakevdp Jake VanderPlas Plotting with Bokeh

Slide 63

Slide 63 text

@jakevdp Jake VanderPlas Bokeh Gallery

Slide 64

Slide 64 text

@jakevdp Jake VanderPlas Plotting with Bokeh Advantages: - Web view/interactivity - Imperative and Declarative layer - Handles large and/or streaming datasets - Geographical visualization - Fully open source Disadvantages: - No vector output (need PDF/EPS? Sorry) - Newer tool with a smaller user-base than matplotlib

Slide 65

Slide 65 text

@jakevdp Jake VanderPlas Basic Plotting with Plotly

Slide 66

Slide 66 text

@jakevdp Jake VanderPlas Plotly Gallery

Slide 67

Slide 67 text

@jakevdp Jake VanderPlas Plotting with Plotly Advantages: - Web view/interactivity - Multi-language support - 3D plotting capability - Animation capability - Geographical visualization Disadvantages: - Some features require a paid plan

Slide 68

Slide 68 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy javascript pythreejs bqplot bokeh toyplot plotly ipyvolume cufflinks holoviews datashader d3js mpld3 Altair Vincent OpenGL Glumpy Vispy ipyleaflet Lightning GlueViz YT d3po Vega-Lite Vega MayaVi graphviz GR framework PyQTgraph pygal chaco Vaex graph-tool Visualization for Larger Data . . .

Slide 69

Slide 69 text

@jakevdp Jake VanderPlas matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy javascript pythreejs bqplot bokeh toyplot plotly ipyvolume cufflinks holoviews d3js mpld3 Altair Vincent OpenGL Glumpy Vispy ipyleaflet Lightning GlueViz YT d3po Vega-Lite Vega MayaVi graphviz GR framework PyQTgraph pygal chaco Vaex graph-tool Visualization for Larger Data . . . datashader

Slide 70

Slide 70 text

@jakevdp Jake VanderPlas Datashader Fast server-side engine for dynamic data aggregation

Slide 71

Slide 71 text

@jakevdp Jake VanderPlas Datashader - Compute layer that works with Bokeh - Rather than sending data to the client, it aggregates data and sends pixels. - Can handle interactive visualization of billions of rows.

Slide 72

Slide 72 text

@jakevdp Jake VanderPlas Datashader - Compute layer that works with Bokeh - Rather than sending data to the client, it aggregates data and sends pixels. - Can handle interactive visualization of billions of rows.

Slide 73

Slide 73 text

@jakevdp Jake VanderPlas seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy pythreejs bqplot toyplot plotly ipyvolume cufflinks holoviews datashader mpld3 Vincent OpenGL Glumpy Vispy ipyleaflet Lightning GlueViz YT d3po Vega-Lite Vega MayaVi graphviz GR framework PyQTgraph pygal chaco Vaex graph-tool Toward Declarative Visualization . . . d3js javascript bokeh matplotlib Altair

Slide 74

Slide 74 text

@jakevdp Jake VanderPlas seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy pythreejs bqplot toyplot plotly ipyvolume cufflinks holoviews mpld3 Vincent OpenGL Glumpy Vispy ipyleaflet Lightning GlueViz YT d3po Vega-Lite Vega MayaVi graphviz GR framework PyQTgraph pygal chaco Vaex graph-tool Toward Declarative Visualization . . . d3js javascript bokeh matplotlib Altair datashader

Slide 75

Slide 75 text

@jakevdp Jake VanderPlas Holoviews - Datasets themselves stored in objects that automatically produce intelligent visualizations - Composition & Interactivity via operator overloading - Renders to Bokeh, DataShader, and Matplotlib

Slide 76

Slide 76 text

@jakevdp Jake VanderPlas Holoviews - Also can handle geographic data & time-series

Slide 77

Slide 77 text

@jakevdp Jake VanderPlas What if instead of passing around pixels, we pass around visualization specifications plus data? Altair

Slide 78

Slide 78 text

@jakevdp Jake VanderPlas What if instead of passing around pixels, we pass around visualization specifications plus data? “Declarative Visualization” Altair

Slide 79

Slide 79 text

@jakevdp Jake VanderPlas What if instead of passing around pixels, we pass around visualization specifications plus data? “Declarative Visualization” Altair

Slide 80

Slide 80 text

@jakevdp Jake VanderPlas Declarative Visualization: Viz for data science Declarative - Specify What should be done - Details determined automatically - Separates Specification from Execution Imperative - Specify How something should be done. - Must manually specify plotting steps - Specification & Execution intertwined. Declarative visualization lets you think about data and relationships, rather than incidental details.

Slide 81

Slide 81 text

#JSM2016 Jake VanderPlas From D3 to Altair . . . (link to live version)

Slide 82

Slide 82 text

#JSM2016 Jake VanderPlas But working in D3 can be challenging . . .

Slide 83

Slide 83 text

#JSM2016 Jake VanderPlas Bar Chart: d3 var margin = {top: 20, right: 20, bottom: 30, left: 40}, width = 960 - margin.left - margin.right, height = 500 - margin.top - margin.bottom; var x = d3.scale.ordinal() .rangeRoundBands([0, width], .1); var y = d3.scale.linear() .range([height, 0]); var xAxis = d3.svg.axis() .scale(x) .orient("bottom"); var yAxis = d3.svg.axis() .scale(y) .orient("left") .ticks(10, "%"); var svg = d3.select("body").append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); d3.tsv("data.tsv", type, function(error, data) { if (error) throw error; x.domain(data.map(function(d) { return d.letter; })); y.domain([0, d3.max(data, function(d) { return d.frequency; })]); svg.append("g") .attr("class", "x axis") .attr("transform", "translate(0," + height + ")") .call(xAxis); svg.append("g") .attr("class", "y axis") .call(yAxis) .append("text") .attr("transform", "rotate(-90)") .attr("y", 6) .attr("dy", ".71em") .style("text-anchor", "end") .text("Frequency"); svg.selectAll(".bar") .data(data) .enter().append("rect") .attr("class", "bar") .attr("x", function(d) { return x(d.letter); }) .attr("width", x.rangeBand()) .attr("y", function(d) { return y(d.frequency); }) .attr("height", function(d) { return height - y(d.frequency); }); }); function type(d) { d.frequency = +d.frequency; return d; } D3 is a Javascript package that streamlines manipulation of objects on a webpage.

Slide 84

Slide 84 text

#JSM2016 Jake VanderPlas Bar Chart: Vega { "width": 400, "height": 200, "padding": {"top": 10, "left": 30, "bottom": 30, "right": 10}, "data": [ { "name": "table", "values": [ {"x": 1, "y": 28}, {"x": 2, "y": 55}, {"x": 3, "y": 43}, {"x": 4, "y": 91}, {"x": 5, "y": 81}, {"x": 6, "y": 53}, {"x": 7, "y": 19}, {"x": 8, "y": 87}, {"x": 9, "y": 52}, {"x": 10, "y": 48}, {"x": 11, "y": 24}, {"x": 12, "y": 49}, {"x": 13, "y": 87}, {"x": 14, "y": 66}, {"x": 15, "y": 17}, {"x": 16, "y": 27}, {"x": 17, "y": 68}, {"x": 18, "y": 16}, {"x": 19, "y": 49}, {"x": 20, "y": 15} ] } ], "scales": [ { "name": "x", "type": "ordinal", "range": "width", "domain": {"data": "table", "field": "x"} }, { "name": "y", "type": "linear", "range": "height", "domain": {"data": "table", "field": "y"}, "nice": true } ], "axes": [ {"type": "x", "scale": "x"}, {"type": "y", "scale": "y"} ], "marks": [ { "type": "rect", "from": {"data": "table"}, "properties": { "enter": { "x": {"scale": "x", "field": "x"}, "width": {"scale": "x", "band": true, "offset": -1}, "y": {"scale": "y", "field": "y"}, "y2": {"scale": "y", "value": 0} }, "update": { "fill": {"value": "steelblue"} Vega is a detailed declarative specification for visualizations, built on D3.

Slide 85

Slide 85 text

#JSM2016 Jake VanderPlas Bar Chart: Vega-Lite { "description": "A simple bar chart with embedded data.", "data": { "values": [ {"a": "A","b": 28}, {"a": "B","b": 55}, {"a": "C","b": 43}, {"a": "D","b": 91}, {"a": "E","b": 81}, {"a": "F","b": 53}, {"a": "G","b": 19}, {"a": "H","b": 87}, {"a": "I","b": 52} ] }, "mark": "bar", "encoding": { "x": {"field": "a", "type": "ordinal"}, "y": {"field": "b", "type": "quantitative"} } } Vega-Lite is a simpler declarative specification aimed at statistical visualization.

Slide 86

Slide 86 text

#JSM2016 Jake VanderPlas Bar Chart: Altair Altair is a Python API for creating Vega-Lite specifications.

Slide 87

Slide 87 text

@jakevdp Jake VanderPlas From Declarative API to declarative Grammar chart = Chart(data).mark_circle( opacity=0.3 ).encode( x='petalLength:Q', y='sepalWidth:Q', color='species:N', ) chart.display()

Slide 88

Slide 88 text

@jakevdp Jake VanderPlas From Declarative API to declarative Grammar >>> chart.to_dict() {'config': {'mark': {'opacity': 0.3}}, 'data': {'url': 'https://vega.github.io/vega-datasets/data/iris.json'}, 'encoding': {'color': {'field': 'species', 'type': 'nominal'}, 'x': {'field': 'petalLength', 'type': 'quantitative'}, 'y': {'field': 'sepalWidth', 'type': 'quantitative'}}, 'mark': 'circle'}

Slide 89

Slide 89 text

#JSM2016 Jake VanderPlas (Visualizations from jakevdp/altair-examples).

Slide 90

Slide 90 text

#JSM2016 Jake VanderPlas Coming Very Soon: Altair 2.0 - Includes a Grammar of Interaction

Slide 91

Slide 91 text

@jakevdp Jake VanderPlas or $ conda install altair --channel conda-forge $ pip install altair $ jupyter nbextension install --sys-prefix --py vega Try Altair: http://github.com/ellisonbg/altair/ For a Jupyter notebook tutorial, type import altair altair.tutorial()

Slide 92

Slide 92 text

@jakevdp Jake VanderPlas Python’s Visualization Landscape matplotlib seaborn pandas ggpy scikit- plot Yellow brick networkx basemap /cartopy javascript pythreejs bqplot bokeh toyplot plotly ipyvolume cufflinks holoviews datashader d3js mpld3 Altair Vincent OpenGL Glumpy Vispy ipyleaflet Lightning GlueViz YT d3po Vega-Lite Vega MayaVi graphviz GR framework PyQTgraph pygal chaco Vaex graph-tool

Slide 93

Slide 93 text

@jakevdp Jake VanderPlas Email: [email protected] Twitter: @jakevdp Github: jakevdp Web: http://vanderplas.com/ Blog: http://jakevdp.github.io/ Thank You!