From eab46ba9c4a5c3262d658af26c81362d880757d2 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Thu, 15 Oct 2015 01:34:06 -0400 Subject: [PATCH] fixes --- examples/meetup/slides_20151028.ipynb | 354 +++++++++++++++++++++++++- src/Plots.jl | 2 +- src/args.jl | 4 +- src/backends/gadfly.jl | 2 +- src/plotter.jl | 2 +- 5 files changed, 358 insertions(+), 6 deletions(-) diff --git a/examples/meetup/slides_20151028.ipynb b/examples/meetup/slides_20151028.ipynb index 286dcb3d..1ba41f00 100644 --- a/examples/meetup/slides_20151028.ipynb +++ b/examples/meetup/slides_20151028.ipynb @@ -1,6 +1,356 @@ { - "cells": [], - "metadata": {}, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Visualization and Learning in Julia\n", + "\n", + "Tom Breloff\n", + "\n", + "https://github.com/tbreloff" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### My background\n", + "- BA Mathematics and Economics (U. of Rochester)\n", + "- MS Mathematics (NYU Courant Institute)\n", + "- Trader, researcher, quant, developer at several big banks and hedge funds, including one which I founded\n", + "- High speed algorithmic arbitrage trading and market making\n", + "- Machine learning and visualization enthusiast\n", + "- Lifelong programmer (since learning BASIC in 4th grade)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Before Julia\n", + "- Python and C/C++\n", + "- MATLAB and Java (so many files!!)\n", + "- Throughout the years: Mathematica, Go, R, C#, Javascript, Visual Basic/Excel, Lisp, Erlang, ..." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Things I liked from those languages\n", + "- Python\n", + " - Solid packages\n", + " - Easy to get stuff done\n", + "- C/C++\n", + " - Fast (when you put in the effort)\n", + "- MATLAB\n", + " - Great matrix operations\n", + " - Easy visualizations\n", + "- Java\n", + " - Hmmm... I broke my record for the longest function name ever?\n", + "- Go\n", + " - Channels and green threads" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### What about Julia?\n", + "- Easy to code\n", + "- Fast with little effort\n", + "- Solid vector/matrix support, but more flexible\n", + "- Macros and staged functions\n", + "- etc\n", + "\n", + "(Slow clap...)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Visualization in Julia\n", + "- Lots of packages: Gadfly, PyPlot, Vega, Winston, UnicodePlots, Qwt, Bokeh, Immerse ...\n", + "- Some are interactive (Immerse, PyPlot, Qwt)\n", + "- Some call other languages (PyPlot, Qwt, Vega, Bokeh)\n", + "- Some are native (Gadfly, Winston)\n", + "- Some are pretty (Gadfly, Vega)\n", + "- Some are fast and easy (UnicodePlots, Qwt, Winston)\n", + "- Some are feature-full (PyPlot)\n", + "- Why do I have to choose one?!?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Good design: AbstractArray\n", + "Many concrete array-types:\n", + "- Dense arrays\n", + "- Sparse arrays\n", + "- Ranges\n", + "- Distributed arrays\n", + "- Shared arrays\n", + "- GPU arrays\n", + "- Custom data structures\n", + "\n", + "Common code is implemented once for AbstractArray, and all concrete types get the benefit." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "5-element ScaryVector:\n", + " 1 \n", + " 2 \n", + " \"BOO!\"\n", + " 4 \n", + " 5 " + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "using StatsBase\n", + "\n", + "# implementation\n", + "type ScaryVector <: AbstractVector{Int}\n", + " boo::Int\n", + " n::Int\n", + " ScaryVector(n::Integer) = new(sample(1:n), n)\n", + "end\n", + "Base.length(sv::ScaryVector) = sv.n\n", + "Base.size(sv::ScaryVector) = (sv.n,)\n", + "Base.getindex(sv::ScaryVector, i::Integer) = (i == sv.boo ? \"BOO!\" : i)\n", + "\n", + "# test it out\n", + "sv = ScaryVector(5)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "4-element Array{Int64,1}:\n", + " 1\n", + " 2\n", + " 4\n", + " 5" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "filter(x -> isa(x, Number), sv)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Good design: AbstractArray\n", + "- Inheriting from AbstractArray gives you a lot \"for free\":\n", + " - Iteration (`map`, `for x in ...`, `filter`, ...)\n", + " - Operations\n", + " - Printing\n", + " - etc\n", + "- Few methods to implement... only what's needed.\n", + "- Abstractions put overlapping functionality in one place\n", + " - Easy to code\n", + " - Easy to maintain\n", + " \n", + "Imagine if there were no AbstractArray..." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "### Gadfly : `____________` :: ScaryVector : AbstractArray\n", + "\n", + "Thinking of graphics packages as concrete types, we see that we have many different types, but no abstraction linking them together. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "## Plots.jl\n", + "The AbstractArray of plotting..." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "Plot{Plots.GadflyPackage() n=1}" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "using Plots\n", + "gadfly()\n", + "default(size=(300,300), legend=false)\n", + "fx(u) = 1.1sin(u)^3\n", + "fy(u) = cos(u) - 0.4cos(2u) - 0.15cos(3u) - cos(4u)/13\n", + "plot(fx, fy, 0, 2π, leg=false, xlim=(-2,2), ylim=(-2,2))\n", + "title!(\"I ♡ Plots\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false, + "slideshow": { + "slide_type": "slide" + } + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "Plot{Plots.GadflyPackage() n=2}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "us = linspace(0, 2π, 100)\n", + "heart = Shape([(fx(u), -fy(u)) for u in us])\n", + "x, y, z = Vector[0.5randn(20) for i in 1:3]\n", + "scatter!(x, y, z=z, c=:reds, m=(heart,15))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "Credits for the dataset:\n", + "P. Cortez, A. Cerdeira, F. Almeida, T. Matos and J. Reis. \n", + "Modeling wine preferences by data mining from physicochemical properties. In Decision Support Systems, Elsevier, 47(4):547-553, 2009." + ] + } + ], + "metadata": { + "celltoolbar": "Slideshow", + "kernelspec": { + "display_name": "Julia 0.4.0-rc4", + "language": "julia", + "name": "julia-0.4" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "0.4.0" + } + }, "nbformat": 4, "nbformat_minor": 0 } diff --git a/src/Plots.jl b/src/Plots.jl index 694b5861..71eb4cec 100644 --- a/src/Plots.jl +++ b/src/Plots.jl @@ -257,7 +257,7 @@ end function __init__() global const CURRENT_BACKEND = pickDefaultBackend() # global CURRENT_BACKEND - println("[Plots.jl] Default backend: ", CURRENT_BACKEND.sym) + # println("[Plots.jl] Default backend: ", CURRENT_BACKEND.sym) # # auto init dataframes if the import statement doesn't error out # try diff --git a/src/args.jl b/src/args.jl index a58d46ae..81116c02 100644 --- a/src/args.jl +++ b/src/args.jl @@ -404,6 +404,8 @@ function processMarkerArg(d::Dict, arg) # markershape if trueOrAllTrue(a -> get(_markerAliases, a, a) in _allMarkers, arg) d[:markershape] = arg + elseif trueOrAllTrue(a -> isa(a, Shape), arg) + d[:markershape] = arg # markersize elseif trueOrAllTrue(a -> typeof(a) <: Real, arg) @@ -530,7 +532,7 @@ function warnOnUnsupported(pkg::PlottingPackage, d::Dict) || warn("linestyle $(d[:linestyle]) is unsupported with $pkg. Choose from: $(supportedStyles(pkg))")) (d[:markershape] == :none || d[:markershape] in supportedMarkers(pkg) - || typeof(d[:markershape]) in supportedMarkers(pkg) + || (Shape in supportedMarkers(pkg) && typeof(d[:markershape]) <: Shape) || warn("markershape $(d[:markershape]) is unsupported with $pkg. Choose from: $(supportedMarkers(pkg))")) end diff --git a/src/backends/gadfly.jl b/src/backends/gadfly.jl index 6387d364..12e778fc 100644 --- a/src/backends/gadfly.jl +++ b/src/backends/gadfly.jl @@ -61,7 +61,7 @@ supportedAxes(::GadflyPackage) = [:auto, :left] supportedTypes(::GadflyPackage) = [:none, :line, :path, :steppost, :sticks, :scatter, :heatmap, :hexbin, :hist, :bar, :hline, :vline, :ohlc] supportedStyles(::GadflyPackage) = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] # supportedMarkers(::GadflyPackage) = [:none, :auto, :rect, :ellipse, :diamond, :utriangle, :dtriangle, :cross, :xcross, :star1, :star2, :hexagon, :octagon, Shape] -supportedMarkers(::GadflyPackage) = _allMarkers +supportedMarkers(::GadflyPackage) = vcat(_allMarkers, Shape) supportedScales(::GadflyPackage) = [:identity, :log, :log2, :log10, :asinh, :sqrt] diff --git a/src/plotter.jl b/src/plotter.jl index 51bd7ea1..b1fbdb8d 100644 --- a/src/plotter.jl +++ b/src/plotter.jl @@ -210,7 +210,7 @@ function backend(modname) # update the symbol CURRENT_BACKEND.sym = modname - println("[Plots.jl] Switched to backend: ", modname) + # println("[Plots.jl] Switched to backend: ", modname) # return the package CURRENT_BACKEND.pkg