From 368429b757a42c44ab039046d7fadd974b0ac95c Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Fri, 18 Dec 2015 10:14:15 -0500 Subject: [PATCH 001/121] working on glvisualize --- src/backends/glvisualize.jl | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/backends/glvisualize.jl b/src/backends/glvisualize.jl index c42848ec..10c59756 100644 --- a/src/backends/glvisualize.jl +++ b/src/backends/glvisualize.jl @@ -13,9 +13,13 @@ function _create_plot(pkg::GLVisualizePackage; kw...) d = Dict(kw) # TODO: create the window/canvas/context that is the plot within the backend (call it `o`) # TODO: initialize the plot... title, xlabel, bgcolor, etc + + # TODO: this should be moved to the display method? w,r=GLVisualize.glscreen() @async r() - Plot(GLScreenWrapper(w,r), pkg, 0, d, Dict[]) + o = GLScreenWrapper(w,r) + + Plot(o, pkg, 0, d, Dict[]) end @@ -23,8 +27,12 @@ function _add_series(::GLVisualizePackage, plt::Plot; kw...) d = Dict(kw) # TODO: add one series to the underlying package push!(plt.seriesargs, d) - x,y,z=map(Float32,d[:x]), map(Float32,d[:y]), map(Float32,d[:surface].surf) - GLVisualize.view(GLVisualize.visualize(x*ones(y)', ones(x)*y', z, :surface)) + + # TODO: this should be moved to the display method? + x, y, z = map(Float32, d[:x]), map(Float32, d[:y]), map(Float32, d[:z].surf) + viz = GLVisualize.visualize(x*ones(y)', ones(x)*y', z, :surface) + GLVisualize.view(viz) + plt end @@ -51,13 +59,16 @@ end # accessors for x/y data function Base.getindex(plt::Plot{GLVisualizePackage}, i::Int) - series = plt.o.lines[i] - series.x, series.y + # TODO: + # series = plt.o.lines[i] + # series.x, series.y + nothing, nothing end function Base.setindex!(plt::Plot{GLVisualizePackage}, xy::Tuple, i::Integer) - series = plt.o.lines[i] - series.x, series.y = xy + # TODO: + # series = plt.o.lines[i] + # series.x, series.y = xy plt end @@ -83,6 +94,10 @@ end function Base.display(::PlotsDisplay, plt::Plot{GLVisualizePackage}) # TODO: display/show the plot + + # NOTE: I think maybe this should be empty? We can start with the assumption that creating + # and adding to a plot will automatically open a window and draw to it, then the display + # wouldn't actually need to do anything end function Base.display(::PlotsDisplay, plt::Subplot{GLVisualizePackage}) From 9fffef6f53f935067948a23cf51fe6842d56fc8e Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Fri, 18 Dec 2015 13:19:22 -0500 Subject: [PATCH 002/121] cleanup --- src/backends/plotly.jl | 78 ------------------------------------------ 1 file changed, 78 deletions(-) diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index a417d3fb..bb7af4d7 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -194,84 +194,6 @@ function get_plot_json(plt::Plot{PlotlyPackage}) d_out[:xaxis] = plotlyaxis(d, true) d_out[:yaxis] = plotlyaxis(d, false) - # # x-axis - # d_out[:xaxis] = Dict( - # :title => d[:xlabel], - # :showgrid => d[:grid], - # :zeroline => false, - # ) - # merge!(d_out[:xaxis], if use_axis_field(d[:xticks]) - # ax = Dict( - # :titlefont => plotlyfont(d[:guidefont]), - # :type => plotlyscale(d[:xscale]), - # :tickfont => plotlyfont(d[:tickfont]), - # :tickcolor => fgcolor, - # :linecolor => fgcolor, - # ) - - # # xlims - # lims = d[:xlims] - # if lims != :auto && limsType(lims) == :limits - # ax[:range] = lims - # end - - # # xflip - # if d[:xflip] - # ax[:autorange] = "reversed" - # end - - # # xticks - # ticks = d[:xticks] - # if ticks != :auto - # ttype = ticksType(ticks) - # if ttype == :ticks - # ax[:tickmode] = "array" - # ax[:tickvals] = ticks - # elseif ttype == :ticks_and_labels - # ax[:tickmode] = "array" - # ax[:tickvals], ax[:ticktext] = ticks - # end - # end - - # ax - # else - # Dict( - # :showticklabels => false, - # :showgrid => false, - # ) - # end) - - - # # y-axis - # d_out[:yaxis] = Dict( - # :title => d[:ylabel], - # :showgrid => d[:grid], - # :zeroline => false, - # ) - # merge!(d_out[:yaxis], if use_axis_field(d[:yticks]) - # Dict( - # :titlefont => plotlyfont(d[:guidefont]), - # :type => plotlyscale(d[:yscale]), - # :tickfont => plotlyfont(d[:tickfont]), - # :tickcolor => fgcolor, - # :linecolor => fgcolor, - # ) - # else - # Dict( - # :showticklabels => false, - # :showgrid => false, - # ) - # end) - - # lims = d[:ylims] - # if lims != :auto && limsType(lims) == :limits - # d_out[:yaxis][:range] = lims - # end - - # if d[:yflip] - # d_out[:yaxis][:autorange] = "reversed" - # end - # legend d_out[:showlegend] = d[:legend] if d[:legend] From eabe670ae815a054a897e9cae3a43bf9c9ce3404 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Fri, 18 Dec 2015 17:33:57 -0500 Subject: [PATCH 003/121] working on plotlyjs integration --- src/backends/plotly.jl | 18 ++++++++------ src/backends/plotly_blink.jl | 48 ++++++++++++++++++++++++++++++++++++ src/plotter.jl | 6 +++++ 3 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 src/backends/plotly_blink.jl diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index bb7af4d7..9f9482c3 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -176,8 +176,9 @@ function plotlyaxis(d::Dict, isx::Bool) ax end -function get_plot_json(plt::Plot{PlotlyPackage}) - d = plt.plotargs +# function get_plot_json(plt::Plot{PlotlyPackage}) +# d = plt.plotargs +function plotly_layout(d::Dict) d_out = Dict() bgcolor = webcolor(d[:background_color]) @@ -210,8 +211,11 @@ function get_plot_json(plt::Plot{PlotlyPackage}) d_out[:annotations] = [get_annotation_dict(ann...) for ann in anns] end - # finally build and return the json - JSON.json(d_out) + d_out +end + +function get_plot_json(plt::Plot{PlotlyPackage}) + JSON.json(plotly_layout(plt.plotargs)) end @@ -231,7 +235,7 @@ const _plotly_markers = Dict( ) # get a dictionary representing the series params (d is the Plots-dict, d_out is the Plotly-dict) -function get_series_json(d::Dict; plot_index = nothing) +function plotly_series(d::Dict; plot_index = nothing) d_out = Dict() x, y = collect(d[:x]), collect(d[:y]) @@ -360,14 +364,14 @@ end # get a list of dictionaries, each representing the series params function get_series_json(plt::Plot{PlotlyPackage}) - JSON.json(map(get_series_json, plt.seriesargs)) + JSON.json(map(plotly_series, plt.seriesargs)) end function get_series_json(subplt::Subplot{PlotlyPackage}) ds = Dict[] for (i,plt) in enumerate(subplt.plts) for d in plt.seriesargs - push!(ds, get_series_json(d, plot_index = i)) + push!(ds, plotly_series(d, plot_index = i)) end end JSON.json(ds) diff --git a/src/backends/plotly_blink.jl b/src/backends/plotly_blink.jl new file mode 100644 index 00000000..c5f5a6f5 --- /dev/null +++ b/src/backends/plotly_blink.jl @@ -0,0 +1,48 @@ + +# override some methods to use Plotlyjs/Blink + +import Plotlyjs + +function _create_plot(pkg::PlotlyPackage; kw...) + d = Dict(kw) + # TODO: create the window/canvas/context that is the plot within the backend (call it `o`) + # TODO: initialize the plot... title, xlabel, bgcolor, etc + o = Plotlyjs.Plot() + + Plot(o, pkg, 0, d, Dict[]) +end + + +function _add_series(::PlotlyPackage, plt::Plot; kw...) + d = Dict(kw) + + # add to the data array + pdict = plotly_series(d) + gt = Plotlyjs.GenericTrace(pdict[:type], pdict) + push!(plt.o.data, gt) + if !isnull(plt.o.window) + Plotlyjs.addtraces!(plt.o, gt) + end + + push!(plt.seriesargs, d) + plt +end + +# TODO: override this to update plot items (title, xlabel, etc) after creation +function _update_plot(plt::Plot{PlotlyPackage}, d::Dict) + pdict = plotly_layout(d) + plt.o.layout = Plotlyjs.Layout(pdict) + if !isnull(plt.o.window) + Plotlyjs.relayout!(plt.o, pdict...) + end +end + + +function Base.display(::PlotsDisplay, plt::Plot{PlotlyPackage}) + dump(plt.o) + show(plt.o) +end + +function Base.display(::PlotsDisplay, plt::Subplot{PlotlyPackage}) + error() +end diff --git a/src/plotter.jl b/src/plotter.jl index 3ca93d15..1963acfb 100644 --- a/src/plotter.jl +++ b/src/plotter.jl @@ -235,6 +235,12 @@ function backend() # end borrowing (thanks :) ########################### + try + include(joinpath(Pkg.dir("Plots"), "src", "backends", "plotly_blink.jl")) + catch err + warn("Error including Plotlyjs: $err\n Note: Will fall back to built-in display.") + end + end catch err warn("Couldn't setup Plotly") From 55501e68fbd3e435d1fa0ca46b97fae722f6ff12 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Wed, 23 Dec 2015 13:03:25 -0500 Subject: [PATCH 004/121] added tex output; fixes for surface inputs; commented out plotly_blink --- src/backends/gadfly.jl | 3 ++- src/output.jl | 10 ++++++++++ src/plot.jl | 12 +++++++++--- src/plotter.jl | 10 +++++----- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/backends/gadfly.jl b/src/backends/gadfly.jl index 441c1b7e..ee6beb43 100644 --- a/src/backends/gadfly.jl +++ b/src/backends/gadfly.jl @@ -667,9 +667,10 @@ getGadflyWriteFunc(::MIME"image/svg+xml") = Gadfly.SVG # getGadflyWriteFunc(::MIME"text/html") = Gadfly.SVGJS getGadflyWriteFunc(::MIME"application/pdf") = Gadfly.PDF getGadflyWriteFunc(::MIME"application/postscript") = Gadfly.PS +getGadflyWriteFunc(::MIME"application/x-tex") = Gadfly.PGF getGadflyWriteFunc(m::MIME) = error("Unsupported in Gadfly/Immerse: ", m) -for mime in (MIME"image/png", MIME"image/svg+xml", MIME"application/pdf", MIME"application/postscript") +for mime in (MIME"image/png", MIME"image/svg+xml", MIME"application/pdf", MIME"application/postscript", MIME"application/x-tex") @eval function Base.writemime{P<:GadflyOrImmerse}(io::IO, ::$mime, plt::PlottingObject{P}) func = getGadflyWriteFunc($mime()) dowritemime(io, func, plt) diff --git a/src/output.jl b/src/output.jl index afc98c25..5a97848a 100644 --- a/src/output.jl +++ b/src/output.jl @@ -37,6 +37,15 @@ end ps(fn::@compat(AbstractString)) = ps(current(), fn) +function tex(plt::PlottingObject, fn::@compat(AbstractString)) + fn = addExtension(fn, "tex") + io = open(fn, "w") + writemime(io, MIME("application/x-tex"), plt) + close(io) +end +tex(fn::@compat(AbstractString)) = tex(current(), fn) + + # ---------------------------------------------------------------- @@ -45,6 +54,7 @@ ps(fn::@compat(AbstractString)) = ps(current(), fn) "svg" => svg, "pdf" => pdf, "ps" => ps, + "tex" => tex, ) function getExtension(fn::@compat(AbstractString)) diff --git a/src/plot.jl b/src/plot.jl index 47b11a43..db7a8c02 100644 --- a/src/plot.jl +++ b/src/plot.jl @@ -378,14 +378,15 @@ function createKWargsList{T<:Real}(plt::PlottingObject, x::AVec, y::AVec, zmat:: @assert x == sort(x) @assert y == sort(y) @assert size(zmat) == (length(x), length(y)) - surf = Surface(convert(Matrix{Float64}, zmat)) + # surf = Surface(convert(Matrix{Float64}, zmat)) # surf = Array(Any,1,1) # surf[1,1] = convert(Matrix{Float64}, zmat) d = Dict(kw) + d[:z] = Surface(convert(Matrix{Float64}, zmat)) if !(get(d, :linetype, :none) in (:contour, :surface, :wireframe)) d[:linetype] = :contour end - createKWargsList(plt, x, y; d..., z = surf) + createKWargsList(plt, x, y; d...) #, z = surf) end # contours or surfaces... general x, y grid @@ -394,7 +395,12 @@ function createKWargsList{T<:Real}(plt::PlottingObject, x::AMat{T}, y::AMat{T}, surf = Surface(convert(Matrix{Float64}, zmat)) # surf = Array(Any,1,1) # surf[1,1] = convert(Matrix{Float64}, zmat) - createKWargsList(plt, x, y; kw..., surface = surf, linetype = :contour) + d = Dict(kw) + d[:z] = Surface(convert(Matrix{Float64}, zmat)) + if !(get(d, :linetype, :none) in (:contour, :surface, :wireframe)) + d[:linetype] = :contour + end + createKWargsList(plt, Any[x], Any[y]; d...) #kw..., z = surf, linetype = :contour) end diff --git a/src/plotter.jl b/src/plotter.jl index 1963acfb..6d84da53 100644 --- a/src/plotter.jl +++ b/src/plotter.jl @@ -235,11 +235,11 @@ function backend() # end borrowing (thanks :) ########################### - try - include(joinpath(Pkg.dir("Plots"), "src", "backends", "plotly_blink.jl")) - catch err - warn("Error including Plotlyjs: $err\n Note: Will fall back to built-in display.") - end + # try + # include(joinpath(Pkg.dir("Plots"), "src", "backends", "plotly_blink.jl")) + # catch err + # warn("Error including Plotlyjs: $err\n Note: Will fall back to built-in display.") + # end end catch err From ed7cc9b89e6b90c19c187dea108f8c5722804ef8 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Wed, 23 Dec 2015 22:15:13 -0500 Subject: [PATCH 005/121] pyplot surface/wireframe fix for matrix x/y; fix in with, when backend unset --- src/backends/pyplot.jl | 12 ++++++++++-- src/utils.jl | 3 +++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index d433eb49..f150c74b 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -344,7 +344,15 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) end handle elseif lt in (:surface,:wireframe) - plotfunc(repmat(d[:x]',length(d[:y]),1), repmat(d[:y],1,length(d[:x])), d[:z].surf'; extra_kwargs...) + x, y, z = if isa(d[:x], AMat) && isa(d[:y], AMat) + d[:x], d[:y], d[:z].surf + else + repmat(d[:x]',length(d[:y]),1), repmat(d[:y],1,length(d[:x])), d[:z].surf' + end + # x = isa(d[:x], AMat) ? d[:x] : repmat(d[:x]',length(d[:y]),1) + # y = isa(d[:y], AMat) ? d[:y] : repmat(d[:y],1,length(d[:x])) + # z = isa(d[:x], AMat) ? d[:z].surf : d[:z].surf' + plotfunc(x, y, z; extra_kwargs...) elseif lt in _3dTypes plotfunc(d[:x], d[:y], d[:z]; extra_kwargs...) elseif lt in (:scatter, :heatmap, :hexbin) @@ -629,7 +637,7 @@ end function addPyPlotLegend(plt::Plot, ax) if plt.plotargs[:legend] # gotta do this to ensure both axes are included - args = filter(x -> !(x[:linetype] in (:hist,:density,:hexbin,:heatmap,:hline,:vline,:contour, :path3d, :scatter3d)), plt.seriesargs) + args = filter(x -> !(x[:linetype] in (:hist,:density,:hexbin,:heatmap,:hline,:vline,:contour, :surface, :wireframe, :path3d, :scatter3d)), plt.seriesargs) if length(args) > 0 leg = ax[:legend]([d[:serieshandle] for d in args], [d[:label] for d in args], diff --git a/src/utils.jl b/src/utils.jl index 167910b4..d8880e6e 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -226,6 +226,9 @@ function with(f::Function, args...; kw...) end # save the backend + if CURRENT_BACKEND.sym == :none + pickDefaultBackend() + end oldbackend = CURRENT_BACKEND.sym for arg in args From 7566b0159c0c08a4886f55767d84b19fdb4857fa Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Fri, 25 Dec 2015 20:11:05 +0100 Subject: [PATCH 006/121] Start experimenting with GR.jl backend --- src/backends/gr.jl | 80 +++++++++++++++++++++++++++++++++++++++ src/backends/supported.jl | 73 +++++++++++++++++++++++++++++++++++ src/plotter.jl | 22 +++++++++-- 3 files changed, 172 insertions(+), 3 deletions(-) create mode 100644 src/backends/gr.jl diff --git a/src/backends/gr.jl b/src/backends/gr.jl new file mode 100644 index 00000000..5888a61f --- /dev/null +++ b/src/backends/gr.jl @@ -0,0 +1,80 @@ + +# https://github.com/jheinen/GR.jl + +function _create_plot(pkg::GRPackage; kw...) + d = Dict(kw) + GR.title(d[:title]) + GR.xlabel(d[:xlabel]) + GR.ylabel(d[:ylabel]) + Plot(nothing, pkg, 0, d, Dict[]) +end + + +function _add_series(::GRPackage, plt::Plot; kw...) + d = Dict(kw) + # TODO: add one series to the underlying package + GR.plot(d[:x], d[:y]) + push!(plt.seriesargs, d) + plt +end + +function _add_annotations{X,Y,V}(plt::Plot{GRPackage}, anns::AVec{@compat(Tuple{X,Y,V})}) + for ann in anns + # TODO: add the annotation to the plot + end +end + +# ---------------------------------------------------------------- + +function _before_update_plot(plt::Plot{GRPackage}) +end + +# TODO: override this to update plot items (title, xlabel, etc) after creation +function _update_plot(plt::Plot{GRPackage}, d::Dict) +end + +function _update_plot_pos_size(plt::PlottingObject{GRPackage}, d::Dict) +end + +# ---------------------------------------------------------------- + +# accessors for x/y data + +function Base.getindex(plt::Plot{GRPackage}, i::Int) + series = plt.o.lines[i] + series.x, series.y +end + +function Base.setindex!(plt::Plot{GRPackage}, xy::Tuple, i::Integer) + series = plt.o.lines[i] + series.x, series.y = xy + plt +end + +# ---------------------------------------------------------------- + +function _create_subplot(subplt::Subplot{GRPackage}, isbefore::Bool) + # TODO: build the underlying Subplot object. this is where you might layout the panes within a GUI window, for example +end + +function _expand_limits(lims, plt::Plot{GRPackage}, isx::Bool) + # TODO: call expand limits for each plot data +end + +function _remove_axis(plt::Plot{GRPackage}, isx::Bool) + # TODO: if plot is inner subplot, might need to remove ticks or axis labels +end + +# ---------------------------------------------------------------- + +function Base.writemime(io::IO, ::MIME"image/png", plt::PlottingObject{GRPackage}) + # TODO: write a png to io +end + +function Base.display(::PlotsDisplay, plt::Plot{GRPackage}) + # TODO: display/show the plot +end + +function Base.display(::PlotsDisplay, plt::Subplot{GRPackage}) + # TODO: display/show the subplot +end diff --git a/src/backends/supported.jl b/src/backends/supported.jl index 70253e10..2b970907 100644 --- a/src/backends/supported.jl +++ b/src/backends/supported.jl @@ -174,6 +174,79 @@ subplotSupported(::PyPlotPackage) = true +supportedArgs(::GRPackage) = [ + :annotation, + :axis, + :background_color, + :linecolor, + :color_palette, + :fillrange, + :fillcolor, + :foreground_color, + :group, + :label, + :layout, + :legend, + :linestyle, + :linetype, + :linewidth, + :markershape, + :markercolor, + :markersize, + :markerstrokewidth, + :markerstrokecolor, + # :markerstrokestyle, + :n, + :nbins, + :nc, + :nr, + # :pos, + :smooth, + # :ribbon, + :show, + :size, + :title, + :windowtitle, + :x, + :xlabel, + :xlims, + :xticks, + :y, + :ylabel, + :ylims, + :yrightlabel, + :yticks, + :xscale, + :yscale, + :xflip, + :yflip, + :z, + :zcolor, # only supported for scatter/scatter3d + :tickfont, + :guidefont, + :legendfont, + :grid, + # :surface, + :nlevels, + :fillalpha, + :linealpha, + :markeralpha, + ] +supportedAxes(::GRPackage) = _allAxes +supportedTypes(::GRPackage) = [:none, :line, :path, :steppre, :steppost, :sticks, + :scatter, :heatmap, :hexbin, :hist, :density, :bar, + :hline, :vline, :contour, :path3d, :scatter3d, :surface, :wireframe] +supportedStyles(::GRPackage) = [:auto, :solid, :dash, :dot, :dashdot] +# supportedMarkers(::GRPackage) = [:none, :auto, :rect, :ellipse, :diamond, :utriangle, :dtriangle, :cross, :xcross, :star5, :hexagon] +supportedMarkers(::GRPackage) = vcat(_allMarkers, Shape) +supportedScales(::GRPackage) = [:identity, :ln, :log2, :log10] +subplotSupported(::GRPackage) = true + + +# -------------------------------------------------------------------------------------- + + + supportedArgs(::QwtPackage) = [ :annotation, # :args, diff --git a/src/plotter.jl b/src/plotter.jl index 20176fdb..26a925ca 100644 --- a/src/plotter.jl +++ b/src/plotter.jl @@ -8,6 +8,7 @@ immutable UnicodePlotsPackage <: PlottingPackage end immutable WinstonPackage <: PlottingPackage end immutable BokehPackage <: PlottingPackage end immutable PlotlyPackage <: PlottingPackage end +immutable GRPackage <: PlottingPackage end immutable NoPackage <: PlottingPackage end typealias GadflyOrImmerse @compat(Union{GadflyPackage, ImmersePackage}) @@ -19,7 +20,8 @@ export qwt, unicodeplots, bokeh, - plotly + plotly, + gr # winston gadfly() = backend(:gadfly) @@ -29,6 +31,7 @@ qwt() = backend(:qwt) unicodeplots() = backend(:unicodeplots) bokeh() = backend(:bokeh) plotly() = backend(:plotly) +gr() = backend(:gr) # winston() = backend(:winston) backend_name(::GadflyPackage) = :gadfly @@ -38,6 +41,7 @@ backend_name(::UnicodePlotsPackage) = :unicodeplots backend_name(::QwtPackage) = :qwt backend_name(::BokehPackage) = :bokeh backend_name(::PlotlyPackage) = :plotly +backend_name(::GRPackage) = :gr backend_name(::NoPackage) = :none include("backends/supported.jl") @@ -52,6 +56,7 @@ include("backends/winston.jl") include("backends/web.jl") include("backends/bokeh.jl") include("backends/plotly.jl") +include("backends/gr.jl") # --------------------------------------------------------- @@ -71,7 +76,7 @@ subplot!(pkg::PlottingPackage, subplt::Subplot; kw...) = error("subplot!($pkg, s # --------------------------------------------------------- -const BACKENDS = [:qwt, :gadfly, :unicodeplots, :pyplot, :immerse, :bokeh, :plotly] +const BACKENDS = [:qwt, :gadfly, :unicodeplots, :pyplot, :immerse, :bokeh, :plotly, :gr] const INITIALIZED_BACKENDS = Set{Symbol}() backends() = BACKENDS @@ -85,6 +90,7 @@ function backendInstance(sym::Symbol) sym == :winston && return WinstonPackage() sym == :bokeh && return BokehPackage() sym == :plotly && return PlotlyPackage() + sym == :gr && return GRPackage() sym == :none && return NoPackage() error("Unsupported backend $sym") end @@ -99,7 +105,7 @@ CurrentBackend(sym::Symbol) = CurrentBackend(sym, backendInstance(sym)) # --------------------------------------------------------- function pickDefaultBackend() - for pkgstr in ("PyPlot", "Immerse", "Qwt", "Gadfly", "UnicodePlots", "Bokeh") + for pkgstr in ("Gr", "PyPlot", "Immerse", "Qwt", "Gadfly", "UnicodePlots", "Bokeh") if Pkg.installed(pkgstr) != nothing return backend(symbol(lowercase(pkgstr))) end @@ -234,6 +240,14 @@ function backend() rethrow(err) end + elseif currentBackendSymbol == :gr + try + @eval import GR + catch err + warn("Couldn't import GR. Install it with: Pkg.add(\"GR\").") + rethrow(err) + end + elseif currentBackendSymbol == :winston warn("Winston support is deprecated and broken. Try another backend: $BACKENDS") try @@ -281,6 +295,8 @@ function backend(modname) CURRENT_BACKEND.pkg = BokehPackage() elseif modname == :plotly CURRENT_BACKEND.pkg = PlotlyPackage() + elseif modname == :gr + CURRENT_BACKEND.pkg = GRPackage() else error("Unknown backend $modname. Choose from: $BACKENDS") end From c09545de64a0bf14efac0fb547cd86b6c2ccbdbd Mon Sep 17 00:00:00 2001 From: Sheehan Olver Date: Tue, 29 Dec 2015 15:32:49 +1100 Subject: [PATCH 007/121] Add support for levels keyword in PyPlot --- src/args.jl | 17 +++++++++-------- src/backends/pyplot.jl | 23 +++++++++++++++-------- src/backends/supported.jl | 1 + 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/args.jl b/src/args.jl index 53337b87..35ccb6c5 100644 --- a/src/args.jl +++ b/src/args.jl @@ -2,8 +2,8 @@ const _allAxes = [:auto, :left, :right] @compat const _axesAliases = Dict( - :a => :auto, - :l => :left, + :a => :auto, + :l => :left, :r => :right ) @@ -139,6 +139,7 @@ _seriesDefaults[:z] = nothing # depth for contour, surfa _seriesDefaults[:zcolor] = nothing # value for color scale # _seriesDefaults[:surface] = nothing _seriesDefaults[:nlevels] = 15 +_seriesDefaults[:levels] = nothing _seriesDefaults[:orientation] = :vertical @@ -407,7 +408,7 @@ function processLineArg(d::Dict, arg) # linetype if trueOrAllTrue(a -> get(_typeAliases, a, a) in _allTypes, arg) d[:linetype] = arg - + # linestyle elseif trueOrAllTrue(a -> get(_styleAliases, a, a) in _allStyles, arg) d[:linestyle] = arg @@ -446,7 +447,7 @@ function processMarkerArg(d::Dict, arg) d[:markershape] = arg elseif trueOrAllTrue(a -> isa(a, Shape), arg) d[:markershape] = arg - + # stroke style elseif trueOrAllTrue(a -> get(_styleAliases, a, a) in _allStyles, arg) d[:markerstrokestyle] = arg @@ -473,7 +474,7 @@ function processMarkerArg(d::Dict, arg) # markercolor elseif !handleColors!(d, arg, :markercolor) warn("Skipped marker arg $arg.") - + end end @@ -493,7 +494,7 @@ end "Handle all preprocessing of args... break out colors/sizes/etc and replace aliases." function preprocessArgs!(d::Dict) replaceAliases!(d, _keyAliases) - + # handle axis args for axisletter in ("x", "y") asym = symbol(axisletter * "axis") @@ -590,7 +591,7 @@ end function warnOnUnsupported(pkg::PlottingPackage, d::Dict) - (d[:axis] in supportedAxes(pkg) + (d[:axis] in supportedAxes(pkg) || warn("axis $(d[:axis]) is unsupported with $pkg. Choose from: $(supportedAxes(pkg))")) (d[:linetype] == :none || d[:linetype] in supportedTypes(pkg) @@ -683,7 +684,7 @@ function getSeriesArgs(pkg::PlottingPackage, plotargs::Dict, kw, commandIndex::I d[k] = kwdict[k] end end - + if haskey(_typeAliases, d[:linetype]) d[:linetype] = _typeAliases[d[:linetype]] end diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index f150c74b..46806d70 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -232,7 +232,7 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) if lt == :sticks d,_ = sticksHack(;d...) - + elseif lt in (:scatter, :scatter3d) if d[:markershape] == :none d[:markershape] = :ellipse @@ -334,13 +334,20 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) d[:serieshandle] = if ishistlike(lt) plotfunc(d[:y]; extra_kwargs...)[1] elseif lt == :contour - # NOTE: x/y are backwards in pyplot, so we switch the x and y args (also y is reversed), + # NOTE: x/y are backwards in pyplot, so we switch the x and y args (also y is reversed), # and take the transpose of the surface matrix x, y = d[:x], d[:y] surf = d[:z].surf' - handle = plotfunc(x, y, surf, d[:nlevels]; extra_kwargs...) - if d[:fillrange] != nothing - handle = ax[:contourf](x, y, surf, d[:nlevels]; cmap = getPyPlotColorMap(d[:fillcolor], d[:fillalpha])) + if d[:levels] != nothing + handle = plotfunc(x, y, surf; levels=d[:levels], extra_kwargs...) + if d[:fillrange] != nothing + handle = ax[:contourf](x, y, surf; levels=d[:levels], cmap = getPyPlotColorMap(d[:fillcolor], d[:fillalpha])) + end + else + handle = plotfunc(x, y, surf, d[:nlevels]; extra_kwargs...) + if d[:fillrange] != nothing + handle = ax[:contourf](x, y, surf, d[:nlevels]; cmap = getPyPlotColorMap(d[:fillcolor], d[:fillalpha])) + end end handle elseif lt in (:surface,:wireframe) @@ -473,7 +480,7 @@ function _update_plot(plt::Plot{PyPlotPackage}, d::Dict) ax[:set_ylabel](d[:ylabel]) end if usingRightAxis(plt) && get(d, :yrightlabel, "") != "" - rightax = getRightAxis(figorax) + rightax = getRightAxis(figorax) rightax[:set_ylabel](d[:yrightlabel]) end @@ -502,7 +509,7 @@ function _update_plot(plt::Plot{PyPlotPackage}, d::Dict) # font sizes for ax in axes # haskey(d, :yrightlabel) || continue - + # guides sz = get(d, :guidefont, plt.plotargs[:guidefont]).pointsize @@ -517,7 +524,7 @@ function _update_plot(plt::Plot{PyPlotPackage}, d::Dict) lab[:set_fontsize](sz) end end - + # grid if get(d, :grid, false) ax[:xaxis][:grid](true) diff --git a/src/backends/supported.jl b/src/backends/supported.jl index bd78b935..e474b762 100644 --- a/src/backends/supported.jl +++ b/src/backends/supported.jl @@ -155,6 +155,7 @@ supportedArgs(::PyPlotPackage) = [ :grid, # :surface, :nlevels, + :levels, :fillalpha, :linealpha, :markeralpha, From c3808c0c5b4ecfbf06ff42dd353e1d4edb2a0364 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Tue, 29 Dec 2015 20:07:44 +0100 Subject: [PATCH 008/121] gr.jl: implemented line/scatter plots --- src/backends/gr.jl | 130 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 122 insertions(+), 8 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 5888a61f..960bc8e8 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -1,19 +1,29 @@ # https://github.com/jheinen/GR.jl +fig = Dict() + +fig[:size] = [500, 500] + +@compat const gr_linetype = Dict( + :auto => 0, :solid => 1, :dash => 2, :dot => 3, :dashdot => 4, + :dashdotdot => -1 ) + +@compat const gr_markertype = Dict( + :none => 1, :ellipse => -1, :rect => -7, :diamond => -13, + :utriangle => -3, :dtriangle => -5, :pentagon => -14, + :cross => 2, :xcross => 5, :star5 => 3 ) + function _create_plot(pkg::GRPackage; kw...) + global fig d = Dict(kw) - GR.title(d[:title]) - GR.xlabel(d[:xlabel]) - GR.ylabel(d[:ylabel]) + fig[:size] = d[:size] Plot(nothing, pkg, 0, d, Dict[]) end - function _add_series(::GRPackage, plt::Plot; kw...) + global fig d = Dict(kw) - # TODO: add one series to the underlying package - GR.plot(d[:x], d[:y]) push!(plt.seriesargs, d) plt end @@ -29,11 +39,115 @@ end function _before_update_plot(plt::Plot{GRPackage}) end -# TODO: override this to update plot items (title, xlabel, etc) after creation function _update_plot(plt::Plot{GRPackage}, d::Dict) + global fig + + GR.clearws() + + mwidth, mheight, width, height = GR.inqdspsize() + w, h = fig[:size] + if w > h + ratio = float(h) / w + size = mwidth * w / width + GR.setwsviewport(0, size, 0, size * ratio) + GR.setwswindow(0, 1, 0, ratio) + viewport = [0.1, 0.95, 0.1 * ratio, 0.95 * ratio] + else + ratio = float(w) / h + size = mheight * h / height + GR.setwsviewport(0, size * ratio, 0, size) + GR.setwswindow(0, ratio, 0, 1) + viewport = [0.1 * ratio, 0.95 * ratio, 0.1, 0.95] + end + + xmin = ymin = typemax(Float64) + xmax = ymax = typemin(Float64) + for p in plt.seriesargs + x, y = p[:x], p[:y] + xmin = min(minimum(x), xmin) + xmax = max(maximum(x), xmax) + ymin = min(minimum(y), ymin) + ymax = max(maximum(y), ymax) + end + + xmin, xmax = GR.adjustlimits(xmin, xmax) + ymin, ymax = GR.adjustlimits(ymin, ymax) + majorx = 5 + xtick = GR.tick(xmin, xmax) / majorx + majory = 5 + ytick = GR.tick(ymin, ymax) / majory + + GR.setviewport(viewport[1], viewport[2], viewport[3], viewport[4]) + GR.setwindow(xmin, xmax, ymin, ymax) + + charheight = 0.03 * (viewport[4] - viewport[3]) + GR.setcharheight(charheight) + GR.grid(xtick, ytick, 0, 0, majorx, majory) + ticksize = 0.0125 * (viewport[2] - viewport[1]) + GR.axes(xtick, ytick, xmin, ymin, majorx, majory, ticksize) + GR.axes(xtick, ytick, xmax, ymax, -majorx, -majory, -ticksize) + + if haskey(d, :title) + GR.savestate() + GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_TOP) + GR.text(0.5, min(ratio, 1), d[:title]) + GR.restorestate() + end + if haskey(d, :xlabel) + GR.savestate() + GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_BOTTOM) + GR.text(0.5, 0, d[:xlabel]) + GR.restorestate() + end + if haskey(d, :ylabel) + GR.savestate() + GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_TOP) + GR.setcharup(-1, 0) + GR.text(0, 0.5 * (viewport[3] + viewport[4]), d[:ylabel]) + GR.restorestate() + end + + GR.savestate() + haskey(d, :linewidth) && GR.setlinewidth(d[:linewidth]) + haskey(d, :linestyle) && GR.setlinetype(gr_linetype[d[:linestyle]]) + haskey(d, :markersize) && GR.setmarkersize(d[:markersize]) + haskey(d, :markershape) && GR.setmarkertype(gr_markertype[d[:markershape]]) + GR.settextalign(GR.TEXT_HALIGN_LEFT, GR.TEXT_VALIGN_HALF) + + for p in plt.seriesargs + GR.uselinespec("") + if p[:linetype] == :path + GR.polyline(p[:x], p[:y]) + elseif p[:linetype] == :scatter + GR.polymarker(p[:x], p[:y]) + end + end + + px = viewport[2] - 0.15 + py = viewport[4] - 0.15 + GR.selntran(0) + for p in plt.seriesargs + GR.uselinespec("") + if p[:linetype] == :path + GR.polyline([px, px + 0.04], [py, py]) + elseif p[:linetype] == :scatter + GR.polymarker([px, px + 0.02], [py, py]) + end + GR.text(px + 0.05, py, p[:label]) + py -= 0.03 + end + GR.selntran(1) + + GR.restorestate() + + GR.updatews() end function _update_plot_pos_size(plt::PlottingObject{GRPackage}, d::Dict) + global fig + if haskey(d, :size) + fig[:size] = d[:size] + end end # ---------------------------------------------------------------- @@ -44,7 +158,7 @@ function Base.getindex(plt::Plot{GRPackage}, i::Int) series = plt.o.lines[i] series.x, series.y end - + function Base.setindex!(plt::Plot{GRPackage}, xy::Tuple, i::Integer) series = plt.o.lines[i] series.x, series.y = xy From b0b2e695e171f90936e420c62091df537c63f5ed Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Wed, 30 Dec 2015 11:52:19 +0100 Subject: [PATCH 009/121] Added support for logarithmic / flipped axes --- src/backends/gr.jl | 43 +++++++++++++++++++++++++++++++-------- src/backends/supported.jl | 5 ++--- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 960bc8e8..0b24d23b 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -22,7 +22,6 @@ function _create_plot(pkg::GRPackage; kw...) end function _add_series(::GRPackage, plt::Plot; kw...) - global fig d = Dict(kw) push!(plt.seriesargs, d) plt @@ -70,22 +69,47 @@ function _update_plot(plt::Plot{GRPackage}, d::Dict) ymax = max(maximum(y), ymax) end - xmin, xmax = GR.adjustlimits(xmin, xmax) - ymin, ymax = GR.adjustlimits(ymin, ymax) - majorx = 5 - xtick = GR.tick(xmin, xmax) / majorx - majory = 5 - ytick = GR.tick(ymin, ymax) / majory + scale = 0 + d[:xscale] == :log10 && (scale |= GR.OPTION_X_LOG) + d[:yscale] == :log10 && (scale |= GR.OPTION_Y_LOG) + get(d, :xflip, false) && (scale |= GR.OPTION_FLIP_X) + get(d, :yflip, false) && (scale |= GR.OPTION_FLIP_Y) + + if scale & GR.OPTION_X_LOG == 0 + xmin, xmax = GR.adjustlimits(xmin, xmax) + majorx = 5 + xtick = GR.tick(xmin, xmax) / majorx + else + xtick = majorx = 1 + end + if scale & GR.OPTION_Y_LOG == 0 + ymin, ymax = GR.adjustlimits(ymin, ymax) + majory = 5 + ytick = GR.tick(ymin, ymax) / majory + else + ytick = majory = 1 + end + if scale & GR.OPTION_FLIP_X == 0 + xorg = (xmin, xmax) + else + xorg = (xmax, xmin) + end + if scale & GR.OPTION_FLIP_Y == 0 + yorg = (ymin, ymax) + else + yorg = (ymax, ymin) + end GR.setviewport(viewport[1], viewport[2], viewport[3], viewport[4]) GR.setwindow(xmin, xmax, ymin, ymax) + GR.setscale(scale) charheight = 0.03 * (viewport[4] - viewport[3]) GR.setcharheight(charheight) GR.grid(xtick, ytick, 0, 0, majorx, majory) ticksize = 0.0125 * (viewport[2] - viewport[1]) - GR.axes(xtick, ytick, xmin, ymin, majorx, majory, ticksize) - GR.axes(xtick, ytick, xmax, ymax, -majorx, -majory, -ticksize) + GR.axes(xtick, ytick, xorg[1], yorg[1], majorx, majory, ticksize) + GR.axes(xtick, ytick, xorg[2], yorg[2], -majorx, -majory, -ticksize) if haskey(d, :title) GR.savestate() @@ -126,6 +150,7 @@ function _update_plot(plt::Plot{GRPackage}, d::Dict) px = viewport[2] - 0.15 py = viewport[4] - 0.15 GR.selntran(0) + GR.setscale(0) for p in plt.seriesargs GR.uselinespec("") if p[:linetype] == :path diff --git a/src/backends/supported.jl b/src/backends/supported.jl index 2b970907..256f33ca 100644 --- a/src/backends/supported.jl +++ b/src/backends/supported.jl @@ -237,9 +237,8 @@ supportedTypes(::GRPackage) = [:none, :line, :path, :steppre, :steppost, :sticks :scatter, :heatmap, :hexbin, :hist, :density, :bar, :hline, :vline, :contour, :path3d, :scatter3d, :surface, :wireframe] supportedStyles(::GRPackage) = [:auto, :solid, :dash, :dot, :dashdot] -# supportedMarkers(::GRPackage) = [:none, :auto, :rect, :ellipse, :diamond, :utriangle, :dtriangle, :cross, :xcross, :star5, :hexagon] -supportedMarkers(::GRPackage) = vcat(_allMarkers, Shape) -supportedScales(::GRPackage) = [:identity, :ln, :log2, :log10] +supportedMarkers(::GRPackage) = [:none, :ellipse, :rect, :diamond, :utriangle, :dtriangle, :pentagon, :cross, :xcross, :star5] +supportedScales(::GRPackage) = [:identity, :log10] subplotSupported(::GRPackage) = true From 6ac312bd4979c60bc89f72d5480b418238ac4bea Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Wed, 30 Dec 2015 10:13:53 -0500 Subject: [PATCH 010/121] removed nlevels keyword, now an alias to levels; cleanup --- src/args.jl | 7 +++++-- src/backends/gadfly.jl | 2 +- src/backends/plotly.jl | 2 +- src/backends/pyplot.jl | 37 +++++++++++++++++++------------------ src/backends/supported.jl | 9 ++++----- src/utils.jl | 10 ++++++++++ 6 files changed, 40 insertions(+), 27 deletions(-) diff --git a/src/args.jl b/src/args.jl index 35ccb6c5..78e3c59f 100644 --- a/src/args.jl +++ b/src/args.jl @@ -138,8 +138,8 @@ _seriesDefaults[:y] = nothing _seriesDefaults[:z] = nothing # depth for contour, surface, etc _seriesDefaults[:zcolor] = nothing # value for color scale # _seriesDefaults[:surface] = nothing -_seriesDefaults[:nlevels] = 15 -_seriesDefaults[:levels] = nothing +# _seriesDefaults[:nlevels] = 15 +_seriesDefaults[:levels] = 15 _seriesDefaults[:orientation] = :vertical @@ -284,6 +284,9 @@ end :foreground_colour => :foreground_color, :regression => :smooth, :reg => :smooth, + :nlevels => :levels, + :nlev => :levels, + :levs => :levels, :xlim => :xlims, :xlimit => :xlims, :xlimits => :xlims, diff --git a/src/backends/gadfly.jl b/src/backends/gadfly.jl index ee6beb43..84e8847e 100644 --- a/src/backends/gadfly.jl +++ b/src/backends/gadfly.jl @@ -44,7 +44,7 @@ function getLineGeom(d::Dict) elseif lt == :vline Gadfly.Geom.vline elseif lt == :contour - Gadfly.Geom.contour(levels = d[:nlevels]) + Gadfly.Geom.contour(levels = d[:levels]) else nothing end diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index 9f9482c3..00db4c62 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -292,7 +292,7 @@ function plotly_series(d::Dict; plot_index = nothing) d_out[:z] = d[:z].surf # d_out[:showscale] = d[:legend] if lt == :contour - d_out[:ncontours] = d[:nlevels] + d_out[:ncontours] = d[:levels] d_out[:contours] = Dict(:coloring => d[:fillrange] != nothing ? "fill" : "lines") end d_out[:colorscale] = plotly_colorscale(d[lt == :contour ? :linecolor : :fillcolor]) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 46806d70..bdd5af27 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -333,32 +333,33 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) # do the plot d[:serieshandle] = if ishistlike(lt) plotfunc(d[:y]; extra_kwargs...)[1] + elseif lt == :contour - # NOTE: x/y are backwards in pyplot, so we switch the x and y args (also y is reversed), - # and take the transpose of the surface matrix x, y = d[:x], d[:y] surf = d[:z].surf' - if d[:levels] != nothing - handle = plotfunc(x, y, surf; levels=d[:levels], extra_kwargs...) - if d[:fillrange] != nothing - handle = ax[:contourf](x, y, surf; levels=d[:levels], cmap = getPyPlotColorMap(d[:fillcolor], d[:fillalpha])) - end + levels = d[:levels] + if isscalar(levels) + extra_args = (levels) + elseif isvector(levels) + extra_args = () + extra_kwargs[:levels] = levels else - handle = plotfunc(x, y, surf, d[:nlevels]; extra_kwargs...) - if d[:fillrange] != nothing - handle = ax[:contourf](x, y, surf, d[:nlevels]; cmap = getPyPlotColorMap(d[:fillcolor], d[:fillalpha])) - end + error("Only numbers and vectors are supported with levels keyword") + end + handle = plotfunc(x, y, surf, extra_args...; extra_kwargs...) + if d[:fillrange] != nothing + extra_kwargs[:cmap] = getPyPlotColorMap(d[:fillcolor], d[:fillalpha]) + handle = ax[:contourf](x, y, surf, extra_args...; extra_kwargs...) end handle + elseif lt in (:surface,:wireframe) - x, y, z = if isa(d[:x], AMat) && isa(d[:y], AMat) - d[:x], d[:y], d[:z].surf - else - repmat(d[:x]',length(d[:y]),1), repmat(d[:y],1,length(d[:x])), d[:z].surf' + x, y, z = d[:x], d[:y], d[:z].surf + if !ismatrix(x) || !ismatrix(y) + x = repmat(x', length(y), 1) + y = repmat(y, 1, length(x)) + z = z' end - # x = isa(d[:x], AMat) ? d[:x] : repmat(d[:x]',length(d[:y]),1) - # y = isa(d[:y], AMat) ? d[:y] : repmat(d[:y],1,length(d[:x])) - # z = isa(d[:x], AMat) ? d[:z].surf : d[:z].surf' plotfunc(x, y, z; extra_kwargs...) elseif lt in _3dTypes plotfunc(d[:x], d[:y], d[:z]; extra_kwargs...) diff --git a/src/backends/supported.jl b/src/backends/supported.jl index e474b762..6558877c 100644 --- a/src/backends/supported.jl +++ b/src/backends/supported.jl @@ -74,7 +74,7 @@ supportedArgs(::GadflyPackage) = [ :legendfont, :grid, # :surface, - :nlevels, + :levels, ] supportedAxes(::GadflyPackage) = [:auto, :left] supportedTypes(::GadflyPackage) = [:none, :line, :path, :steppre, :steppost, :sticks, @@ -154,7 +154,6 @@ supportedArgs(::PyPlotPackage) = [ :legendfont, :grid, # :surface, - :nlevels, :levels, :fillalpha, :linealpha, @@ -414,7 +413,7 @@ supportedArgs(::BokehPackage) = [ # :legendfont, # :grid, # :surface, - # :nlevels, + # :levels, ] supportedAxes(::BokehPackage) = [:auto, :left] supportedTypes(::BokehPackage) = [:none, :path, :scatter] #,:steppre, :steppost, :sticks, :heatmap, :hexbin, :hist, :bar, :hline, :vline, :contour] @@ -480,7 +479,7 @@ supportedArgs(::PlotlyPackage) = [ :guidefont, :legendfont, :grid, - :nlevels, + :levels, ] supportedAxes(::PlotlyPackage) = [:auto, :left] supportedTypes(::PlotlyPackage) = [:none, :line, :path, :scatter, :steppre, :steppost, @@ -550,7 +549,7 @@ supportedArgs(::GLVisualizePackage) = [ # :legendfont, # :grid, # :surface - # :nlevels, + # :levels, ] supportedAxes(::GLVisualizePackage) = [:auto, :left] supportedTypes(::GLVisualizePackage) = [:contour] #, :path, :scatter ,:steppre, :steppost, :sticks, :heatmap, :hexbin, :hist, :bar, :hline, :vline, :contour] diff --git a/src/utils.jl b/src/utils.jl index d8880e6e..56b14539 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -190,6 +190,16 @@ end isijulia() = isdefined(Main, :IJulia) && Main.IJulia.inited +istuple(::Tuple) = true +istuple(::Any) = false +isvector(::AVec) = true +isvector(::Any) = false +ismatrix(::AMat) = true +ismatrix(::Any) = false +isscalar(::Real) = true +isscalar(::Any) = false + + # ticksType{T<:Real,S<:Real}(ticks::@compat(Tuple{T,S})) = :limits ticksType{T<:Real}(ticks::AVec{T}) = :ticks From cafac135a0ca2befbd9e2151485a0a8c48f3143e Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Wed, 30 Dec 2015 11:24:44 -0500 Subject: [PATCH 011/121] PyPlot fixes; test fixes --- src/backends/pyplot.jl | 17 +++++++++++------ src/components.jl | 2 ++ src/plot.jl | 2 +- src/utils.jl | 3 +++ test/imgcomp.jl | 6 +++--- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index bdd5af27..5d605cc2 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -207,6 +207,10 @@ function _create_plot(pkg::PyPlotPackage; kw...) w,h = map(px2inch, d[:size]) bgcolor = getPyPlotColor(d[:background_color]) wrap = PyPlotAxisWrapper(nothing, nothing, PyPlot.figure(; figsize = (w,h), facecolor = bgcolor, dpi = DPI, tight_layout = true), []) + + if haskey(d, :linetype) && first(d[:linetype]) in _3dTypes # && isa(plt.o, PyPlotFigWrapper) + push!(wrap.kwargs, (:projection, "3d")) + end end plt = Plot(wrap, pkg, 0, d, Dict[]) @@ -218,9 +222,9 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) d = Dict(kw) lt = d[:linetype] - if lt in _3dTypes # && isa(plt.o, PyPlotFigWrapper) - push!(plt.o.kwargs, (:projection, "3d")) - end + # if lt in _3dTypes # && isa(plt.o, PyPlotFigWrapper) + # push!(plt.o.kwargs, (:projection, "3d")) + # end ax = getAxis(plt, d[:axis]) if !(lt in supportedTypes(pkg)) @@ -249,7 +253,7 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) end - lt = d[:linetype] + # lt = d[:linetype] extra_kwargs = Dict() plotfunc = getPyPlotFunction(plt, d[:axis], lt) @@ -349,15 +353,16 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) handle = plotfunc(x, y, surf, extra_args...; extra_kwargs...) if d[:fillrange] != nothing extra_kwargs[:cmap] = getPyPlotColorMap(d[:fillcolor], d[:fillalpha]) + delete!(extra_kwargs, :linewidths) handle = ax[:contourf](x, y, surf, extra_args...; extra_kwargs...) end handle elseif lt in (:surface,:wireframe) - x, y, z = d[:x], d[:y], d[:z].surf + x, y, z = d[:x], d[:y], Array(d[:z]) if !ismatrix(x) || !ismatrix(y) x = repmat(x', length(y), 1) - y = repmat(y, 1, length(x)) + y = repmat(y, 1, length(d[:x])) z = z' end plotfunc(x, y, z; extra_kwargs...) diff --git a/src/components.jl b/src/components.jl index f1b7114b..5c4be5ba 100644 --- a/src/components.jl +++ b/src/components.jl @@ -231,6 +231,8 @@ end Surface(f::Function, x, y) = Surface(Float64[f(xi,yi) for xi in x, yi in y]) +Base.Array(surf::Surface) = surf.surf + # ----------------------------------------------------------------------- type OHLC{T<:Real} diff --git a/src/plot.jl b/src/plot.jl index db7a8c02..5eaca478 100644 --- a/src/plot.jl +++ b/src/plot.jl @@ -48,7 +48,7 @@ function plot(args...; kw...) preprocessArgs!(d) dumpdict(d, "After plot preprocessing") - plotargs = getPlotArgs(pkg, d, 1) + plotargs = merge(d, getPlotArgs(pkg, d, 1)) dumpdict(plotargs, "Plot args") plt = _create_plot(pkg; plotargs...) # create a new, blank plot diff --git a/src/utils.jl b/src/utils.jl index 56b14539..a6e65c78 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -174,7 +174,9 @@ function replaceAliases!(d::Dict, aliases::Dict) end createSegments(z) = collect(repmat(z',2,1))[2:end] + Base.first(c::Colorant) = c +Base.first(x::Symbol) = x sortedkeys(d::Dict) = sort(collect(keys(d))) @@ -201,6 +203,7 @@ isscalar(::Any) = false + # ticksType{T<:Real,S<:Real}(ticks::@compat(Tuple{T,S})) = :limits ticksType{T<:Real}(ticks::AVec{T}) = :ticks ticksType{T<:AVec,S<:AVec}(ticks::@compat(Tuple{T,S})) = :ticks_and_labels diff --git a/test/imgcomp.jl b/test/imgcomp.jl index e61e7523..b8c65878 100644 --- a/test/imgcomp.jl +++ b/test/imgcomp.jl @@ -73,7 +73,7 @@ function image_comparison_tests(pkg::Symbol, idx::Int; debug = false, popup = is # first Plots._debugMode.on = debug - example = ExamplePlots.examples[idx] + example = ExamplePlots._examples[idx] info("Testing plot: $pkg:$idx:$(example.header)") backend(pkg) backend() @@ -88,7 +88,7 @@ function image_comparison_tests(pkg::Symbol, idx::Int; debug = false, popup = is end # run the example - # map(eval, PlotExamples.examples[idx].exprs) + # map(eval, PlotExamples._examples[idx].exprs) # # save the png # tmpfn = tempname() * ".png" @@ -148,7 +148,7 @@ function image_comparison_tests(pkg::Symbol, idx::Int; debug = false, popup = is end function image_comparison_facts(pkg::Symbol; skip = [], debug = false, sigma = [1,1], eps = 1e-2) - for i in 1:length(ExamplePlots.examples) + for i in 1:length(ExamplePlots._examples) i in skip && continue @fact image_comparison_tests(pkg, i, debug=debug, sigma=sigma, eps=eps) |> success --> true end From 0caa31bd6b409e9565e6560568d319de96b621db Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Wed, 30 Dec 2015 12:02:43 -0500 Subject: [PATCH 012/121] fixes --- src/backends/pyplot.jl | 6 +++--- src/backends/supported.jl | 2 +- test/refimg/gadfly/ref13.png | Bin 117039 -> 119013 bytes test/refimg/pyplot/ref11.png | Bin 41199 -> 42755 bytes test/refimg/pyplot/ref13.png | Bin 40251 -> 39908 bytes test/runtests.jl | 2 +- 6 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 5d605cc2..f1ff784f 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -222,9 +222,9 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) d = Dict(kw) lt = d[:linetype] - # if lt in _3dTypes # && isa(plt.o, PyPlotFigWrapper) - # push!(plt.o.kwargs, (:projection, "3d")) - # end + if lt in _3dTypes && isempty(plt.o.kwargs) + push!(plt.o.kwargs, (:projection, "3d")) + end ax = getAxis(plt, d[:axis]) if !(lt in supportedTypes(pkg)) diff --git a/src/backends/supported.jl b/src/backends/supported.jl index 6558877c..04a4318e 100644 --- a/src/backends/supported.jl +++ b/src/backends/supported.jl @@ -160,7 +160,7 @@ supportedArgs(::PyPlotPackage) = [ :markeralpha, ] supportedAxes(::PyPlotPackage) = _allAxes -supportedTypes(::PyPlotPackage) = [:none, :line, :path, :steppre, :steppost, :sticks, +supportedTypes(::PyPlotPackage) = [:none, :line, :path, :steppre, :steppost, #:sticks, :scatter, :heatmap, :hexbin, :hist, :density, :bar, :hline, :vline, :contour, :path3d, :scatter3d, :surface, :wireframe] supportedStyles(::PyPlotPackage) = [:auto, :solid, :dash, :dot, :dashdot] diff --git a/test/refimg/gadfly/ref13.png b/test/refimg/gadfly/ref13.png index a3d1aecc1da1c0fdec27c90d5ed978c757412704..caf2109c07d03c7d68112b573fd3d9aa44bf3a6a 100644 GIT binary patch literal 119013 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 ZdmlmR+Y1}+Gm{|TB_$>=S|w}{^gn+qpwR#T diff --git a/test/refimg/pyplot/ref11.png b/test/refimg/pyplot/ref11.png index b6027f37885f6110e5ff69322ea7d6f586e23ceb..c7ca4373688516e3235b0a36a31567d3faf8ab9a 100644 GIT binary patch literal 42755 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 Nfv2mV%Q~loCIIUe&Qt&Z literal 40251 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 not(nothing) - image_comparison_facts(:gadfly, skip=[4,19,23,24], eps=img_eps) + image_comparison_facts(:gadfly, skip=[4,6,19,23,24], eps=img_eps) end From 0b23aa9e7ed46c2cc481c87c933aaea7b9671f57 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Wed, 30 Dec 2015 12:36:18 -0500 Subject: [PATCH 013/121] relax tests --- test/runtests.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/runtests.jl b/test/runtests.jl index d08236e0..46887353 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -30,7 +30,7 @@ default(show=false) # gadfly() # backend() -img_eps = 2e-2 +img_eps = 5e-2 facts("Gadfly") do @fact gadfly() --> Plots.GadflyPackage() @@ -56,7 +56,7 @@ end facts("PyPlot") do @fact pyplot() --> Plots.PyPlotPackage() @fact backend() --> Plots.PyPlotPackage() - image_comparison_facts(:pyplot, skip=[19,21,23], eps=img_eps) + image_comparison_facts(:pyplot, skip=[10,19,21,23], eps=img_eps) end From fd889723809ef323be46a82670b6a407e4987c13 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Fri, 1 Jan 2016 19:33:35 +0100 Subject: [PATCH 014/121] Added support for legends --- src/backends/gr.jl | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 0b24d23b..22e97a6e 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -147,24 +147,37 @@ function _update_plot(plt::Plot{GRPackage}, d::Dict) end end - px = viewport[2] - 0.15 - py = viewport[4] - 0.15 - GR.selntran(0) - GR.setscale(0) - for p in plt.seriesargs - GR.uselinespec("") - if p[:linetype] == :path - GR.polyline([px, px + 0.04], [py, py]) - elseif p[:linetype] == :scatter - GR.polymarker([px, px + 0.02], [py, py]) + if plt.plotargs[:legend] + GR.selntran(0) + GR.setscale(0) + w = 0 + for p in plt.seriesargs + tbx, tby = GR.inqtext(0, 0, p[:label]) + w = max(w, tbx[3]) end - GR.text(px + 0.05, py, p[:label]) - py -= 0.03 + px = viewport[2] - 0.05 - w + py = viewport[4] - 0.06 + GR.setfillintstyle(GR.INTSTYLE_SOLID) + GR.setfillcolorind(0) + GR.fillrect(px - 0.06, px + w + 0.02, py + 0.03, py - 0.03 * length(plt.seriesargs)) + GR.setlinecolorind(1) + GR.setlinewidth(1) + GR.drawrect(px - 0.06, px + w + 0.02, py + 0.03, py - 0.03 * length(plt.seriesargs)) + haskey(d, :linewidth) && GR.setlinewidth(d[:linewidth]) + for p in plt.seriesargs + GR.uselinespec("") + if p[:linetype] == :path + GR.polyline([px - 0.05, px - 0.01], [py, py]) + elseif p[:linetype] == :scatter + GR.polymarker([px - 0.05, px - 0.01], [py, py]) + end + GR.text(px, py, p[:label]) + py -= 0.03 + end + GR.selntran(1) end - GR.selntran(1) GR.restorestate() - GR.updatews() end From 7b71d9a44860ddc6bbcc06c1ebc6fb4d0345992c Mon Sep 17 00:00:00 2001 From: Ritchie Lee Date: Sat, 2 Jan 2016 01:36:36 -0800 Subject: [PATCH 015/121] Small API change to animations Animation constructor minor fix --- src/animation.jl | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/animation.jl b/src/animation.jl index b923cf38..5122000f 100644 --- a/src/animation.jl +++ b/src/animation.jl @@ -1,19 +1,18 @@ -immutable Animation{P<:PlottingObject} - plt::P +immutable Animation dir::ASCIIString frames::Vector{ASCIIString} end -function Animation(plt::PlottingObject) - Animation(plt, mktempdir(), ASCIIString[]) +function Animation() + tmpdir = convert(ASCIIString, mktempdir()) + Animation(tmpdir, ASCIIString[]) end -Animation() = Animation(current()) -function frame(anim::Animation) +function frame{P<:PlottingObject}(anim::Animation, plt::P=current()) i = length(anim.frames) + 1 filename = @sprintf("%06d.png", i) - png(anim.plt, joinpath(anim.dir, filename)) + png(plt, joinpath(anim.dir, filename)) push!(anim.frames, filename) end @@ -29,11 +28,11 @@ function gif(anim::Animation, fn::@compat(AbstractString) = "tmp.gif"; fps::Inte fn = abspath(fn) try - + # high quality speed = round(Int, 100 / fps) run(`convert -delay $speed -loop 0 $(anim.dir)/*.png $fn`) - + catch err warn("Tried to create gif using convert (ImageMagick), but got error: $err\nWill try ffmpeg, but it's lower quality...)") From 7acca183137ae230fbc8251fce5f322a9c68eeb2 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Sat, 2 Jan 2016 10:40:45 +0100 Subject: [PATCH 016/121] remove superfluous compat macros --- src/backends/gr.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 22e97a6e..6f1916d1 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -5,11 +5,11 @@ fig = Dict() fig[:size] = [500, 500] -@compat const gr_linetype = Dict( +const gr_linetype = Dict( :auto => 0, :solid => 1, :dash => 2, :dot => 3, :dashdot => 4, :dashdotdot => -1 ) -@compat const gr_markertype = Dict( +const gr_markertype = Dict( :none => 1, :ellipse => -1, :rect => -7, :diamond => -13, :utriangle => -3, :dtriangle => -5, :pentagon => -14, :cross => 2, :xcross => 5, :star5 => 3 ) From 5c3c5b999f87438bd6f87590e33994f609467f81 Mon Sep 17 00:00:00 2001 From: Ritchie Lee Date: Sat, 2 Jan 2016 02:06:51 -0800 Subject: [PATCH 017/121] Support for SubDataFrame by switching to AbstractDataFrame --- src/plot.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plot.jl b/src/plot.jl index 5eaca478..1408ff7e 100644 --- a/src/plot.jl +++ b/src/plot.jl @@ -461,12 +461,12 @@ end function dataframes() @eval import DataFrames - @eval function createKWargsList(plt::PlottingObject, df::DataFrames.DataFrame, args...; kw...) + @eval function createKWargsList(plt::PlottingObject, df::DataFrames.AbstractDataFrame, args...; kw...) createKWargsList(plt, args...; kw..., dataframe = df) end # expecting the column name of a dataframe that was passed in... anything else should error - @eval function extractGroupArgs(s::Symbol, df::DataFrames.DataFrame, args...) + @eval function extractGroupArgs(s::Symbol, df::DataFrames.AbstractDataFrame, args...) if haskey(df, s) return extractGroupArgs(df[s]) else From a33161aa9c43fa0a472038b5020acacac64b472d Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Sat, 2 Jan 2016 12:15:07 +0100 Subject: [PATCH 018/121] Reset default backend to PyPlot GR should NOT be the default backend until it is finished :-) --- src/plotter.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plotter.jl b/src/plotter.jl index 032e4152..6cd8bb32 100644 --- a/src/plotter.jl +++ b/src/plotter.jl @@ -112,7 +112,7 @@ CurrentBackend(sym::Symbol) = CurrentBackend(sym, backendInstance(sym)) # --------------------------------------------------------- function pickDefaultBackend() - for pkgstr in ("Gr", "PyPlot", "Immerse", "Qwt", "Gadfly", "UnicodePlots", "Bokeh", "GLVisualize") + for pkgstr in ("PyPlot", "Gr", "Immerse", "Qwt", "Gadfly", "UnicodePlots", "Bokeh", "GLVisualize") if Pkg.installed(pkgstr) != nothing return backend(symbol(lowercase(pkgstr))) end From 2b6619b3c42fd55875611d40d7075ceba83d04e8 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Sun, 3 Jan 2016 10:32:47 +0100 Subject: [PATCH 019/121] Avoid global 'fig' object --- src/backends/gr.jl | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 6f1916d1..ffbbda50 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -1,10 +1,6 @@ # https://github.com/jheinen/GR.jl -fig = Dict() - -fig[:size] = [500, 500] - const gr_linetype = Dict( :auto => 0, :solid => 1, :dash => 2, :dot => 3, :dashdot => 4, :dashdotdot => -1 ) @@ -15,10 +11,10 @@ const gr_markertype = Dict( :cross => 2, :xcross => 5, :star5 => 3 ) function _create_plot(pkg::GRPackage; kw...) - global fig d = Dict(kw) + fig = Dict() fig[:size] = d[:size] - Plot(nothing, pkg, 0, d, Dict[]) + Plot(fig, pkg, 0, d, Dict[]) end function _add_series(::GRPackage, plt::Plot; kw...) @@ -39,12 +35,10 @@ function _before_update_plot(plt::Plot{GRPackage}) end function _update_plot(plt::Plot{GRPackage}, d::Dict) - global fig - GR.clearws() mwidth, mheight, width, height = GR.inqdspsize() - w, h = fig[:size] + w, h = plt.o[:size] if w > h ratio = float(h) / w size = mwidth * w / width @@ -182,9 +176,8 @@ function _update_plot(plt::Plot{GRPackage}, d::Dict) end function _update_plot_pos_size(plt::PlottingObject{GRPackage}, d::Dict) - global fig if haskey(d, :size) - fig[:size] = d[:size] + plt.o[:size] = d[:size] end end From b3613b68cdb7093384ce0b174027a5243703a0db Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Sun, 3 Jan 2016 11:54:24 +0100 Subject: [PATCH 020/121] Moved GR calls into display method --- src/backends/gr.jl | 77 ++++++++++++++++++++++++---------------------- 1 file changed, 41 insertions(+), 36 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index ffbbda50..0b87100c 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -10,35 +10,13 @@ const gr_markertype = Dict( :utriangle => -3, :dtriangle => -5, :pentagon => -14, :cross => 2, :xcross => 5, :star5 => 3 ) -function _create_plot(pkg::GRPackage; kw...) - d = Dict(kw) - fig = Dict() - fig[:size] = d[:size] - Plot(fig, pkg, 0, d, Dict[]) -end +function gr_display(plt::Plot{GRPackage}) + d = plt.plotargs -function _add_series(::GRPackage, plt::Plot; kw...) - d = Dict(kw) - push!(plt.seriesargs, d) - plt -end - -function _add_annotations{X,Y,V}(plt::Plot{GRPackage}, anns::AVec{@compat(Tuple{X,Y,V})}) - for ann in anns - # TODO: add the annotation to the plot - end -end - -# ---------------------------------------------------------------- - -function _before_update_plot(plt::Plot{GRPackage}) -end - -function _update_plot(plt::Plot{GRPackage}, d::Dict) GR.clearws() mwidth, mheight, width, height = GR.inqdspsize() - w, h = plt.o[:size] + w, h = d[:size] if w > h ratio = float(h) / w size = mwidth * w / width @@ -63,12 +41,7 @@ function _update_plot(plt::Plot{GRPackage}, d::Dict) ymax = max(maximum(y), ymax) end - scale = 0 - d[:xscale] == :log10 && (scale |= GR.OPTION_X_LOG) - d[:yscale] == :log10 && (scale |= GR.OPTION_Y_LOG) - get(d, :xflip, false) && (scale |= GR.OPTION_FLIP_X) - get(d, :yflip, false) && (scale |= GR.OPTION_FLIP_Y) - + scale = d[:scale] if scale & GR.OPTION_X_LOG == 0 xmin, xmax = GR.adjustlimits(xmin, xmax) majorx = 5 @@ -141,7 +114,7 @@ function _update_plot(plt::Plot{GRPackage}, d::Dict) end end - if plt.plotargs[:legend] + if d[:legend] GR.selntran(0) GR.setscale(0) w = 0 @@ -175,14 +148,46 @@ function _update_plot(plt::Plot{GRPackage}, d::Dict) GR.updatews() end -function _update_plot_pos_size(plt::PlottingObject{GRPackage}, d::Dict) - if haskey(d, :size) - plt.o[:size] = d[:size] +function _create_plot(pkg::GRPackage; kw...) + d = Dict(kw) + Plot(nothing, pkg, 0, d, Dict[]) +end + +function _add_series(::GRPackage, plt::Plot; kw...) + d = Dict(kw) + push!(plt.seriesargs, d) + plt +end + +function _add_annotations{X,Y,V}(plt::Plot{GRPackage}, anns::AVec{@compat(Tuple{X,Y,V})}) + for ann in anns + # TODO: add the annotation to the plot end end # ---------------------------------------------------------------- +function _before_update_plot(plt::Plot{GRPackage}) +end + +function _update_plot(plt::Plot{GRPackage}, d::Dict) + scale = 0 + d[:xscale] == :log10 && (scale |= GR.OPTION_X_LOG) + d[:yscale] == :log10 && (scale |= GR.OPTION_Y_LOG) + get(d, :xflip, false) && (scale |= GR.OPTION_FLIP_X) + get(d, :yflip, false) && (scale |= GR.OPTION_FLIP_Y) + plt.plotargs[:scale] = scale + + for k in (:title, :xlabel, :ylabel, :linewidth, :linestyle, :markersize, :markershape) + haskey(d, k) && (plt.plotargs[k] = d[k]) + end +end + +function _update_plot_pos_size(plt::PlottingObject{GRPackage}, d::Dict) +end + +# ---------------------------------------------------------------- + # accessors for x/y data function Base.getindex(plt::Plot{GRPackage}, i::Int) @@ -217,7 +222,7 @@ function Base.writemime(io::IO, ::MIME"image/png", plt::PlottingObject{GRPackage end function Base.display(::PlotsDisplay, plt::Plot{GRPackage}) - # TODO: display/show the plot + gr_display(plt) end function Base.display(::PlotsDisplay, plt::Subplot{GRPackage}) From b6e627369b68418b1fb87108e127dc5d5e2a4821 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Sun, 3 Jan 2016 09:53:33 -0500 Subject: [PATCH 021/121] backend priority --- src/plotter.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plotter.jl b/src/plotter.jl index 6cd8bb32..016a7698 100644 --- a/src/plotter.jl +++ b/src/plotter.jl @@ -112,7 +112,7 @@ CurrentBackend(sym::Symbol) = CurrentBackend(sym, backendInstance(sym)) # --------------------------------------------------------- function pickDefaultBackend() - for pkgstr in ("PyPlot", "Gr", "Immerse", "Qwt", "Gadfly", "UnicodePlots", "Bokeh", "GLVisualize") + for pkgstr in ("PyPlot", "Immerse", "Qwt", "Gadfly", "GR", "UnicodePlots", "Bokeh", "GLVisualize") if Pkg.installed(pkgstr) != nothing return backend(symbol(lowercase(pkgstr))) end From ca866183f1f6bbc75c041afc5b6ba5c1703d040f Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Tue, 5 Jan 2016 17:01:54 +0100 Subject: [PATCH 022/121] Print TODO messages for missing features --- src/backends/gr.jl | 50 +++++++++++++++++++++++++++------------ src/backends/supported.jl | 7 +++--- 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 0b87100c..50d296b1 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -2,12 +2,12 @@ # https://github.com/jheinen/GR.jl const gr_linetype = Dict( - :auto => 0, :solid => 1, :dash => 2, :dot => 3, :dashdot => 4, + :auto => 1, :solid => 1, :dash => 2, :dot => 3, :dashdot => 4, :dashdotdot => -1 ) const gr_markertype = Dict( - :none => 1, :ellipse => -1, :rect => -7, :diamond => -13, - :utriangle => -3, :dtriangle => -5, :pentagon => -14, + :auto => 1, :ellipse => -1, :rect => -7, :diamond => -13, + :utriangle => -3, :dtriangle => -5, :pentagon => -14, :hexagon => 3, :cross => 2, :xcross => 5, :star5 => 3 ) function gr_display(plt::Plot{GRPackage}) @@ -37,8 +37,13 @@ function gr_display(plt::Plot{GRPackage}) x, y = p[:x], p[:y] xmin = min(minimum(x), xmin) xmax = max(maximum(x), xmax) - ymin = min(minimum(y), ymin) - ymax = max(maximum(y), ymax) + # catch exception for OHLC vectors + try + ymin = min(minimum(y), ymin) + ymax = max(maximum(y), ymax) + catch MethodError + ymin, ymax = 0, 1 + end end scale = d[:scale] @@ -101,16 +106,27 @@ function gr_display(plt::Plot{GRPackage}) GR.savestate() haskey(d, :linewidth) && GR.setlinewidth(d[:linewidth]) haskey(d, :linestyle) && GR.setlinetype(gr_linetype[d[:linestyle]]) - haskey(d, :markersize) && GR.setmarkersize(d[:markersize]) - haskey(d, :markershape) && GR.setmarkertype(gr_markertype[d[:markershape]]) + if haskey(d, :markersize) + typeof(d[:markersize]) <: Number && GR.setmarkersize(d[:markersize] / 4.0) + else + println("TODO: multiple marker sizes") + end + if haskey(d, :markershape) + typeof(d[:markershape]) == Symbol && GR.setmarkertype(gr_markertype[d[:markershape]]) + else + println("TODO: user-defined marker shapes") + end GR.settextalign(GR.TEXT_HALIGN_LEFT, GR.TEXT_VALIGN_HALF) + GR.uselinespec(" ") for p in plt.seriesargs GR.uselinespec("") if p[:linetype] == :path GR.polyline(p[:x], p[:y]) elseif p[:linetype] == :scatter GR.polymarker(p[:x], p[:y]) + else + println("TODO: add support for linetype $(p[:linetype])") end end @@ -131,6 +147,7 @@ function gr_display(plt::Plot{GRPackage}) GR.setlinewidth(1) GR.drawrect(px - 0.06, px + w + 0.02, py + 0.03, py - 0.03 * length(plt.seriesargs)) haskey(d, :linewidth) && GR.setlinewidth(d[:linewidth]) + GR.uselinespec(" ") for p in plt.seriesargs GR.uselinespec("") if p[:linetype] == :path @@ -155,6 +172,9 @@ end function _add_series(::GRPackage, plt::Plot; kw...) d = Dict(kw) + if d[:markershape] == :none + d[:markershape] = :ellipse + end push!(plt.seriesargs, d) plt end @@ -188,16 +208,14 @@ end # ---------------------------------------------------------------- -# accessors for x/y data - function Base.getindex(plt::Plot{GRPackage}, i::Int) - series = plt.o.lines[i] - series.x, series.y + d = plt.seriesargs[i] + d[:x], d[:y] end - + function Base.setindex!(plt::Plot{GRPackage}, xy::Tuple, i::Integer) - series = plt.o.lines[i] - series.x, series.y = xy + d = plt.seriesargs[i] + d[:x], d[:y] = xy plt end @@ -205,6 +223,7 @@ end function _create_subplot(subplt::Subplot{GRPackage}, isbefore::Bool) # TODO: build the underlying Subplot object. this is where you might layout the panes within a GUI window, for example + true end function _expand_limits(lims, plt::Plot{GRPackage}, isx::Bool) @@ -218,7 +237,8 @@ end # ---------------------------------------------------------------- function Base.writemime(io::IO, ::MIME"image/png", plt::PlottingObject{GRPackage}) - # TODO: write a png to io + isijulia() && return + println("TODO: write a png to io") end function Base.display(::PlotsDisplay, plt::Plot{GRPackage}) diff --git a/src/backends/supported.jl b/src/backends/supported.jl index 1fdea586..76b69c08 100644 --- a/src/backends/supported.jl +++ b/src/backends/supported.jl @@ -234,10 +234,11 @@ supportedArgs(::GRPackage) = [ ] supportedAxes(::GRPackage) = _allAxes supportedTypes(::GRPackage) = [:none, :line, :path, :steppre, :steppost, :sticks, - :scatter, :heatmap, :hexbin, :hist, :density, :bar, - :hline, :vline, :contour, :path3d, :scatter3d, :surface, :wireframe] + :scatter, :heatmap, :hexbin, :hist, :density, :bar, + :hline, :vline, :contour, :path3d, :scatter3d, :surface, + :wireframe, :ohlc, :pie] supportedStyles(::GRPackage) = [:auto, :solid, :dash, :dot, :dashdot] -supportedMarkers(::GRPackage) = [:none, :ellipse, :rect, :diamond, :utriangle, :dtriangle, :pentagon, :cross, :xcross, :star5] +supportedMarkers(::GRPackage) = vcat([:none, :ellipse, :rect, :diamond, :utriangle, :dtriangle, :pentagon, :hexagon, :cross, :xcross, :star5], Shape) supportedScales(::GRPackage) = [:identity, :log10] subplotSupported(::GRPackage) = true From 003d39c8cd3d31fbd1c2bec8bc5c7eba691d1cc8 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Thu, 7 Jan 2016 11:37:04 +0100 Subject: [PATCH 023/121] Added support for inline graphics (IJulia) --- src/backends/gr.jl | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 50d296b1..da55aee8 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -166,6 +166,7 @@ function gr_display(plt::Plot{GRPackage}) end function _create_plot(pkg::GRPackage; kw...) + isijulia() && GR.inline("png") d = Dict(kw) Plot(nothing, pkg, 0, d, Dict[]) end @@ -236,9 +237,10 @@ end # ---------------------------------------------------------------- -function Base.writemime(io::IO, ::MIME"image/png", plt::PlottingObject{GRPackage}) - isijulia() && return - println("TODO: write a png to io") +function Base.writemime(io::IO, m::MIME"image/png", plt::PlottingObject{GRPackage}) + gr_display(plt) + GR.emergencyclosegks() + write(io, readall("gks.png")) end function Base.display(::PlotsDisplay, plt::Plot{GRPackage}) From cb0020c6292710df12f1276f33182bc4b9fe25f0 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Thu, 7 Jan 2016 14:28:08 +0100 Subject: [PATCH 024/121] Fixed problem with uninitialized strings --- src/backends/gr.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index da55aee8..e12eda6d 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -83,19 +83,19 @@ function gr_display(plt::Plot{GRPackage}) GR.axes(xtick, ytick, xorg[1], yorg[1], majorx, majory, ticksize) GR.axes(xtick, ytick, xorg[2], yorg[2], -majorx, -majory, -ticksize) - if haskey(d, :title) + if get(d, :title, "") != "" GR.savestate() GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_TOP) GR.text(0.5, min(ratio, 1), d[:title]) GR.restorestate() end - if haskey(d, :xlabel) + if get(d, :xlabel, "") != "" GR.savestate() GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_BOTTOM) GR.text(0.5, 0, d[:xlabel]) GR.restorestate() end - if haskey(d, :ylabel) + if get(d, :ylabel, "") != "" GR.savestate() GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_TOP) GR.setcharup(-1, 0) From 2c2a36ce34387bd805a853433b7b4dc345304e36 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Fri, 8 Jan 2016 11:56:20 +0100 Subject: [PATCH 025/121] Use Plots predefined colors --- src/backends/gr.jl | 46 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index e12eda6d..9c3f09c1 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -10,6 +10,11 @@ const gr_markertype = Dict( :utriangle => -3, :dtriangle => -5, :pentagon => -14, :hexagon => 3, :cross => 2, :xcross => 5, :star5 => 3 ) +function gr_getcolorind(v) + c = getColor(v) + return convert(Int, GR.inqcolorfromrgb(c.r, c.g, c.b)) +end + function gr_display(plt::Plot{GRPackage}) d = plt.plotargs @@ -105,25 +110,21 @@ function gr_display(plt::Plot{GRPackage}) GR.savestate() haskey(d, :linewidth) && GR.setlinewidth(d[:linewidth]) - haskey(d, :linestyle) && GR.setlinetype(gr_linetype[d[:linestyle]]) if haskey(d, :markersize) typeof(d[:markersize]) <: Number && GR.setmarkersize(d[:markersize] / 4.0) else println("TODO: multiple marker sizes") end - if haskey(d, :markershape) - typeof(d[:markershape]) == Symbol && GR.setmarkertype(gr_markertype[d[:markershape]]) - else - println("TODO: user-defined marker shapes") - end GR.settextalign(GR.TEXT_HALIGN_LEFT, GR.TEXT_VALIGN_HALF) - GR.uselinespec(" ") for p in plt.seriesargs - GR.uselinespec("") if p[:linetype] == :path + haskey(p, :linecolor) && GR.setlinecolorind(gr_getcolorind(p[:linecolor])) + haskey(p, :linestyle) && GR.setlinetype(gr_linetype[p[:linestyle]]) GR.polyline(p[:x], p[:y]) elseif p[:linetype] == :scatter + haskey(p, :markercolor) && GR.setmarkercolorind(gr_getcolorind(p[:markercolor])) + haskey(p, :markershape) && GR.setmarkertype(gr_markertype[p[:markershape]]) GR.polymarker(p[:x], p[:y]) else println("TODO: add support for linetype $(p[:linetype])") @@ -134,8 +135,15 @@ function gr_display(plt::Plot{GRPackage}) GR.selntran(0) GR.setscale(0) w = 0 + i = 0 for p in plt.seriesargs - tbx, tby = GR.inqtext(0, 0, p[:label]) + if typeof(p[:label]) <: Array + i += 1 + lab = p[:label][i] + else + lab = p[:label] + end + tbx, tby = GR.inqtext(0, 0, lab) w = max(w, tbx[3]) end px = viewport[2] - 0.05 - w @@ -147,15 +155,24 @@ function gr_display(plt::Plot{GRPackage}) GR.setlinewidth(1) GR.drawrect(px - 0.06, px + w + 0.02, py + 0.03, py - 0.03 * length(plt.seriesargs)) haskey(d, :linewidth) && GR.setlinewidth(d[:linewidth]) - GR.uselinespec(" ") + i = 0 for p in plt.seriesargs - GR.uselinespec("") if p[:linetype] == :path + haskey(p, :linecolor) && GR.setlinecolorind(gr_getcolorind(p[:linecolor])) + haskey(p, :linestyle) && GR.setlinetype(gr_linetype[p[:linestyle]]) GR.polyline([px - 0.05, px - 0.01], [py, py]) elseif p[:linetype] == :scatter - GR.polymarker([px - 0.05, px - 0.01], [py, py]) + haskey(p, :markercolor) && GR.setmarkercolorind(gr_getcolorind(p[:markercolor])) + haskey(p, :markershape) && GR.setmarkertype(gr_markertype[p[:markershape]]) + GR.polymarker([px - 0.04, px - 0.02], [py, py]) end - GR.text(px, py, p[:label]) + if typeof(p[:label]) <: Array + i += 1 + lab = p[:label][i] + else + lab = p[:label] + end + GR.text(px, py, lab) py -= 0.03 end GR.selntran(1) @@ -199,7 +216,7 @@ function _update_plot(plt::Plot{GRPackage}, d::Dict) get(d, :yflip, false) && (scale |= GR.OPTION_FLIP_Y) plt.plotargs[:scale] = scale - for k in (:title, :xlabel, :ylabel, :linewidth, :linestyle, :markersize, :markershape) + for k in (:title, :xlabel, :ylabel) haskey(d, k) && (plt.plotargs[k] = d[k]) end end @@ -238,6 +255,7 @@ end # ---------------------------------------------------------------- function Base.writemime(io::IO, m::MIME"image/png", plt::PlottingObject{GRPackage}) + isijulia() || return gr_display(plt) GR.emergencyclosegks() write(io, readall("gks.png")) From 81b59f9bc974866312868a50f7d70ca634ee44dd Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Fri, 8 Jan 2016 17:08:34 +0100 Subject: [PATCH 026/121] Implemented annotations --- src/backends/gr.jl | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 9c3f09c1..30b7213b 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -10,6 +10,13 @@ const gr_markertype = Dict( :utriangle => -3, :dtriangle => -5, :pentagon => -14, :hexagon => 3, :cross => 2, :xcross => 5, :star5 => 3 ) +const gr_halign = Dict(:left => 1, :hcenter => 2, :right => 3) +const gr_valign = Dict(:top => 1, :vcenter => 3, :bottom => 5) + +const gr_font_family = Dict( + "times" => 1, "helvetica" => 5, "courier" => 9, "bookman" => 14, + "newcenturyschlbk" => 18, "avantgarde" => 22, "palatino" => 26) + function gr_getcolorind(v) c = getColor(v) return convert(Int, GR.inqcolorfromrgb(c.r, c.g, c.b)) @@ -177,8 +184,27 @@ function gr_display(plt::Plot{GRPackage}) end GR.selntran(1) end - GR.restorestate() + + if haskey(d, :anns) + GR.savestate() + for ann in d[:anns] + x, y, val = ann + x, y = GR.wctondc(x, y) + alpha = val.font.rotation + family = lowercase(val.font.family) + GR.setcharheight(0.7 * val.font.pointsize / d[:size][2]) + GR.setcharup(sin(val.font.rotation), cos(val.font.rotation)) + if haskey(gr_font_family, family) + GR.settextfontprec(100 + gr_font_family[family], GR.TEXT_PRECISION_STRING) + end + GR.settextcolorind(gr_getcolorind(val.font.color)) + GR.settextalign(gr_halign[val.font.halign], gr_valign[val.font.valign]) + GR.text(x, y, val.str) + end + GR.restorestate() + end + GR.updatews() end @@ -198,8 +224,10 @@ function _add_series(::GRPackage, plt::Plot; kw...) end function _add_annotations{X,Y,V}(plt::Plot{GRPackage}, anns::AVec{@compat(Tuple{X,Y,V})}) - for ann in anns - # TODO: add the annotation to the plot + if haskey(plt.plotargs, :anns) + append!(plt.plotargs[:anns], anns) + else + plt.plotargs[:anns] = anns end end From e5a864a760b69d0c8e2cb348bcf8992018258b24 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Sat, 9 Jan 2016 14:05:02 +0100 Subject: [PATCH 027/121] Implemented filled backgrounds --- src/backends/gr.jl | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 30b7213b..58472bd6 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -86,6 +86,13 @@ function gr_display(plt::Plot{GRPackage}) GR.setviewport(viewport[1], viewport[2], viewport[3], viewport[4]) GR.setwindow(xmin, xmax, ymin, ymax) + if haskey(d, :background_color) + GR.savestate() + GR.setfillintstyle(GR.INTSTYLE_SOLID) + GR.setfillcolorind(gr_getcolorind(d[:background_color])) + GR.fillrect(xmin, xmax, ymin, ymax) + GR.restorestate() + end GR.setscale(scale) charheight = 0.03 * (viewport[4] - viewport[3]) @@ -125,6 +132,7 @@ function gr_display(plt::Plot{GRPackage}) GR.settextalign(GR.TEXT_HALIGN_LEFT, GR.TEXT_VALIGN_HALF) for p in plt.seriesargs + #haskey(p, :fillrange) && println("TODO: fill between") if p[:linetype] == :path haskey(p, :linecolor) && GR.setlinecolorind(gr_getcolorind(p[:linecolor])) haskey(p, :linestyle) && GR.setlinetype(gr_linetype[p[:linestyle]]) From d71c3ecd8621bec3e65cedbcd0051500cf08a752 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Sun, 10 Jan 2016 19:05:16 +0100 Subject: [PATCH 028/121] Added support for multiple marker colors / sizes --- src/backends/gr.jl | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 58472bd6..0d694206 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -124,23 +124,42 @@ function gr_display(plt::Plot{GRPackage}) GR.savestate() haskey(d, :linewidth) && GR.setlinewidth(d[:linewidth]) - if haskey(d, :markersize) - typeof(d[:markersize]) <: Number && GR.setmarkersize(d[:markersize] / 4.0) - else - println("TODO: multiple marker sizes") - end GR.settextalign(GR.TEXT_HALIGN_LEFT, GR.TEXT_VALIGN_HALF) for p in plt.seriesargs - #haskey(p, :fillrange) && println("TODO: fill between") if p[:linetype] == :path + if haskey(p, :fillcolor) + GR.setfillcolorind(gr_getcolorind(p[:fillcolor])) + GR.setfillintstyle(GR.INTSTYLE_SOLID) + end haskey(p, :linecolor) && GR.setlinecolorind(gr_getcolorind(p[:linecolor])) haskey(p, :linestyle) && GR.setlinetype(gr_linetype[p[:linestyle]]) + if p[:fillrange] != nothing + GR.fillarea([p[:x][1]; p[:x]; p[:x][length(p[:x])]], [p[:fillrange]; p[:y]; p[:fillrange]]) + end GR.polyline(p[:x], p[:y]) elseif p[:linetype] == :scatter haskey(p, :markercolor) && GR.setmarkercolorind(gr_getcolorind(p[:markercolor])) haskey(p, :markershape) && GR.setmarkertype(gr_markertype[p[:markershape]]) - GR.polymarker(p[:x], p[:y]) + if haskey(d, :markersize) + if typeof(d[:markersize]) <: Number + GR.setmarkersize(d[:markersize] / 4.0) + GR.polymarker(p[:x], p[:y]) + else + c = p[:markercolor] + GR.setcolormap(GR.COLORMAP_COOLWARM) + for i = 1:length(p[:x]) + if isa(c, ColorGradient) && p[:zcolor] != nothing + ci = round(Int, 1000 + p[:zcolor][i] * 255) + GR.setmarkercolorind(ci) + end + GR.setmarkersize(d[:markersize][i] / 4.0) + GR.polymarker([p[:x][i]], [p[:y][i]]) + end + end + else + GR.polymarker(p[:x], p[:y]) + end else println("TODO: add support for linetype $(p[:linetype])") end From 3e9a47a68344d4f35228a8f487270052bb152bc7 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Mon, 11 Jan 2016 18:16:31 +0100 Subject: [PATCH 029/121] Changed default colormap --- src/backends/gr.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 0d694206..36213dc2 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -147,7 +147,7 @@ function gr_display(plt::Plot{GRPackage}) GR.polymarker(p[:x], p[:y]) else c = p[:markercolor] - GR.setcolormap(GR.COLORMAP_COOLWARM) + GR.setcolormap(-GR.COLORMAP_GLOWING) for i = 1:length(p[:x]) if isa(c, ColorGradient) && p[:zcolor] != nothing ci = round(Int, 1000 + p[:zcolor][i] * 255) From b4eb0b6b41533cec3cd682832aadbfc7998e47f3 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Tue, 12 Jan 2016 16:33:07 +0100 Subject: [PATCH 030/121] Added histogram output --- src/backends/gr.jl | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 36213dc2..b635a383 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -46,7 +46,11 @@ function gr_display(plt::Plot{GRPackage}) xmin = ymin = typemax(Float64) xmax = ymax = typemin(Float64) for p in plt.seriesargs - x, y = p[:x], p[:y] + if p[:linetype] == :hist + x, y = Base.hist(p[:y]) + else + x, y = p[:x], p[:y] + end xmin = min(minimum(x), xmin) xmax = max(maximum(x), xmax) # catch exception for OHLC vectors @@ -126,6 +130,8 @@ function gr_display(plt::Plot{GRPackage}) haskey(d, :linewidth) && GR.setlinewidth(d[:linewidth]) GR.settextalign(GR.TEXT_HALIGN_LEFT, GR.TEXT_VALIGN_HALF) + legend = false + for p in plt.seriesargs if p[:linetype] == :path if haskey(p, :fillcolor) @@ -138,6 +144,7 @@ function gr_display(plt::Plot{GRPackage}) GR.fillarea([p[:x][1]; p[:x]; p[:x][length(p[:x])]], [p[:fillrange]; p[:y]; p[:fillrange]]) end GR.polyline(p[:x], p[:y]) + legend = true elseif p[:linetype] == :scatter haskey(p, :markercolor) && GR.setmarkercolorind(gr_getcolorind(p[:markercolor])) haskey(p, :markershape) && GR.setmarkertype(gr_markertype[p[:markershape]]) @@ -160,12 +167,24 @@ function gr_display(plt::Plot{GRPackage}) else GR.polymarker(p[:x], p[:y]) end + legend = true + elseif p[:linetype] == :hist + h = Base.hist(p[:y]) + x, y = float(collect(h[1])), float(h[2]) + for i = 2:length(y) + GR.setfillcolorind(gr_getcolorind(p[:fillcolor])) + GR.setfillintstyle(GR.INTSTYLE_SOLID) + GR.fillrect(x[i-1], x[i], ymin, y[i]) + GR.setfillcolorind(1) + GR.setfillintstyle(GR.INTSTYLE_HOLLOW) + GR.fillrect(x[i-1], x[i], ymin, y[i]) + end else println("TODO: add support for linetype $(p[:linetype])") end end - if d[:legend] + if d[:legend] && legend GR.selntran(0) GR.setscale(0) w = 0 From baf33609afb66fe39136ea803e11019e99e8b7be Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Thu, 14 Jan 2016 15:50:48 +0100 Subject: [PATCH 031/121] Allow combination of lines and markers --- src/backends/gr.jl | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index b635a383..5a6c9d3d 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -6,7 +6,7 @@ const gr_linetype = Dict( :dashdotdot => -1 ) const gr_markertype = Dict( - :auto => 1, :ellipse => -1, :rect => -7, :diamond => -13, + :auto => 1, :none => 1, :ellipse => -1, :rect => -7, :diamond => -13, :utriangle => -3, :dtriangle => -5, :pentagon => -14, :hexagon => 3, :cross => 2, :xcross => 5, :star5 => 3 ) @@ -145,7 +145,8 @@ function gr_display(plt::Plot{GRPackage}) end GR.polyline(p[:x], p[:y]) legend = true - elseif p[:linetype] == :scatter + end + if p[:linetype] == :scatter || p[:markershape] != :none haskey(p, :markercolor) && GR.setmarkercolorind(gr_getcolorind(p[:markercolor])) haskey(p, :markershape) && GR.setmarkertype(gr_markertype[p[:markershape]]) if haskey(d, :markersize) @@ -179,7 +180,10 @@ function gr_display(plt::Plot{GRPackage}) GR.setfillintstyle(GR.INTSTYLE_HOLLOW) GR.fillrect(x[i-1], x[i], ymin, y[i]) end - else + elseif p[:linetype] in [:line, :steppre, :steppost, :sticks, + :heatmap, :hexbin, :density, :bar, :hline, :vline, + :contour, :path3d, :scatter3d, :surface, + :wireframe, :ohlc, :pie] println("TODO: add support for linetype $(p[:linetype])") end end @@ -204,6 +208,7 @@ function gr_display(plt::Plot{GRPackage}) GR.setfillintstyle(GR.INTSTYLE_SOLID) GR.setfillcolorind(0) GR.fillrect(px - 0.06, px + w + 0.02, py + 0.03, py - 0.03 * length(plt.seriesargs)) + GR.setlinetype(1) GR.setlinecolorind(1) GR.setlinewidth(1) GR.drawrect(px - 0.06, px + w + 0.02, py + 0.03, py - 0.03 * length(plt.seriesargs)) @@ -214,7 +219,8 @@ function gr_display(plt::Plot{GRPackage}) haskey(p, :linecolor) && GR.setlinecolorind(gr_getcolorind(p[:linecolor])) haskey(p, :linestyle) && GR.setlinetype(gr_linetype[p[:linestyle]]) GR.polyline([px - 0.05, px - 0.01], [py, py]) - elseif p[:linetype] == :scatter + end + if p[:linetype] == :scatter || p[:markershape] != :none haskey(p, :markercolor) && GR.setmarkercolorind(gr_getcolorind(p[:markercolor])) haskey(p, :markershape) && GR.setmarkertype(gr_markertype[p[:markershape]]) GR.polymarker([px - 0.04, px - 0.02], [py, py]) @@ -262,9 +268,6 @@ end function _add_series(::GRPackage, plt::Plot; kw...) d = Dict(kw) - if d[:markershape] == :none - d[:markershape] = :ellipse - end push!(plt.seriesargs, d) plt end From 054a99ca3823192ee9ed108b7043c1f59154bbe3 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Sat, 16 Jan 2016 13:23:23 +0100 Subject: [PATCH 032/121] Added horizontal/vertical linetype --- src/backends/gr.jl | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 5a6c9d3d..ccc87d47 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -180,8 +180,18 @@ function gr_display(plt::Plot{GRPackage}) GR.setfillintstyle(GR.INTSTYLE_HOLLOW) GR.fillrect(x[i-1], x[i], ymin, y[i]) end + elseif p[:linetype] in [:hline, :vline] + haskey(p, :linecolor) && GR.setlinecolorind(gr_getcolorind(p[:linecolor])) + haskey(p, :linestyle) && GR.setlinetype(gr_linetype[p[:linestyle]]) + for xy in p[:y] + if p[:linetype] == :hline + GR.polyline([xmin, xmax], [xy, xy]) + else + GR.polyline([xy, xy], [ymin, ymax]) + end + end elseif p[:linetype] in [:line, :steppre, :steppost, :sticks, - :heatmap, :hexbin, :density, :bar, :hline, :vline, + :heatmap, :hexbin, :density, :bar, :contour, :path3d, :scatter3d, :surface, :wireframe, :ohlc, :pie] println("TODO: add support for linetype $(p[:linetype])") From da9fdb356c04b5a25edc91b9874b744aa90c4f28 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Sat, 16 Jan 2016 13:53:22 +0100 Subject: [PATCH 033/121] Added support for bar plots --- src/backends/gr.jl | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index ccc87d47..76b711f8 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -46,7 +46,9 @@ function gr_display(plt::Plot{GRPackage}) xmin = ymin = typemax(Float64) xmax = ymax = typemin(Float64) for p in plt.seriesargs - if p[:linetype] == :hist + if p[:linetype] == :bar + x, y = 1:length(p[:y]), p[:y] + elseif p[:linetype] == :hist x, y = Base.hist(p[:y]) else x, y = p[:x], p[:y] @@ -169,6 +171,16 @@ function gr_display(plt::Plot{GRPackage}) GR.polymarker(p[:x], p[:y]) end legend = true + elseif p[:linetype] == :bar + y = p[:y] + for i = 1:length(y) + GR.setfillcolorind(gr_getcolorind(p[:fillcolor])) + GR.setfillintstyle(GR.INTSTYLE_SOLID) + GR.fillrect(i-0.4, i+0.4, max(0, ymin), y[i]) + GR.setfillcolorind(1) + GR.setfillintstyle(GR.INTSTYLE_HOLLOW) + GR.fillrect(i-0.4, i+0.4, max(0, ymin), y[i]) + end elseif p[:linetype] == :hist h = Base.hist(p[:y]) x, y = float(collect(h[1])), float(h[2]) @@ -191,7 +203,7 @@ function gr_display(plt::Plot{GRPackage}) end end elseif p[:linetype] in [:line, :steppre, :steppost, :sticks, - :heatmap, :hexbin, :density, :bar, + :heatmap, :hexbin, :density, :contour, :path3d, :scatter3d, :surface, :wireframe, :ohlc, :pie] println("TODO: add support for linetype $(p[:linetype])") From 2e8dd738225742403f59cce1a06c6ecf0f077d1d Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Sat, 16 Jan 2016 15:20:16 +0100 Subject: [PATCH 034/121] Added more line plots --- src/backends/gr.jl | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 76b711f8..9b643250 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -135,20 +135,46 @@ function gr_display(plt::Plot{GRPackage}) legend = false for p in plt.seriesargs + if p[:linetype] in [:path, :line, :steppre, :steppost, :sticks, :hline, :vline] + haskey(p, :linecolor) && GR.setlinecolorind(gr_getcolorind(p[:linecolor])) + haskey(p, :linestyle) && GR.setlinetype(gr_linetype[p[:linestyle]]) + end if p[:linetype] == :path if haskey(p, :fillcolor) GR.setfillcolorind(gr_getcolorind(p[:fillcolor])) GR.setfillintstyle(GR.INTSTYLE_SOLID) end - haskey(p, :linecolor) && GR.setlinecolorind(gr_getcolorind(p[:linecolor])) - haskey(p, :linestyle) && GR.setlinetype(gr_linetype[p[:linestyle]]) if p[:fillrange] != nothing GR.fillarea([p[:x][1]; p[:x]; p[:x][length(p[:x])]], [p[:fillrange]; p[:y]; p[:fillrange]]) end GR.polyline(p[:x], p[:y]) legend = true end - if p[:linetype] == :scatter || p[:markershape] != :none + if p[:linetype] == :line + GR.polyline(p[:x], p[:y]) + legend = true + elseif p[:linetype] in [:steppre, :steppost] + x = [p[:x][1]] + y = [p[:y][1]] + n = length(p[:x]) + for i = 2:n + if p[:linetype] == :steppre + x = [x; p[:x][i-1]; p[:x][i]] + y = [y; p[:y][i]; p[:y][i]] + else + x = [x; p[:x][i]; p[:x][i]] + y = [y; p[:y][i-1]; p[:y][i]] + end + end + GR.polyline(x, y) + legend = true + elseif p[:linetype] == :sticks + x, y = p[:x], p[:y] + for i = 1:length(y) + GR.polyline([x[i], x[i]], [ymin, y[i]]) + end + legend = true + elseif p[:linetype] == :scatter || p[:markershape] != :none haskey(p, :markercolor) && GR.setmarkercolorind(gr_getcolorind(p[:markercolor])) haskey(p, :markershape) && GR.setmarkertype(gr_markertype[p[:markershape]]) if haskey(d, :markersize) @@ -193,8 +219,6 @@ function gr_display(plt::Plot{GRPackage}) GR.fillrect(x[i-1], x[i], ymin, y[i]) end elseif p[:linetype] in [:hline, :vline] - haskey(p, :linecolor) && GR.setlinecolorind(gr_getcolorind(p[:linecolor])) - haskey(p, :linestyle) && GR.setlinetype(gr_linetype[p[:linestyle]]) for xy in p[:y] if p[:linetype] == :hline GR.polyline([xmin, xmax], [xy, xy]) @@ -202,8 +226,7 @@ function gr_display(plt::Plot{GRPackage}) GR.polyline([xy, xy], [ymin, ymax]) end end - elseif p[:linetype] in [:line, :steppre, :steppost, :sticks, - :heatmap, :hexbin, :density, + elseif p[:linetype] in [:heatmap, :hexbin, :density, :contour, :path3d, :scatter3d, :surface, :wireframe, :ohlc, :pie] println("TODO: add support for linetype $(p[:linetype])") @@ -237,7 +260,7 @@ function gr_display(plt::Plot{GRPackage}) haskey(d, :linewidth) && GR.setlinewidth(d[:linewidth]) i = 0 for p in plt.seriesargs - if p[:linetype] == :path + if p[:linetype] in [:path, :line, :steppre, :steppost, :sticks] haskey(p, :linecolor) && GR.setlinecolorind(gr_getcolorind(p[:linecolor])) haskey(p, :linestyle) && GR.setlinetype(gr_linetype[p[:linestyle]]) GR.polyline([px - 0.05, px - 0.01], [py, py]) From 14b856b0cf16ca973b743008dd32e4c9ad418657 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Mon, 18 Jan 2016 17:25:59 +0100 Subject: [PATCH 035/121] Added support for two y-axis scales --- src/backends/gr.jl | 175 ++++++++++++++++++++++++++++----------------- 1 file changed, 110 insertions(+), 65 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 9b643250..0ea46483 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -6,7 +6,7 @@ const gr_linetype = Dict( :dashdotdot => -1 ) const gr_markertype = Dict( - :auto => 1, :none => 1, :ellipse => -1, :rect => -7, :diamond => -13, + :auto => 1, :none => -1, :ellipse => -1, :rect => -7, :diamond => -13, :utriangle => -3, :dtriangle => -5, :pentagon => -14, :hexagon => 3, :cross => 2, :xcross => 5, :star5 => 3 ) @@ -22,6 +22,15 @@ function gr_getcolorind(v) return convert(Int, GR.inqcolorfromrgb(c.r, c.g, c.b)) end +function gr_getaxisind(p) + axis = get(p, :axis, :none) + if axis in [:none, :left] + return 1 + else + return 2 + end +end + function gr_display(plt::Plot{GRPackage}) d = plt.plotargs @@ -43,70 +52,94 @@ function gr_display(plt::Plot{GRPackage}) viewport = [0.1 * ratio, 0.95 * ratio, 0.1, 0.95] end - xmin = ymin = typemax(Float64) - xmax = ymax = typemin(Float64) - for p in plt.seriesargs - if p[:linetype] == :bar - x, y = 1:length(p[:y]), p[:y] - elseif p[:linetype] == :hist - x, y = Base.hist(p[:y]) - else - x, y = p[:x], p[:y] - end - xmin = min(minimum(x), xmin) - xmax = max(maximum(x), xmax) - # catch exception for OHLC vectors - try - ymin = min(minimum(y), ymin) - ymax = max(maximum(y), ymax) - catch MethodError - ymin, ymax = 0, 1 + extrema = zeros(2, 4) + num_axes = 1 + + for axis = 1:2 + xmin = ymin = typemax(Float64) + xmax = ymax = typemin(Float64) + for p in plt.seriesargs + if axis == gr_getaxisind(p) + if axis == 2 + num_axes = 2 + end + if p[:linetype] == :bar + x, y = 1:length(p[:y]), p[:y] + elseif p[:linetype] == :hist + x, y = Base.hist(p[:y]) + else + x, y = p[:x], p[:y] + end + xmin = min(minimum(x), xmin) + xmax = max(maximum(x), xmax) + # catch exception for OHLC vectors + try + ymin = min(minimum(y), ymin) + ymax = max(maximum(y), ymax) + catch MethodError + ymin, ymax = 0, 1 + end + end end + extrema[axis,:] = [xmin, xmax, ymin, ymax] end + if num_axes == 2 + viewport[2] -= 0.05 + end + GR.setviewport(viewport[1], viewport[2], viewport[3], viewport[4]) + scale = d[:scale] - if scale & GR.OPTION_X_LOG == 0 - xmin, xmax = GR.adjustlimits(xmin, xmax) - majorx = 5 - xtick = GR.tick(xmin, xmax) / majorx - else - xtick = majorx = 1 - end - if scale & GR.OPTION_Y_LOG == 0 - ymin, ymax = GR.adjustlimits(ymin, ymax) - majory = 5 - ytick = GR.tick(ymin, ymax) / majory - else - ytick = majory = 1 - end - if scale & GR.OPTION_FLIP_X == 0 - xorg = (xmin, xmax) - else - xorg = (xmax, xmin) - end - if scale & GR.OPTION_FLIP_Y == 0 - yorg = (ymin, ymax) - else - yorg = (ymax, ymin) - end + for axis = 1:num_axes + xmin, xmax, ymin, ymax = extrema[axis,:] + if scale & GR.OPTION_X_LOG == 0 + xmin, xmax = GR.adjustlimits(xmin, xmax) + majorx = 5 + xtick = GR.tick(xmin, xmax) / majorx + else + xtick = majorx = 1 + end + if scale & GR.OPTION_Y_LOG == 0 + ymin, ymax = GR.adjustlimits(ymin, ymax) + majory = 5 + ytick = GR.tick(ymin, ymax) / majory + else + ytick = majory = 1 + end + if scale & GR.OPTION_FLIP_X == 0 + xorg = (xmin, xmax) + else + xorg = (xmax, xmin) + end + if scale & GR.OPTION_FLIP_Y == 0 + yorg = (ymin, ymax) + else + yorg = (ymax, ymin) + end - GR.setviewport(viewport[1], viewport[2], viewport[3], viewport[4]) - GR.setwindow(xmin, xmax, ymin, ymax) - if haskey(d, :background_color) - GR.savestate() - GR.setfillintstyle(GR.INTSTYLE_SOLID) - GR.setfillcolorind(gr_getcolorind(d[:background_color])) - GR.fillrect(xmin, xmax, ymin, ymax) - GR.restorestate() - end - GR.setscale(scale) + GR.setwindow(xmin, xmax, ymin, ymax) + if axis == 1 && haskey(d, :background_color) + GR.savestate() + GR.setfillintstyle(GR.INTSTYLE_SOLID) + GR.setfillcolorind(gr_getcolorind(d[:background_color])) + GR.fillrect(xmin, xmax, ymin, ymax) + GR.restorestate() + end + GR.setscale(scale) - charheight = 0.03 * (viewport[4] - viewport[3]) - GR.setcharheight(charheight) - GR.grid(xtick, ytick, 0, 0, majorx, majory) - ticksize = 0.0125 * (viewport[2] - viewport[1]) - GR.axes(xtick, ytick, xorg[1], yorg[1], majorx, majory, ticksize) - GR.axes(xtick, ytick, xorg[2], yorg[2], -majorx, -majory, -ticksize) + charheight = 0.03 * (viewport[4] - viewport[3]) + GR.setcharheight(charheight) + GR.grid(xtick, ytick, 0, 0, majorx, majory) + ticksize = 0.0125 * (viewport[2] - viewport[1]) + if num_axes == 1 + GR.axes(xtick, ytick, xorg[1], yorg[1], majorx, majory, ticksize) + GR.axes(xtick, ytick, xorg[2], yorg[2], -majorx, -majory, -ticksize) + elseif axis == 1 + GR.axes(xtick, ytick, xorg[1], yorg[1], majorx, majory, ticksize) + else + GR.axes(xtick, ytick, xorg[2], yorg[2], -majorx, majory, -ticksize) + end + end if get(d, :title, "") != "" GR.savestate() @@ -127,6 +160,13 @@ function gr_display(plt::Plot{GRPackage}) GR.text(0, 0.5 * (viewport[3] + viewport[4]), d[:ylabel]) GR.restorestate() end + if get(d, :yrightlabel, "") != "" + GR.savestate() + GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_TOP) + GR.setcharup(1, 0) + GR.text(1, 0.5 * (viewport[3] + viewport[4]), d[:yrightlabel]) + GR.restorestate() + end GR.savestate() haskey(d, :linewidth) && GR.setlinewidth(d[:linewidth]) @@ -135,6 +175,8 @@ function gr_display(plt::Plot{GRPackage}) legend = false for p in plt.seriesargs + xmin, xmax, ymin, ymax = extrema[gr_getaxisind(p),:] + GR.setwindow(xmin, xmax, ymin, ymax) if p[:linetype] in [:path, :line, :steppre, :steppost, :sticks, :hline, :vline] haskey(p, :linecolor) && GR.setlinecolorind(gr_getcolorind(p[:linecolor])) haskey(p, :linestyle) && GR.setlinetype(gr_linetype[p[:linestyle]]) @@ -154,17 +196,20 @@ function gr_display(plt::Plot{GRPackage}) GR.polyline(p[:x], p[:y]) legend = true elseif p[:linetype] in [:steppre, :steppost] - x = [p[:x][1]] - y = [p[:y][1]] n = length(p[:x]) + x = zeros(2*n + 1) + y = zeros(2*n + 1) + x[1], y[1] = p[:x][1], p[:y][1] + j = 2 for i = 2:n if p[:linetype] == :steppre - x = [x; p[:x][i-1]; p[:x][i]] - y = [y; p[:y][i]; p[:y][i]] + x[j], x[j+1] = p[:x][i-1], p[:x][i] + y[j], y[j+1] = p[:y][i], p[:y][i] else - x = [x; p[:x][i]; p[:x][i]] - y = [y; p[:y][i-1]; p[:y][i]] + x[j], x[j+1] = p[:x][i], p[:x][i] + y[j], y[j+1] = p[:y][i-1], p[:y][i] end + j += 2 end GR.polyline(x, y) legend = true From 11e5c0aa9dae824e976fb33b8e7a0636de1ddb82 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Fri, 22 Jan 2016 13:00:30 +0100 Subject: [PATCH 036/121] Use SVG output for inline graphics (IJulia) --- src/backends/gr.jl | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 0ea46483..4a541745 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -351,7 +351,7 @@ function gr_display(plt::Plot{GRPackage}) end function _create_plot(pkg::GRPackage; kw...) - isijulia() && GR.inline("png") + isijulia() && GR.inline("svg") d = Dict(kw) Plot(nothing, pkg, 0, d, Dict[]) end @@ -422,12 +422,20 @@ end # ---------------------------------------------------------------- function Base.writemime(io::IO, m::MIME"image/png", plt::PlottingObject{GRPackage}) - isijulia() || return + ENV["GKS_WSTYPE"] = "png" gr_display(plt) GR.emergencyclosegks() write(io, readall("gks.png")) end +function Base.writemime(io::IO, m::MIME"image/svg+xml", plt::PlottingObject{GRPackage}) + isijulia() || return + ENV["GKS_WSTYPE"] = "svg" + gr_display(plt) + GR.emergencyclosegks() + write(io, readall("gks.svg")) +end + function Base.display(::PlotsDisplay, plt::Plot{GRPackage}) gr_display(plt) end From a2a578d04d158df6be5fcbd257e120f5321694de Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Fri, 22 Jan 2016 13:02:06 +0100 Subject: [PATCH 037/121] Improved representation of legends --- src/backends/gr.jl | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 4a541745..bce3553a 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -297,23 +297,27 @@ function gr_display(plt::Plot{GRPackage}) py = viewport[4] - 0.06 GR.setfillintstyle(GR.INTSTYLE_SOLID) GR.setfillcolorind(0) - GR.fillrect(px - 0.06, px + w + 0.02, py + 0.03, py - 0.03 * length(plt.seriesargs)) + GR.fillrect(px - 0.08, px + w + 0.02, py + 0.03, py - 0.03 * length(plt.seriesargs)) GR.setlinetype(1) GR.setlinecolorind(1) GR.setlinewidth(1) - GR.drawrect(px - 0.06, px + w + 0.02, py + 0.03, py - 0.03 * length(plt.seriesargs)) + GR.drawrect(px - 0.08, px + w + 0.02, py + 0.03, py - 0.03 * length(plt.seriesargs)) haskey(d, :linewidth) && GR.setlinewidth(d[:linewidth]) i = 0 for p in plt.seriesargs if p[:linetype] in [:path, :line, :steppre, :steppost, :sticks] haskey(p, :linecolor) && GR.setlinecolorind(gr_getcolorind(p[:linecolor])) haskey(p, :linestyle) && GR.setlinetype(gr_linetype[p[:linestyle]]) - GR.polyline([px - 0.05, px - 0.01], [py, py]) + GR.polyline([px - 0.07, px - 0.01], [py, py]) end if p[:linetype] == :scatter || p[:markershape] != :none haskey(p, :markercolor) && GR.setmarkercolorind(gr_getcolorind(p[:markercolor])) haskey(p, :markershape) && GR.setmarkertype(gr_markertype[p[:markershape]]) - GR.polymarker([px - 0.04, px - 0.02], [py, py]) + if p[:linetype] in [:path, :line, :steppre, :steppost, :sticks] + GR.polymarker([px - 0.06, px - 0.02], [py, py]) + else + GR.polymarker([px - 0.06, px - 0.04, px - 0.02], [py, py, py]) + end end if typeof(p[:label]) <: Array i += 1 From 125a1eb9fcd1ca7fad241ebbf7c288659b7ea152 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Mon, 25 Jan 2016 17:43:13 +0100 Subject: [PATCH 038/121] Added support for subplots and further linetypes: - heatmaps - contour plots --- src/backends/gr.jl | 91 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 74 insertions(+), 17 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index bce3553a..6c7696fd 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -31,25 +31,33 @@ function gr_getaxisind(p) end end -function gr_display(plt::Plot{GRPackage}) +function gr_display(plt::Plot{GRPackage}, clear=true, update=true, + subplot=[0, 1, 0, 1]) d = plt.plotargs - GR.clearws() + clear && GR.clearws() mwidth, mheight, width, height = GR.inqdspsize() w, h = d[:size] + viewport = zeros(4) if w > h ratio = float(h) / w - size = mwidth * w / width - GR.setwsviewport(0, size, 0, size * ratio) + msize = mwidth * w / width + GR.setwsviewport(0, msize, 0, msize * ratio) GR.setwswindow(0, 1, 0, ratio) - viewport = [0.1, 0.95, 0.1 * ratio, 0.95 * ratio] + viewport[1] = subplot[1] + 0.1 * (subplot[2] - subplot[1]) + viewport[2] = subplot[1] + 0.95 * (subplot[2] - subplot[1]) + viewport[3] = ratio * (subplot[3] + 0.1 * (subplot[4] - subplot[3])) + viewport[4] = ratio * (subplot[3] + 0.95 * (subplot[4] - subplot[3])) else ratio = float(w) / h - size = mheight * h / height - GR.setwsviewport(0, size * ratio, 0, size) + msize = mheight * h / height + GR.setwsviewport(0, msize * ratio, 0, msize) GR.setwswindow(0, ratio, 0, 1) - viewport = [0.1 * ratio, 0.95 * ratio, 0.1, 0.95] + viewport[1] = ratio * (subplot[1] + 0.1 * (subplot[2] - subplot[1])) + viewport[2] = ratio * (subplot[1] + 0.95 * (subplot[2] - subplot[1])) + viewport[3] = subplot[3] + 0.1 * (subplot[4] - subplot[3]) + viewport[4] = subplot[3] + 0.95 * (subplot[4] - subplot[3]) end extrema = zeros(2, 4) @@ -65,8 +73,18 @@ function gr_display(plt::Plot{GRPackage}) end if p[:linetype] == :bar x, y = 1:length(p[:y]), p[:y] - elseif p[:linetype] == :hist + elseif p[:linetype] in [:hist, :density] x, y = Base.hist(p[:y]) + elseif p[:linetype] in [:heatmap, :hexbin] + E = zeros(length(p[:x]),2) + E[:,1] = p[:x] + E[:,2] = p[:y] + if isa(p[:nbins], Tuple) + xbins, ybins = p[:nbins] + else + xbins = ybins = p[:nbins] + end + x, y, H = Base.hist2d(E, xbins, ybins) else x, y = p[:x], p[:y] end @@ -127,10 +145,11 @@ function gr_display(plt::Plot{GRPackage}) end GR.setscale(scale) - charheight = 0.03 * (viewport[4] - viewport[3]) + diag = sqrt((viewport[2] - viewport[1])^2 + (viewport[4] - viewport[3])^2) + charheight = max(0.018 * diag, 0.01) GR.setcharheight(charheight) + ticksize = 0.0075 * diag GR.grid(xtick, ytick, 0, 0, majorx, majory) - ticksize = 0.0125 * (viewport[2] - viewport[1]) if num_axes == 1 GR.axes(xtick, ytick, xorg[1], yorg[1], majorx, majory, ticksize) GR.axes(xtick, ytick, xorg[2], yorg[2], -majorx, -majory, -ticksize) @@ -252,7 +271,7 @@ function gr_display(plt::Plot{GRPackage}) GR.setfillintstyle(GR.INTSTYLE_HOLLOW) GR.fillrect(i-0.4, i+0.4, max(0, ymin), y[i]) end - elseif p[:linetype] == :hist + elseif p[:linetype] in [:hist, :density] h = Base.hist(p[:y]) x, y = float(collect(h[1])), float(h[2]) for i = 2:length(y) @@ -271,8 +290,31 @@ function gr_display(plt::Plot{GRPackage}) GR.polyline([xy, xy], [ymin, ymax]) end end - elseif p[:linetype] in [:heatmap, :hexbin, :density, - :contour, :path3d, :scatter3d, :surface, + elseif p[:linetype] in [:heatmap, :hexbin] + E = zeros(length(p[:x]),2) + E[:,1] = p[:x] + E[:,2] = p[:y] + if isa(p[:nbins], Tuple) + xbins, ybins = p[:nbins] + else + xbins = ybins = p[:nbins] + end + x, y, H = Base.hist2d(E, xbins, ybins) + counts = round(Int32, 1000 + 255 * H / maximum(H)) + n, m = size(counts) + GR.setcolormap(GR.COLORMAP_COOLWARM) + GR.cellarray(xmin, xmax, ymin, ymax, n, m, counts) + elseif p[:linetype] == :contour + x, y, z = p[:x], p[:y], p[:z].surf + zmin, zmax = minimum(z), maximum(z) + if typeof(p[:levels]) <: Array + h = p[:levels] + else + h = linspace(zmin, zmax, p[:levels]) + end + GR.setspace(zmin, zmax, 0, 90) + GR.contour(x, y, h, reshape(z, length(x) * length(y)), 0) + elseif p[:linetype] in [:path3d, :scatter3d, :surface, :wireframe, :ohlc, :pie] println("TODO: add support for linetype $(p[:linetype])") end @@ -351,7 +393,23 @@ function gr_display(plt::Plot{GRPackage}) GR.restorestate() end - GR.updatews() + update && GR.updatews() +end + +function gr_display(subplt::Subplot{GRPackage}) + clear = true + update = false + l = enumerate(subplt.layout) + nr = nrows(subplt.layout) + for (i, (r, c)) in l + nc = ncols(subplt.layout, r) + if i == length(l) + update = true + end + subplot = [(c-1)/nc, c/nc, 1-r/nr, 1-(r-1)/nr] + gr_display(subplt.plts[i], clear, update, subplot) + clear = false + end end function _create_plot(pkg::GRPackage; kw...) @@ -411,7 +469,6 @@ end # ---------------------------------------------------------------- function _create_subplot(subplt::Subplot{GRPackage}, isbefore::Bool) - # TODO: build the underlying Subplot object. this is where you might layout the panes within a GUI window, for example true end @@ -445,5 +502,5 @@ function Base.display(::PlotsDisplay, plt::Plot{GRPackage}) end function Base.display(::PlotsDisplay, plt::Subplot{GRPackage}) - # TODO: display/show the subplot + true end From 445d970784b14802a62e9b54e0155c3287cfec06 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Tue, 26 Jan 2016 17:33:13 +0100 Subject: [PATCH 039/121] Added color bars and surface plots --- src/backends/gr.jl | 84 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 69 insertions(+), 15 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 6c7696fd..48fcfada 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -62,6 +62,8 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, extrema = zeros(2, 4) num_axes = 1 + cmap = false + axes_2d = true for axis = 1:2 xmin = ymin = typemax(Float64) @@ -84,8 +86,15 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, else xbins = ybins = p[:nbins] end + cmap = true x, y, H = Base.hist2d(E, xbins, ybins) else + if p[:linetype] in [:contour] + cmap = true + end + if p[:linetype] in [:surface, :wireframe] + axes_2d = false + end x, y = p[:x], p[:y] end xmin = min(minimum(x), xmin) @@ -105,6 +114,13 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, if num_axes == 2 viewport[2] -= 0.05 end + if cmap + viewport[2] -= 0.1 + end + if !axes_2d + viewport[1] += 0.1 + viewport[2] -= 0.1 + end GR.setviewport(viewport[1], viewport[2], viewport[3], viewport[4]) scale = d[:scale] @@ -145,18 +161,20 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end GR.setscale(scale) - diag = sqrt((viewport[2] - viewport[1])^2 + (viewport[4] - viewport[3])^2) - charheight = max(0.018 * diag, 0.01) - GR.setcharheight(charheight) - ticksize = 0.0075 * diag - GR.grid(xtick, ytick, 0, 0, majorx, majory) - if num_axes == 1 - GR.axes(xtick, ytick, xorg[1], yorg[1], majorx, majory, ticksize) - GR.axes(xtick, ytick, xorg[2], yorg[2], -majorx, -majory, -ticksize) - elseif axis == 1 - GR.axes(xtick, ytick, xorg[1], yorg[1], majorx, majory, ticksize) - else - GR.axes(xtick, ytick, xorg[2], yorg[2], -majorx, majory, -ticksize) + if axes_2d + diag = sqrt((viewport[2] - viewport[1])^2 + (viewport[4] - viewport[3])^2) + charheight = max(0.018 * diag, 0.01) + GR.setcharheight(charheight) + ticksize = 0.0075 * diag + GR.grid(xtick, ytick, 0, 0, majorx, majory) + if num_axes == 1 + GR.axes(xtick, ytick, xorg[1], yorg[1], majorx, majory, ticksize) + GR.axes(xtick, ytick, xorg[2], yorg[2], -majorx, -majory, -ticksize) + elseif axis == 1 + GR.axes(xtick, ytick, xorg[1], yorg[1], majorx, majory, ticksize) + else + GR.axes(xtick, ytick, xorg[2], yorg[2], -majorx, majory, -ticksize) + end end end @@ -304,6 +322,13 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, n, m = size(counts) GR.setcolormap(GR.COLORMAP_COOLWARM) GR.cellarray(xmin, xmax, ymin, ymax, n, m, counts) + GR.setviewport(viewport[2] + 0.02, viewport[2] + 0.05, + viewport[3], viewport[4]) + GR.setspace(0, maximum(counts), 0, 90) + diag = sqrt((viewport[2] - viewport[1])^2 + (viewport[4] - viewport[3])^2) + charheight = max(0.016 * diag, 0.01) + GR.setcharheight(charheight) + GR.colormap() elseif p[:linetype] == :contour x, y, z = p[:x], p[:y], p[:z].surf zmin, zmax = minimum(z), maximum(z) @@ -313,9 +338,38 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, h = linspace(zmin, zmax, p[:levels]) end GR.setspace(zmin, zmax, 0, 90) - GR.contour(x, y, h, reshape(z, length(x) * length(y)), 0) - elseif p[:linetype] in [:path3d, :scatter3d, :surface, - :wireframe, :ohlc, :pie] + GR.setcolormap(GR.COLORMAP_COOLWARM) + GR.contour(x, y, h, reshape(z, length(x) * length(y)), 1000) + GR.setviewport(viewport[2] + 0.02, viewport[2] + 0.05, + viewport[3], viewport[4]) + l = round(Int32, 1000 + (h - minimum(h)) / (maximum(h) - minimum(h)) * 255) + GR.setwindow(xmin, xmax, zmin, zmax) + GR.cellarray(xmin, xmax, zmax, zmin, 1, length(l), l) + ztick = 0.5 * GR.tick(zmin, zmax) + diag = sqrt((viewport[2] - viewport[1])^2 + (viewport[4] - viewport[3])^2) + charheight = max(0.016 * diag, 0.01) + GR.setcharheight(charheight) + GR.axes(0, ztick, xmax, zmin, 0, 1, 0.005) + elseif p[:linetype] in [:surface, :wrireframe] + x, y, z = p[:x], p[:y], p[:z].surf + zmin, zmax = minimum(z), maximum(z) + GR.setspace(zmin, zmax, 40, 70) + xtick = GR.tick(xmin, xmax) + ytick = GR.tick(ymin, ymax) + ztick = GR.tick(zmin, zmax) + diag = sqrt((viewport[2] - viewport[1])^2 + (viewport[4] - viewport[3])^2) + charheight = max(0.018 * diag, 0.01) + ticksize = 0.01 * (viewport[2] - viewport[1]) + GR.setcharheight(charheight) + if p[:linetype] == wireframe + option = GR.OPTION_MESH + else + option = GR.OPTION_COLORED_MESH + end + GR.gr3.surface(x, y, reshape(z, length(x) * length(y)), option) + GR.axes3d(xtick, 0, ztick, xmin, ymin, zmin, 1, 0, 1, -ticksize) + GR.axes3d(0, ytick, 0, xmax, ymin, zmin, 0, 1, 0, ticksize) + elseif p[:linetype] in [:path3d, :scatter3d, :ohlc, :pie] println("TODO: add support for linetype $(p[:linetype])") end end From 0c8cd74e2802ee870e57307da3b5ca16f7241d7c Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Tue, 26 Jan 2016 20:49:10 +0100 Subject: [PATCH 040/121] Improved surface output --- src/backends/gr.jl | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 48fcfada..cd5c68a5 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -89,7 +89,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, cmap = true x, y, H = Base.hist2d(E, xbins, ybins) else - if p[:linetype] in [:contour] + if p[:linetype] in [:contour, :surface] cmap = true end if p[:linetype] in [:surface, :wireframe] @@ -111,16 +111,12 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, extrema[axis,:] = [xmin, xmax, ymin, ymax] end - if num_axes == 2 + if num_axes == 2 || !axes_2d viewport[2] -= 0.05 end if cmap viewport[2] -= 0.1 end - if !axes_2d - viewport[1] += 0.1 - viewport[2] -= 0.1 - end GR.setviewport(viewport[1], viewport[2], viewport[3], viewport[4]) scale = d[:scale] @@ -352,23 +348,29 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, GR.axes(0, ztick, xmax, zmin, 0, 1, 0.005) elseif p[:linetype] in [:surface, :wrireframe] x, y, z = p[:x], p[:y], p[:z].surf - zmin, zmax = minimum(z), maximum(z) + zmin, zmax = GR.adjustrange(minimum(z), maximum(z)) GR.setspace(zmin, zmax, 40, 70) - xtick = GR.tick(xmin, xmax) - ytick = GR.tick(ymin, ymax) - ztick = GR.tick(zmin, zmax) + xtick = GR.tick(xmin, xmax) / 2 + ytick = GR.tick(ymin, ymax) / 2 + ztick = GR.tick(zmin, zmax) / 2 diag = sqrt((viewport[2] - viewport[1])^2 + (viewport[4] - viewport[3])^2) charheight = max(0.018 * diag, 0.01) ticksize = 0.01 * (viewport[2] - viewport[1]) GR.setcharheight(charheight) - if p[:linetype] == wireframe - option = GR.OPTION_MESH + GR.grid3d(xtick, 0, ztick, xmin, ymin, zmin, 2, 0, 2) + GR.grid3d(0, ytick, 0, xmax, ymin, zmin, 0, 2, 0) + GR.setcolormap(GR.COLORMAP_COOLWARM) + z = reshape(z, length(x) * length(y)) + if p[:linetype] == :surface + GR.gr3.surface(x, y, z, GR.OPTION_COLORED_MESH) else - option = GR.OPTION_COLORED_MESH + GR.surface(x, y, z, GR.OPTION_MESH) end - GR.gr3.surface(x, y, reshape(z, length(x) * length(y)), option) - GR.axes3d(xtick, 0, ztick, xmin, ymin, zmin, 1, 0, 1, -ticksize) - GR.axes3d(0, ytick, 0, xmax, ymin, zmin, 0, 1, 0, ticksize) + GR.axes3d(xtick, 0, ztick, xmin, ymin, zmin, 2, 0, 2, -ticksize) + GR.axes3d(0, ytick, 0, xmax, ymin, zmin, 0, 2, 0, ticksize) + GR.setviewport(viewport[2] + 0.07, viewport[2] + 0.1, + viewport[3], viewport[4]) + GR.colormap() elseif p[:linetype] in [:path3d, :scatter3d, :ohlc, :pie] println("TODO: add support for linetype $(p[:linetype])") end From 87b050fad2e51aadc775d872ff6b1a29d1597999 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Wed, 27 Jan 2016 16:26:57 +0100 Subject: [PATCH 041/121] Added path3d and scatter3d functions --- src/backends/gr.jl | 46 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index cd5c68a5..0009a35c 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -92,7 +92,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, if p[:linetype] in [:contour, :surface] cmap = true end - if p[:linetype] in [:surface, :wireframe] + if p[:linetype] in [:surface, :wireframe, :path3d, :scatter3d] axes_2d = false end x, y = p[:x], p[:y] @@ -252,7 +252,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, GR.polyline([x[i], x[i]], [ymin, y[i]]) end legend = true - elseif p[:linetype] == :scatter || p[:markershape] != :none + elseif p[:linetype] == :scatter || (p[:markershape] != :none && axes_2d) haskey(p, :markercolor) && GR.setmarkercolorind(gr_getcolorind(p[:markercolor])) haskey(p, :markershape) && GR.setmarkertype(gr_markertype[p[:markershape]]) if haskey(d, :markersize) @@ -346,7 +346,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, charheight = max(0.016 * diag, 0.01) GR.setcharheight(charheight) GR.axes(0, ztick, xmax, zmin, 0, 1, 0.005) - elseif p[:linetype] in [:surface, :wrireframe] + elseif p[:linetype] in [:surface, :wireframe] x, y, z = p[:x], p[:y], p[:z].surf zmin, zmax = GR.adjustrange(minimum(z), maximum(z)) GR.setspace(zmin, zmax, 40, 70) @@ -359,19 +359,47 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, GR.setcharheight(charheight) GR.grid3d(xtick, 0, ztick, xmin, ymin, zmin, 2, 0, 2) GR.grid3d(0, ytick, 0, xmax, ymin, zmin, 0, 2, 0) - GR.setcolormap(GR.COLORMAP_COOLWARM) z = reshape(z, length(x) * length(y)) if p[:linetype] == :surface + GR.setcolormap(GR.COLORMAP_COOLWARM) GR.gr3.surface(x, y, z, GR.OPTION_COLORED_MESH) else - GR.surface(x, y, z, GR.OPTION_MESH) + GR.setfillcolorind(0) + GR.surface(x, y, z, GR.OPTION_FILLED_MESH) end GR.axes3d(xtick, 0, ztick, xmin, ymin, zmin, 2, 0, 2, -ticksize) GR.axes3d(0, ytick, 0, xmax, ymin, zmin, 0, 2, 0, ticksize) - GR.setviewport(viewport[2] + 0.07, viewport[2] + 0.1, - viewport[3], viewport[4]) - GR.colormap() - elseif p[:linetype] in [:path3d, :scatter3d, :ohlc, :pie] + if cmap + GR.setviewport(viewport[2] + 0.07, viewport[2] + 0.1, + viewport[3], viewport[4]) + GR.colormap() + end + elseif p[:linetype] in [:path3d, :scatter3d] + x, y, z = p[:x], p[:y], p[:z] + zmin, zmax = GR.adjustrange(minimum(z), maximum(z)) + GR.setspace(zmin, zmax, 40, 70) + xtick = GR.tick(xmin, xmax) / 2 + ytick = GR.tick(ymin, ymax) / 2 + ztick = GR.tick(zmin, zmax) / 2 + diag = sqrt((viewport[2] - viewport[1])^2 + (viewport[4] - viewport[3])^2) + charheight = max(0.018 * diag, 0.01) + ticksize = 0.01 * (viewport[2] - viewport[1]) + GR.setcharheight(charheight) + GR.grid3d(xtick, 0, ztick, xmin, ymin, zmin, 2, 0, 2) + GR.grid3d(0, ytick, 0, xmax, ymin, zmin, 0, 2, 0) + if p[:linetype] == :scatter3d + haskey(p, :markercolor) && GR.setmarkercolorind(gr_getcolorind(p[:markercolor])) + haskey(p, :markershape) && GR.setmarkertype(gr_markertype[p[:markershape]]) + for i = 1:length(z) + px, py = GR.wc3towc(x[i], y[i], z[i]) + GR.polymarker([px], [py]) + end + else + GR.polyline3d(x, y, z) + end + GR.axes3d(xtick, 0, ztick, xmin, ymin, zmin, 2, 0, 2, -ticksize) + GR.axes3d(0, ytick, 0, xmax, ymin, zmin, 0, 2, 0, ticksize) + elseif p[:linetype] in [:ohlc, :pie] println("TODO: add support for linetype $(p[:linetype])") end end From 5ea9e8a0d7faec3a41a201624608aa1bbbc5977a Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Thu, 28 Jan 2016 13:29:19 +0100 Subject: [PATCH 042/121] Added support for OHLC charts --- src/backends/gr.jl | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 0009a35c..92adb84d 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -75,6 +75,8 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end if p[:linetype] == :bar x, y = 1:length(p[:y]), p[:y] + elseif p[:linetype] == :ohlc + x, y = 1:size(p[:y], 1), p[:y] elseif p[:linetype] in [:hist, :density] x, y = Base.hist(p[:y]) elseif p[:linetype] in [:heatmap, :hexbin] @@ -99,12 +101,14 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end xmin = min(minimum(x), xmin) xmax = max(maximum(x), xmax) - # catch exception for OHLC vectors - try + if p[:linetype] == :ohlc + for val in y + ymin = min(val.open, val.high, val.low, val.close, ymin) + ymax = max(val.open, val.high, val.low, val.close, ymax) + end + else ymin = min(minimum(y), ymin) ymax = max(maximum(y), ymax) - catch MethodError - ymin, ymax = 0, 1 end end end @@ -210,7 +214,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, for p in plt.seriesargs xmin, xmax, ymin, ymax = extrema[gr_getaxisind(p),:] GR.setwindow(xmin, xmax, ymin, ymax) - if p[:linetype] in [:path, :line, :steppre, :steppost, :sticks, :hline, :vline] + if p[:linetype] in [:path, :line, :steppre, :steppost, :sticks, :hline, :vline, :ohlc] haskey(p, :linecolor) && GR.setlinecolorind(gr_getcolorind(p[:linecolor])) haskey(p, :linestyle) && GR.setlinetype(gr_linetype[p[:linestyle]]) end @@ -399,7 +403,16 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end GR.axes3d(xtick, 0, ztick, xmin, ymin, zmin, 2, 0, 2, -ticksize) GR.axes3d(0, ytick, 0, xmax, ymin, zmin, 0, 2, 0, ticksize) - elseif p[:linetype] in [:ohlc, :pie] + elseif p[:linetype] == :ohlc + y = p[:y] + n = size(y, 1) + ticksize = 0.5 * (xmax - xmin) / n + for i in 1:n + GR.polyline([i-ticksize, i], [y[i].open, y[i].open]) + GR.polyline([i, i], [y[i].low, y[i].high]) + GR.polyline([i, i+ticksize], [y[i].close, y[i].close]) + end + elseif p[:linetype] in [:pie] println("TODO: add support for linetype $(p[:linetype])") end end From 72e8e10bd68259b8dfd98f71c3b235e9debbac9b Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Thu, 28 Jan 2016 18:26:56 +0100 Subject: [PATCH 043/121] Improved graphics state handling --- src/backends/gr.jl | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 92adb84d..c4010d45 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -163,6 +163,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, if axes_2d diag = sqrt((viewport[2] - viewport[1])^2 + (viewport[4] - viewport[3])^2) + GR.setlinewidth(1) charheight = max(0.018 * diag, 0.01) GR.setcharheight(charheight) ticksize = 0.0075 * diag @@ -205,18 +206,16 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, GR.restorestate() end - GR.savestate() - haskey(d, :linewidth) && GR.setlinewidth(d[:linewidth]) - GR.settextalign(GR.TEXT_HALIGN_LEFT, GR.TEXT_VALIGN_HALF) - legend = false for p in plt.seriesargs + GR.savestate() xmin, xmax, ymin, ymax = extrema[gr_getaxisind(p),:] GR.setwindow(xmin, xmax, ymin, ymax) if p[:linetype] in [:path, :line, :steppre, :steppost, :sticks, :hline, :vline, :ohlc] - haskey(p, :linecolor) && GR.setlinecolorind(gr_getcolorind(p[:linecolor])) haskey(p, :linestyle) && GR.setlinetype(gr_linetype[p[:linestyle]]) + haskey(p, :linewidth) && GR.setlinewidth(p[:linewidth]) + haskey(p, :linecolor) && GR.setlinecolorind(gr_getcolorind(p[:linecolor])) end if p[:linetype] == :path if haskey(p, :fillcolor) @@ -360,9 +359,11 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, diag = sqrt((viewport[2] - viewport[1])^2 + (viewport[4] - viewport[3])^2) charheight = max(0.018 * diag, 0.01) ticksize = 0.01 * (viewport[2] - viewport[1]) - GR.setcharheight(charheight) + GR.savestate() + GR.setlinewidth(1) GR.grid3d(xtick, 0, ztick, xmin, ymin, zmin, 2, 0, 2) GR.grid3d(0, ytick, 0, xmax, ymin, zmin, 0, 2, 0) + GR.restorestate() z = reshape(z, length(x) * length(y)) if p[:linetype] == :surface GR.setcolormap(GR.COLORMAP_COOLWARM) @@ -371,6 +372,8 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, GR.setfillcolorind(0) GR.surface(x, y, z, GR.OPTION_FILLED_MESH) end + GR.setlinewidth(1) + GR.setcharheight(charheight) GR.axes3d(xtick, 0, ztick, xmin, ymin, zmin, 2, 0, 2, -ticksize) GR.axes3d(0, ytick, 0, xmax, ymin, zmin, 0, 2, 0, ticksize) if cmap @@ -388,9 +391,11 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, diag = sqrt((viewport[2] - viewport[1])^2 + (viewport[4] - viewport[3])^2) charheight = max(0.018 * diag, 0.01) ticksize = 0.01 * (viewport[2] - viewport[1]) - GR.setcharheight(charheight) + GR.savestate() + GR.setlinewidth(1) GR.grid3d(xtick, 0, ztick, xmin, ymin, zmin, 2, 0, 2) GR.grid3d(0, ytick, 0, xmax, ymin, zmin, 0, 2, 0) + GR.restorestate() if p[:linetype] == :scatter3d haskey(p, :markercolor) && GR.setmarkercolorind(gr_getcolorind(p[:markercolor])) haskey(p, :markershape) && GR.setmarkertype(gr_markertype[p[:markershape]]) @@ -399,8 +404,11 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, GR.polymarker([px], [py]) end else + haskey(p, :linewidth) && GR.setlinewidth(p[:linewidth]) GR.polyline3d(x, y, z) end + GR.setlinewidth(1) + GR.setcharheight(charheight) GR.axes3d(xtick, 0, ztick, xmin, ymin, zmin, 2, 0, 2, -ticksize) GR.axes3d(0, ytick, 0, xmax, ymin, zmin, 0, 2, 0, ticksize) elseif p[:linetype] == :ohlc @@ -415,9 +423,11 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, elseif p[:linetype] in [:pie] println("TODO: add support for linetype $(p[:linetype])") end + GR.restorestate() end if d[:legend] && legend + GR.savestate() GR.selntran(0) GR.setscale(0) w = 0 @@ -464,12 +474,13 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, else lab = p[:label] end + GR.settextalign(GR.TEXT_HALIGN_LEFT, GR.TEXT_VALIGN_HALF) GR.text(px, py, lab) py -= 0.03 end GR.selntran(1) + GR.restorestate() end - GR.restorestate() if haskey(d, :anns) GR.savestate() From f7babcc1d242378009a43ae07e5f9f5e606bd363 Mon Sep 17 00:00:00 2001 From: Christof Stocker Date: Fri, 29 Jan 2016 02:06:22 +0100 Subject: [PATCH 044/121] fix unicodeplots compat --- src/backends/unicodeplots.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backends/unicodeplots.jl b/src/backends/unicodeplots.jl index a85b4ff5..23c0d591 100644 --- a/src/backends/unicodeplots.jl +++ b/src/backends/unicodeplots.jl @@ -91,13 +91,13 @@ function addUnicodeSeries!(o, d::Dict, addlegend::Bool, xlim, ylim) else error("Linestyle $lt not supported by UnicodePlots") end - + # get the series data and label x, y = [collect(float(d[s])) for s in (:x, :y)] label = addlegend ? d[:label] : "" # if we happen to pass in allowed color symbols, great... otherwise let UnicodePlots decide - color = d[:linecolor] in UnicodePlots.autoColors ? d[:linecolor] : :auto + color = d[:linecolor] in UnicodePlots.color_cycle ? d[:linecolor] : :auto # add the series func(o, x, y; color = color, name = label, style = stepstyle) From d5797054fb65fc49532c28fa167f021639c7bb53 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Fri, 29 Jan 2016 17:21:25 -0500 Subject: [PATCH 045/121] ColorGradient fixes; allow default keywords in backend calls --- src/backends/pyplot.jl | 4 +++- src/colors.jl | 24 +++++++++++++++--------- src/plotter.jl | 20 ++++++++++---------- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index f1ff784f..5621bf31 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -12,7 +12,9 @@ getPyPlotColor(c, α=nothing) = getPyPlotColor(convertColor(c, α)) function getPyPlotColorMap(c::ColorGradient, α=nothing) # c = ColorGradient(c.colors, c.values, alpha=α) # pycolors.pymember("LinearSegmentedColormap")[:from_list]("tmp", map(getPyPlotColor, getColorVector(c))) - pyvals = [(c.values[i], getPyPlotColor(c.colors[i], α)) for i in 1:length(c.colors)] + # pyvals = [(c.values[i], getPyPlotColor(c.colors[i], α)) for i in 1:length(c.colors)] + pyvals = [(v, getPyPlotColor(getColorZ(c, v), α)) for v in c.values] + # @show c α pyvals pycolors.pymember("LinearSegmentedColormap")[:from_list]("tmp", pyvals) end diff --git a/src/colors.jl b/src/colors.jl index 4e5a9195..dae296d4 100644 --- a/src/colors.jl +++ b/src/colors.jl @@ -75,28 +75,34 @@ immutable ColorGradient <: ColorScheme colors::Vector{Colorant} values::Vector{Float64} - function ColorGradient{T<:Colorant,S<:Real}(cs::AVec{T}, vals::AVec{S} = 0:1; alpha = nothing) + function ColorGradient{T<:Colorant,S<:Real}(cs::AVec{T}, vals::AVec{S} = linspace(0, 1, length(cs)); alpha = nothing) if length(cs) == length(vals) return new(convertColor(cs,alpha), collect(vals)) end - # otherwise interpolate evenly between the minval and maxval - minval, maxval = minimum(vals), maximum(vals) - vs = Float64[interpolate(minval, maxval, w) for w in linspace(0, 1, length(cs))] - new(convertColor(cs,alpha), vs) + # # otherwise interpolate evenly between the minval and maxval + # minval, maxval = minimum(vals), maximum(vals) + # vs = Float64[interpolate(minval, maxval, w) for w in linspace(0, 1, length(cs))] + # new(convertColor(cs,alpha), vs) + + # interpolate the colors for each value + grad = ColorGradient(cs) + cs = [getColorZ(grad, z) for z in linspace(0, 1, length(vals))] + new(convertColor(cs, alpha), collect(vals)) #collect(linspace(0, 1, length(cs)))) end end # create a gradient from a symbol (blues, reds, etc) and vector of boundary values -function ColorGradient{T<:Real}(s::Symbol, vals::AVec{T} = 0:1; kw...) +function ColorGradient{T<:Real}(s::Symbol, vals::AVec{T} = 0:0; kw...) haskey(_gradients, s) || error("Invalid gradient symbol. Choose from: ", sort(collect(keys(_gradients)))) - - # if we passed in the right number of values, create the gradient directly cs = _gradients[s] + if vals == 0:0 + vals = linspace(0, 1, length(cs)) + end ColorGradient(cs, vals; kw...) end -function ColorGradient{T<:Real}(cs::AVec{Symbol}, vals::AVec{T} = 0:1; kw...) +function ColorGradient{T<:Real}(cs::AVec{Symbol}, vals::AVec{T} = linspace(0, 1, length(cs)); kw...) ColorGradient(map(convertColor, cs), vals; kw...) end diff --git a/src/plotter.jl b/src/plotter.jl index 016a7698..da50d1bb 100644 --- a/src/plotter.jl +++ b/src/plotter.jl @@ -26,16 +26,16 @@ export glvisualize # winston -gadfly() = backend(:gadfly) -immerse() = backend(:immerse) -pyplot() = backend(:pyplot) -qwt() = backend(:qwt) -unicodeplots() = backend(:unicodeplots) -bokeh() = backend(:bokeh) -plotly() = backend(:plotly) -gr() = backend(:gr) -glvisualize() = backend(:glvisualize) -# winston() = backend(:winston) +gadfly(; kw...) = (default(; kw...); backend(:gadfly)) +immerse(; kw...) = (default(; kw...); backend(:immerse)) +pyplot(; kw...) = (default(; kw...); backend(:pyplot)) +qwt(; kw...) = (default(; kw...); backend(:qwt)) +unicodeplots(; kw...) = (default(; kw...); backend(:unicodeplots)) +bokeh(; kw...) = (default(; kw...); backend(:bokeh)) +plotly(; kw...) = (default(; kw...); backend(:plotly)) +gr(; kw...) = (default(; kw...); backend(:gr)) +glvisualize(; kw...) = (default(; kw...); backend(:glvisualize)) +# winston(; kw...) = (default(; kw...); backend(:winston)) backend_name(::GadflyPackage) = :gadfly backend_name(::ImmersePackage) = :immerse From b3ebccab3650dfc738fb6a305f4b917c81a1fb69 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Sat, 30 Jan 2016 10:03:19 -0500 Subject: [PATCH 046/121] gradient fixes --- src/colors.jl | 3 ++- src/utils.jl | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/colors.jl b/src/colors.jl index dae296d4..dc703a84 100644 --- a/src/colors.jl +++ b/src/colors.jl @@ -86,9 +86,10 @@ immutable ColorGradient <: ColorScheme # new(convertColor(cs,alpha), vs) # interpolate the colors for each value + vals = merge(linspace(0, 1, length(cs)), vals) grad = ColorGradient(cs) cs = [getColorZ(grad, z) for z in linspace(0, 1, length(vals))] - new(convertColor(cs, alpha), collect(vals)) #collect(linspace(0, 1, length(cs)))) + new(convertColor(cs, alpha), vals) end end diff --git a/src/utils.jl b/src/utils.jl index a6e65c78..68f20583 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -217,6 +217,7 @@ limsType(lims) = :invalid Base.convert{T<:Real}(::Type{Vector{T}}, rng::Range{T}) = T[x for x in rng] Base.convert{T<:Real,S<:Real}(::Type{Vector{T}}, rng::Range{S}) = T[x for x in rng] +Base.merge(a::AbstractVector, b::AbstractVector) = sort(unique(vcat(a,b))) # --------------------------------------------------------------- From b1c9d0a0afcabd8cd89be9bd89cfc8945a33b430 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Tue, 2 Feb 2016 10:49:33 -0500 Subject: [PATCH 047/121] gadfly hist in legend --- src/backends/gadfly.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backends/gadfly.jl b/src/backends/gadfly.jl index 84e8847e..7fd43b5d 100644 --- a/src/backends/gadfly.jl +++ b/src/backends/gadfly.jl @@ -299,7 +299,7 @@ function addGadflySeries!(plt::Plot, d::Dict) prepend!(layers, addGadflyMarker!(plt, length(gplt.layers), d, plt.plotargs, smooth...)) end - lt in (:hist, :heatmap, :hexbin, :contour) || addToGadflyLegend(plt, d) + lt in (:heatmap, :hexbin, :contour) || addToGadflyLegend(plt, d) # now save the layers that apply to this series d[:gadflylayers] = layers From 3f42e9c5bd845184734dae8418b544af7d5b7954 Mon Sep 17 00:00:00 2001 From: Patrick Kofod Mogensen Date: Tue, 2 Feb 2016 22:02:31 +0100 Subject: [PATCH 048/121] Add abline! which creates a straight line according to the formula b+a*x, and export abline! Also add utility functions xmin(plt::Plot) and xmax(plt::Plot). --- src/Plots.jl | 1 + src/recipes.jl | 6 ++++++ src/utils.jl | 6 ++++++ 3 files changed, 13 insertions(+) diff --git a/src/Plots.jl b/src/Plots.jl index feca5ce9..5dcd596d 100644 --- a/src/Plots.jl +++ b/src/Plots.jl @@ -59,6 +59,7 @@ export path3d!, scatter3d, scatter3d!, + abline!, title!, xlabel!, diff --git a/src/recipes.jl b/src/recipes.jl index 44ba5d85..45309c12 100644 --- a/src/recipes.jl +++ b/src/recipes.jl @@ -130,3 +130,9 @@ function spy{T<:Real}(y::AMat{T}; kw...) heatmap(J, I; leg=false, yflip=true, nbins=size(y), kw...) end +"Adds a+bx... straight line over the current plot" +function abline!(plt::Plot, a, b; kw...) + plot!(plt, [xmin(plt), xmax(plt)], x -> b + a*x; kw...) +end + +abline!(args...; kw...) = abline!(current(), args...; kw...) diff --git a/src/utils.jl b/src/utils.jl index 68f20583..bf97febd 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -465,3 +465,9 @@ mm2inch(mm::Real) = float(mm / MM_PER_INCH) px2mm(px::Real) = float(px * MM_PER_PX) mm2px(mm::Real) = float(px / MM_PER_PX) + +"Smallest x in plot" +xmin(plt::Plot) = minimum([minimum(d[:x]) for d in plt.seriesargs]) +"Largest x in plot" +xmax(plt::Plot) = maximum([maximum(d[:x]) for d in plt.seriesargs]) + From 5c4526725b6a2037abe54ddfc32a216a4d49d777 Mon Sep 17 00:00:00 2001 From: Patrick Kofod Mogensen Date: Wed, 3 Feb 2016 10:32:58 +0100 Subject: [PATCH 049/121] Remove trailing spaces. --- src/utils.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/utils.jl b/src/utils.jl index bf97febd..576f4970 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -246,7 +246,7 @@ function with(f::Function, args...; kw...) oldbackend = CURRENT_BACKEND.sym for arg in args - + # change backend? if arg in backends() backend(arg) @@ -421,10 +421,10 @@ function supportGraph(allvals, func) push!(x, string(b)) push!(y, string(val)) end - end + end end n = length(vals) - + scatter(x,y, m=:rect, ms=10, From 1963fe208e1aa1cba6ddb961cf1dc86e6103c43f Mon Sep 17 00:00:00 2001 From: Patrick Kofod Mogensen Date: Wed, 3 Feb 2016 10:35:36 +0100 Subject: [PATCH 050/121] Added an extrema(plt) which return the tuple (xmin, xmax), and changed abline! to use extrema. --- src/recipes.jl | 4 ++-- src/utils.jl | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/recipes.jl b/src/recipes.jl index 45309c12..adf59872 100644 --- a/src/recipes.jl +++ b/src/recipes.jl @@ -132,7 +132,7 @@ end "Adds a+bx... straight line over the current plot" function abline!(plt::Plot, a, b; kw...) - plot!(plt, [xmin(plt), xmax(plt)], x -> b + a*x; kw...) + plot!(plt, [extrema(plt)...], x -> b + a*x; kw...) end -abline!(args...; kw...) = abline!(current(), args...; kw...) +abline!(args...; kw...) = abline!(current(), args...; kw...) \ No newline at end of file diff --git a/src/utils.jl b/src/utils.jl index 576f4970..90431042 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -471,3 +471,5 @@ xmin(plt::Plot) = minimum([minimum(d[:x]) for d in plt.seriesargs]) "Largest x in plot" xmax(plt::Plot) = maximum([maximum(d[:x]) for d in plt.seriesargs]) +"Extrema of x-values in plot" +Base.extrema(plt::Plot) = (xmin(plt), xmax(plt)) \ No newline at end of file From 863ad22b484a8b919de8233c6df1933ad948e260 Mon Sep 17 00:00:00 2001 From: Spencer Lyon Date: Mon, 11 Jan 2016 16:59:56 -0700 Subject: [PATCH 051/121] added writemime methods for plotly_blink --- src/backends/plotly_blink.jl | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/backends/plotly_blink.jl b/src/backends/plotly_blink.jl index c5f5a6f5..a461d445 100644 --- a/src/backends/plotly_blink.jl +++ b/src/backends/plotly_blink.jl @@ -44,5 +44,10 @@ function Base.display(::PlotsDisplay, plt::Plot{PlotlyPackage}) end function Base.display(::PlotsDisplay, plt::Subplot{PlotlyPackage}) - error() + error() +end + +for (mime, fmt) in PlotlyJS._mimeformats + @eval Base.writemime(io::IO, m::MIME{symbol($mime)}, p::Plot{PlotlyPackage}) = + writemime(io, m, p.o) end From a37a23bcfc50537943367d315ca8a9485a6798f9 Mon Sep 17 00:00:00 2001 From: Spencer Lyon Date: Thu, 21 Jan 2016 09:57:22 -0500 Subject: [PATCH 052/121] PlotlyJS blink backend working --- src/backends/plotly.jl | 40 ++++++++++++++++++------------------ src/backends/plotly_blink.jl | 17 +++++++-------- src/plotter.jl | 10 ++++----- 3 files changed, 34 insertions(+), 33 deletions(-) diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index 00db4c62..aa1141cb 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -4,7 +4,7 @@ # --------------------------------------------------------------------------- function _create_plot(pkg::PlotlyPackage; kw...) - d = Dict(kw) + d = Dict{Symbol,Any}(kw) # TODO: create the window/canvas/context that is the plot within the backend (call it `o`) # TODO: initialize the plot... title, xlabel, bgcolor, etc Plot(nothing, pkg, 0, d, Dict[]) @@ -12,7 +12,7 @@ end function _add_series(::PlotlyPackage, plt::Plot; kw...) - d = Dict(kw) + d = Dict{Symbol,Any}(kw) # TODO: add one series to the underlying package push!(plt.seriesargs, d) plt @@ -83,7 +83,7 @@ end # _plotDefaults[:yflip] = false function plotlyfont(font::Font, color = font.color) - Dict( + Dict{Symbol,Any}( :family => font.family, :size => round(Int, font.pointsize*1.4), :color => webcolor(color), @@ -91,7 +91,7 @@ function plotlyfont(font::Font, color = font.color) end function get_annotation_dict(x, y, val::Union{AbstractString,Symbol}) - Dict( + Dict{Symbol,Any}( :text => val, :xref => "x", :x => x, @@ -102,7 +102,7 @@ function get_annotation_dict(x, y, val::Union{AbstractString,Symbol}) end function get_annotation_dict(x, y, ptxt::PlotText) - merge(get_annotation_dict(x, y, ptxt.str), Dict( + merge(get_annotation_dict(x, y, ptxt.str), Dict{Symbol,Any}( :font => plotlyfont(ptxt.font), :xanchor => ptxt.font.halign == :hcenter ? :center : ptxt.font.halign, :yanchor => ptxt.font.valign == :vcenter ? :middle : ptxt.font.valign, @@ -127,7 +127,7 @@ scalesym(isx::Bool) = symbol((isx ? "x" : "y") * "scale") labelsym(isx::Bool) = symbol((isx ? "x" : "y") * "label") function plotlyaxis(d::Dict, isx::Bool) - ax = Dict( + ax = Dict{Symbol,Any}( :title => d[labelsym(isx)], :showgrid => d[:grid], :zeroline => false, @@ -179,7 +179,7 @@ end # function get_plot_json(plt::Plot{PlotlyPackage}) # d = plt.plotargs function plotly_layout(d::Dict) - d_out = Dict() + d_out = Dict{Symbol,Any}() bgcolor = webcolor(d[:background_color]) fgcolor = webcolor(d[:foreground_color]) @@ -187,10 +187,10 @@ function plotly_layout(d::Dict) # set the fields for the plot d_out[:title] = d[:title] d_out[:titlefont] = plotlyfont(d[:guidefont], fgcolor) - d_out[:margin] = Dict(:l=>35, :b=>30, :r=>8, :t=>20) + d_out[:margin] = Dict{Symbol,Any}(:l=>35, :b=>30, :r=>8, :t=>20) d_out[:plot_bgcolor] = bgcolor d_out[:paper_bgcolor] = bgcolor - + # TODO: x/y axis tick values/labels d_out[:xaxis] = plotlyaxis(d, true) d_out[:yaxis] = plotlyaxis(d, false) @@ -198,7 +198,7 @@ function plotly_layout(d::Dict) # legend d_out[:showlegend] = d[:legend] if d[:legend] - d_out[:legend] = Dict( + d_out[:legend] = Dict{Symbol,Any}( :bgcolor => bgcolor, :bordercolor => fgcolor, :font => plotlyfont(d[:legendfont]), @@ -224,7 +224,7 @@ function plotly_colorscale(grad::ColorGradient) end plotly_colorscale(c) = plotly_colorscale(ColorGradient(:bluesreds)) -const _plotly_markers = Dict( +const _plotly_markers = Dict{Symbol,Any}( :rect => "square", :xcross => "x", :utriangle => "triangle-up", @@ -236,7 +236,7 @@ const _plotly_markers = Dict( # get a dictionary representing the series params (d is the Plots-dict, d_out is the Plotly-dict) function plotly_series(d::Dict; plot_index = nothing) - d_out = Dict() + d_out = Dict{Symbol,Any}() x, y = collect(d[:x]), collect(d[:y]) d_out[:name] = d[:label] @@ -293,7 +293,7 @@ function plotly_series(d::Dict; plot_index = nothing) # d_out[:showscale] = d[:legend] if lt == :contour d_out[:ncontours] = d[:levels] - d_out[:contours] = Dict(:coloring => d[:fillrange] != nothing ? "fill" : "lines") + d_out[:contours] = Dict{Symbol,Any}(:coloring => d[:fillrange] != nothing ? "fill" : "lines") end d_out[:colorscale] = plotly_colorscale(d[lt == :contour ? :linecolor : :fillcolor]) @@ -315,17 +315,17 @@ function plotly_series(d::Dict; plot_index = nothing) else warn("Plotly: linetype $lt isn't supported.") - return Dict() + return Dict{Symbol,Any}() end # add "marker" if hasmarker - d_out[:marker] = Dict( + d_out[:marker] = Dict{Symbol,Any}( :symbol => get(_plotly_markers, d[:markershape], string(d[:markershape])), :opacity => d[:markeralpha], :size => 2 * d[:markersize], :color => webcolor(d[:markercolor], d[:markeralpha]), - :line => Dict( + :line => Dict{Symbol,Any}( :color => webcolor(d[:markerstrokecolor], d[:markerstrokealpha]), :width => d[:markerstrokewidth], ), @@ -338,7 +338,7 @@ function plotly_series(d::Dict; plot_index = nothing) # add "line" if hasline - d_out[:line] = Dict( + d_out[:line] = Dict{Symbol,Any}( :color => webcolor(d[:linecolor], d[:linealpha]), :width => d[:linewidth], :shape => if lt == :steppre @@ -405,10 +405,10 @@ function html_body(subplt::Subplot{PlotlyPackage}) html = ["
"] nr = nrows(subplt.layout) ph = h / nr - + for r in 1:nr push!(html, "
") - + nc = ncols(subplt.layout, r) pw = w / nc @@ -416,7 +416,7 @@ function html_body(subplt::Subplot{PlotlyPackage}) plt = subplt[r,c] push!(html, html_body(plt, "float:left; width:$(pw)px; height:$(ph)px;")) end - + push!(html, "
") end push!(html, "
") diff --git a/src/backends/plotly_blink.jl b/src/backends/plotly_blink.jl index a461d445..2c7abed9 100644 --- a/src/backends/plotly_blink.jl +++ b/src/backends/plotly_blink.jl @@ -1,13 +1,13 @@ -# override some methods to use Plotlyjs/Blink +# override some methods to use PlotlyJS/Blink -import Plotlyjs +import PlotlyJS function _create_plot(pkg::PlotlyPackage; kw...) d = Dict(kw) # TODO: create the window/canvas/context that is the plot within the backend (call it `o`) # TODO: initialize the plot... title, xlabel, bgcolor, etc - o = Plotlyjs.Plot() + o = PlotlyJS.Plot() Plot(o, pkg, 0, d, Dict[]) end @@ -18,10 +18,11 @@ function _add_series(::PlotlyPackage, plt::Plot; kw...) # add to the data array pdict = plotly_series(d) - gt = Plotlyjs.GenericTrace(pdict[:type], pdict) + typ = pop!(pdict, :type) + gt = PlotlyJS.GenericTrace(typ; pdict...) push!(plt.o.data, gt) if !isnull(plt.o.window) - Plotlyjs.addtraces!(plt.o, gt) + PlotlyJS.addtraces!(plt.o, gt) end push!(plt.seriesargs, d) @@ -31,16 +32,16 @@ end # TODO: override this to update plot items (title, xlabel, etc) after creation function _update_plot(plt::Plot{PlotlyPackage}, d::Dict) pdict = plotly_layout(d) - plt.o.layout = Plotlyjs.Layout(pdict) + plt.o.layout = PlotlyJS.Layout(pdict) if !isnull(plt.o.window) - Plotlyjs.relayout!(plt.o, pdict...) + PlotlyJS.relayout!(plt.o; pdict...) end end function Base.display(::PlotsDisplay, plt::Plot{PlotlyPackage}) dump(plt.o) - show(plt.o) + display(plt.o) end function Base.display(::PlotsDisplay, plt::Subplot{PlotlyPackage}) diff --git a/src/plotter.jl b/src/plotter.jl index da50d1bb..ebf3295e 100644 --- a/src/plotter.jl +++ b/src/plotter.jl @@ -241,11 +241,11 @@ function backend() # end borrowing (thanks :) ########################### - # try - # include(joinpath(Pkg.dir("Plots"), "src", "backends", "plotly_blink.jl")) - # catch err - # warn("Error including Plotlyjs: $err\n Note: Will fall back to built-in display.") - # end + try + include(joinpath(Pkg.dir("Plots"), "src", "backends", "plotly_blink.jl")) + catch err + warn("Error including PlotlyJS: $err\n Note: Will fall back to built-in display.") + end end catch err From 94c87d436f6390948984d0e1a414eb278669143d Mon Sep 17 00:00:00 2001 From: Josh Day Date: Wed, 3 Feb 2016 12:47:48 -0500 Subject: [PATCH 053/121] Update plot.jl --- src/plot.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plot.jl b/src/plot.jl index 1408ff7e..8a1d1433 100644 --- a/src/plot.jl +++ b/src/plot.jl @@ -413,7 +413,7 @@ function createKWargsList(plt::PlottingObject, x::AVec, y::AVec, surf::Surface; end function createKWargsList(plt::PlottingObject, f::FuncOrFuncs; kw...) - error("Can't pass a Function or Vector{Function} for y without also passing x") + createKWargsList(plt, f, xmin(plt), xmax(plt); kw...) end # list of functions From c62d8d67535eabdae943f0dd2aea6074900ae95a Mon Sep 17 00:00:00 2001 From: Spencer Lyon Date: Wed, 3 Feb 2016 14:16:55 -0500 Subject: [PATCH 054/121] fix change in checking if plotly_blink window is active --- src/backends/plotly_blink.jl | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/backends/plotly_blink.jl b/src/backends/plotly_blink.jl index 2c7abed9..414376c0 100644 --- a/src/backends/plotly_blink.jl +++ b/src/backends/plotly_blink.jl @@ -7,7 +7,8 @@ function _create_plot(pkg::PlotlyPackage; kw...) d = Dict(kw) # TODO: create the window/canvas/context that is the plot within the backend (call it `o`) # TODO: initialize the plot... title, xlabel, bgcolor, etc - o = PlotlyJS.Plot() + o = PlotlyJS.Plot(PlotlyJS.GenericTrace[], PlotlyJS.Layout(), + Base.Random.uuid4(), PlotlyJS.ElectronDisplay()) Plot(o, pkg, 0, d, Dict[]) end @@ -21,7 +22,7 @@ function _add_series(::PlotlyPackage, plt::Plot; kw...) typ = pop!(pdict, :type) gt = PlotlyJS.GenericTrace(typ; pdict...) push!(plt.o.data, gt) - if !isnull(plt.o.window) + if PlotlyJS.isactive(plt.o._display) PlotlyJS.addtraces!(plt.o, gt) end @@ -33,7 +34,7 @@ end function _update_plot(plt::Plot{PlotlyPackage}, d::Dict) pdict = plotly_layout(d) plt.o.layout = PlotlyJS.Layout(pdict) - if !isnull(plt.o.window) + if PlotlyJS.isactive(plt.o._display) PlotlyJS.relayout!(plt.o; pdict...) end end From d38803660181cf38efb7ca06171ad38f4803abe8 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Thu, 4 Feb 2016 12:29:56 -0500 Subject: [PATCH 055/121] major overhaul to backend definition and initialization; added pgfplots template; some new reference images --- src/Plots.jl | 9 ++- src/backends/bokeh.jl | 8 +++ src/backends/gadfly.jl | 13 +++- src/backends/glvisualize.jl | 7 +++ src/backends/gr.jl | 9 +++ src/backends/immerse.jl | 7 +++ src/backends/pgfplots.jl | 107 +++++++++++++++++++++++++++++++ src/backends/plotly.jl | 35 +++++++++++ src/backends/pyplot.jl | 29 ++++++++- src/backends/qwt.jl | 6 ++ src/backends/template.jl | 15 +++-- src/backends/unicodeplots.jl | 7 +++ src/backends/winston.jl | 7 +++ src/plotter.jl | 10 +-- src/plotter2.jl | 119 +++++++++++++++++++++++++++++++++++ src/subplot.jl | 2 +- src/utils.jl | 2 +- test/refimg/gadfly/ref13.png | Bin 119013 -> 119621 bytes test/refimg/gadfly/ref15.png | Bin 10257 -> 11887 bytes test/refimg/pyplot/ref13.png | Bin 39908 -> 39963 bytes 20 files changed, 373 insertions(+), 19 deletions(-) create mode 100644 src/backends/pgfplots.jl create mode 100644 src/plotter2.jl diff --git a/src/Plots.jl b/src/Plots.jl index 5dcd596d..5c85dad6 100644 --- a/src/Plots.jl +++ b/src/Plots.jl @@ -18,8 +18,6 @@ export plot, plot!, - # plot_display, - # plot_display!, subplot, subplot!, @@ -57,6 +55,8 @@ export wireframe!, path3d, path3d!, + plot3d, + plot3d!, scatter3d, scatter3d!, abline!, @@ -80,6 +80,7 @@ export backend, backends, + backend_name, aliases, dataframes, @@ -132,7 +133,7 @@ include("types.jl") include("utils.jl") include("colors.jl") include("components.jl") -include("plotter.jl") +include("plotter2.jl") include("args.jl") include("plot.jl") include("subplot.jl") @@ -173,6 +174,8 @@ wireframe(args...; kw...) = plot(args...; kw..., linetype = :wireframe) wireframe!(args...; kw...) = plot!(args...; kw..., linetype = :wireframe) path3d(args...; kw...) = plot(args...; kw..., linetype = :path3d) path3d!(args...; kw...) = plot!(args...; kw..., linetype = :path3d) +plot3d(args...; kw...) = plot(args...; kw..., linetype = :path3d) +plot3d!(args...; kw...) = plot!(args...; kw..., linetype = :path3d) scatter3d(args...; kw...) = plot(args...; kw..., linetype = :scatter3d) scatter3d!(args...; kw...) = plot!(args...; kw..., linetype = :scatter3d) diff --git a/src/backends/bokeh.jl b/src/backends/bokeh.jl index c6b678df..72b899c5 100644 --- a/src/backends/bokeh.jl +++ b/src/backends/bokeh.jl @@ -1,6 +1,14 @@ # https://github.com/bokeh/Bokeh.jl + +function _initialize_backend(::BokehPackage; kw...) + @eval begin + import Bokeh + export Bokeh + end +end + # make255(x) = round(Int, 255 * x) # function bokehcolor(c::Colorant) diff --git a/src/backends/gadfly.jl b/src/backends/gadfly.jl index 7fd43b5d..4a72205e 100644 --- a/src/backends/gadfly.jl +++ b/src/backends/gadfly.jl @@ -1,6 +1,15 @@ # https://github.com/dcjones/Gadfly.jl + +function _initialize_backend(::GadflyPackage; kw...) + @eval begin + import Gadfly, Compose + export Gadfly, Compose + include(joinpath(Pkg.dir("Plots"), "src", "backends", "gadfly_shapes.jl")) + end +end + # --------------------------------------------------------------------------- # immutable MissingVec <: AbstractVector{Float64} end @@ -656,7 +665,7 @@ setGadflyDisplaySize(subplt::Subplot) = setGadflyDisplaySize(getplotargs(subplt, # ------------------------------------------------------------------------- -function dowritemime{P<:GadflyOrImmerse}(io::IO, func, plt::PlottingObject{P}) +function dowritemime{P<:Union{GadflyPackage,ImmersePackage}}(io::IO, func, plt::PlottingObject{P}) gplt = getGadflyContext(plt) setGadflyDisplaySize(plt) Gadfly.draw(func(io, Compose.default_graphic_width, Compose.default_graphic_height), gplt) @@ -671,7 +680,7 @@ getGadflyWriteFunc(::MIME"application/x-tex") = Gadfly.PGF getGadflyWriteFunc(m::MIME) = error("Unsupported in Gadfly/Immerse: ", m) for mime in (MIME"image/png", MIME"image/svg+xml", MIME"application/pdf", MIME"application/postscript", MIME"application/x-tex") - @eval function Base.writemime{P<:GadflyOrImmerse}(io::IO, ::$mime, plt::PlottingObject{P}) + @eval function Base.writemime{P<:Union{GadflyPackage,ImmersePackage}}(io::IO, ::$mime, plt::PlottingObject{P}) func = getGadflyWriteFunc($mime()) dowritemime(io, func, plt) end diff --git a/src/backends/glvisualize.jl b/src/backends/glvisualize.jl index 10c59756..ec11607c 100644 --- a/src/backends/glvisualize.jl +++ b/src/backends/glvisualize.jl @@ -2,6 +2,13 @@ # [WEBSITE] +function _initialize_backend(::GLVisualizePackage; kw...) + @eval begin + import GLVisualize + export GLVisualize + end +end + # --------------------------------------------------------------------------- immutable GLScreenWrapper diff --git a/src/backends/gr.jl b/src/backends/gr.jl index c4010d45..3b1488b2 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -1,6 +1,15 @@ # https://github.com/jheinen/GR.jl + +function _initialize_backend(::GRPackage; kw...) + @eval begin + import GR + export GR + end +end + + const gr_linetype = Dict( :auto => 1, :solid => 1, :dash => 2, :dot => 3, :dashdot => 4, :dashdotdot => -1 ) diff --git a/src/backends/immerse.jl b/src/backends/immerse.jl index ee199f8e..3eb6cfba 100644 --- a/src/backends/immerse.jl +++ b/src/backends/immerse.jl @@ -1,6 +1,13 @@ # https://github.com/JuliaGraphics/Immerse.jl +function _initialize_backend(::ImmersePackage; kw...) + @eval begin + import Immerse, Gadfly, Compose, Gtk + export Immerse, Gadfly, Compose, Gtk + include(joinpath(Pkg.dir("Plots"), "src", "backends", "gadfly_shapes.jl")) + end +end function createImmerseFigure(d::Dict) w,h = d[:size] diff --git a/src/backends/pgfplots.jl b/src/backends/pgfplots.jl new file mode 100644 index 00000000..f76cb33b --- /dev/null +++ b/src/backends/pgfplots.jl @@ -0,0 +1,107 @@ + +# https://github.com/sisl/PGFPlots.jl + +function _initialize_backend(::PGFPlotsPackage; kw...) + @eval begin + import PGFPlots + export PGFPlots + # TODO: other initialization that needs to be eval-ed + end + # TODO: other initialization +end + +# --------------------------------------------------------------------------- + +function _create_plot(pkg::PGFPlotsPackage; kw...) + d = Dict{Symbol,Any}(kw) + # TODO: create the window/canvas/context that is the plot within the backend (call it `o`) + # TODO: initialize the plot... title, xlabel, bgcolor, etc + Plot(nothing, pkg, 0, d, Dict[]) +end + + +function _add_series(::PGFPlotsPackage, plt::Plot; kw...) + d = Dict{Symbol,Any}(kw) + # TODO: add one series to the underlying package + push!(plt.seriesargs, d) + plt +end + +function _add_annotations{X,Y,V}(plt::Plot{PGFPlotsPackage}, anns::AVec{@compat(Tuple{X,Y,V})}) + # set or add to the annotation_list + if haskey(plt.plotargs, :annotation_list) + append!(plt.plotargs[:annotation_list], anns) + else + plt.plotargs[:annotation_list] = anns + end +end + +# ---------------------------------------------------------------- + +function _before_update_plot(plt::Plot{PGFPlotsPackage}) +end + +# TODO: override this to update plot items (title, xlabel, etc) after creation +function _update_plot(plt::Plot{PGFPlotsPackage}, d::Dict) +end + +function _update_plot_pos_size(plt::PlottingObject{PGFPlotsPackage}, d::Dict) +end + +# ---------------------------------------------------------------- + +# accessors for x/y data + +function Base.getindex(plt::Plot{PGFPlotsPackage}, i::Int) + d = plt.seriesargs[i] + d[:x], d[:y] +end + +function Base.setindex!(plt::Plot{PGFPlotsPackage}, xy::Tuple, i::Integer) + d = plt.seriesargs[i] + d[:x], d[:y] = xy + plt +end + +# ---------------------------------------------------------------- + +function _create_subplot(subplt::Subplot{PGFPlotsPackage}, isbefore::Bool) + # TODO: build the underlying Subplot object. this is where you might layout the panes within a GUI window, for example + true +end + +function _expand_limits(lims, plt::Plot{PGFPlotsPackage}, isx::Bool) + # TODO: call expand limits for each plot data +end + +function _remove_axis(plt::Plot{PGFPlotsPackage}, isx::Bool) + # TODO: if plot is inner subplot, might need to remove ticks or axis labels +end + +# ---------------------------------------------------------------- + + +# ---------------------------------------------------------------- + +################# This is the important method to implement!!! ################# +function _make_pgf_plot(plt::Plot{PGFPlotsPackage}) + # TODO: convert plt.plotargs and plt.seriesargs into PGFPlots calls + # TODO: return the PGFPlots object +end + +function Base.writemime(io::IO, mime::MIME"image/png", plt::PlottingObject{PGFPlotsPackage}) + plt.o = _make_pgf_plot(plt) + writemime(io, mime, plt.o) +end + +# function Base.writemime(io::IO, ::MIME"text/html", plt::PlottingObject{PGFPlotsPackage}) +# end + +function Base.display(::PlotsDisplay, plt::PlottingObject{PGFPlotsPackage}) + plt.o = _make_pgf_plot(plt) + display(plt.o) +end + +# function Base.display(::PlotsDisplay, plt::Subplot{PGFPlotsPackage}) +# # TODO: display/show the subplot +# end diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index aa1141cb..9672638d 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -1,6 +1,41 @@ # https://plot.ly/javascript/getting-started +function _initialize_backend(::PlotlyPackage; kw...) + @eval begin + import JSON + JSON._print(io::IO, state::JSON.State, dt::Union{Date,DateTime}) = print(io, '"', dt, '"') + + ############################ + # borrowed from https://github.com/spencerlyon2/Plotlyjs.jl/blob/master/src/display.jl + _js_path = joinpath(Pkg.dir("Plots"), "deps", "plotly-latest.min.js") + + # if we're in IJulia call setupnotebook to load js and css + if isijulia() + # the first script is some hack I needed to do in order for the notebook + # to not complain about Plotly being undefined + display("text/html", """ + + + """) + # display("text/html", "

Plotly javascript loaded.

") + end + # end borrowing (thanks :) + ########################### + + try + include(joinpath(Pkg.dir("Plots"), "src", "backends", "plotly_blink.jl")) + catch err + warn("Error including PlotlyJS: $err\n Note: Will fall back to built-in display.") + end + end + # TODO: other initialization +end + # --------------------------------------------------------------------------- function _create_plot(pkg::PlotlyPackage; kw...) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 5621bf31..80772df7 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -1,6 +1,32 @@ # https://github.com/stevengj/PyPlot.jl +function _initialize_backend(::PyPlotPackage) + @eval begin + import PyPlot + export PyPlot + const pycolors = PyPlot.pywrap(PyPlot.pyimport("matplotlib.colors")) + const pypath = PyPlot.pywrap(PyPlot.pyimport("matplotlib.path")) + const mplot3d = PyPlot.pywrap(PyPlot.pyimport("mpl_toolkits.mplot3d")) + # const pycolorbar = PyPlot.pywrap(PyPlot.pyimport("matplotlib.colorbar")) + end + + if !isa(Base.Multimedia.displays[end], Base.REPL.REPLDisplay) + PyPlot.ioff() # stops wierd behavior of displaying incomplete graphs in IJulia + + # # TODO: how the hell can I use PyQt4?? + # "pyqt4"=>:qt_pyqt4 + # PyPlot.backend[1] = "pyqt4" + # PyPlot.gui[1] = :qt_pyqt4 + # PyPlot.switch_backend("Qt4Agg") + + # only turn on the gui if we want it + if PyPlot.gui != :none + PyPlot.pygui(true) + end + end +end + # ------------------------------- # convert colorant to 4-tuple RGBA @@ -413,9 +439,6 @@ function Base.getindex(plt::Plot{PyPlotPackage}, i::Integer) xy = series[:get_offsets]() return vec(xy[:,1]), vec(xy[:,2]) end - # series[:relim]() - # mapping = getGadflyMappings(plt, i)[1] - # mapping[:x], mapping[:y] end function Base.setindex!{X,Y}(plt::Plot{PyPlotPackage}, xy::Tuple{X,Y}, i::Integer) diff --git a/src/backends/qwt.jl b/src/backends/qwt.jl index 922f691d..e4101a9f 100644 --- a/src/backends/qwt.jl +++ b/src/backends/qwt.jl @@ -1,6 +1,12 @@ # https://github.com/tbreloff/Qwt.jl +function _initialize_backend(::QwtPackage; kw...) + @eval begin + import Qwt + export Qwt + end +end # ------------------------------- diff --git a/src/backends/template.jl b/src/backends/template.jl index 450f264f..b8148da0 100644 --- a/src/backends/template.jl +++ b/src/backends/template.jl @@ -3,6 +3,15 @@ # [WEBSITE] +function _initialize_backend(::[PkgName]Package; kw...) + @eval begin + import [PkgName] + export [PkgName] + # TODO: other initialization that needs to be eval-ed + end + # TODO: other initialization +end + # --------------------------------------------------------------------------- function _create_plot(pkg::[PkgName]Package; kw...) @@ -43,13 +52,11 @@ end # accessors for x/y data function Base.getindex(plt::Plot{[PkgName]Package}, i::Int) - series = plt.o.lines[i] - series.x, series.y + # TODO: return a tuple of (x, y) vectors end function Base.setindex!(plt::Plot{[PkgName]Package}, xy::Tuple, i::Integer) - series = plt.o.lines[i] - series.x, series.y = xy + # TODO: set the plot data from the (x,y) tuple plt end diff --git a/src/backends/unicodeplots.jl b/src/backends/unicodeplots.jl index 23c0d591..6c959241 100644 --- a/src/backends/unicodeplots.jl +++ b/src/backends/unicodeplots.jl @@ -1,6 +1,13 @@ # https://github.com/Evizero/UnicodePlots.jl +function _initialize_backend(::UnicodePlotsPackage; kw...) + @eval begin + import UnicodePlots + export UnicodePlots + end +end + # ------------------------------- diff --git a/src/backends/winston.jl b/src/backends/winston.jl index b9b71a98..1e12f7ad 100644 --- a/src/backends/winston.jl +++ b/src/backends/winston.jl @@ -3,6 +3,13 @@ # credit goes to https://github.com/jverzani for contributing to the first draft of this backend implementation +function _initialize_backend(::WinstonPackage; kw...) + @eval begin + ENV["WINSTON_OUTPUT"] = "gtk" + import Winston, Gtk + export Winston, Gtk + end +end # --------------------------------------------------------------------------- diff --git a/src/plotter.jl b/src/plotter.jl index ebf3295e..ee62107b 100644 --- a/src/plotter.jl +++ b/src/plotter.jl @@ -83,11 +83,11 @@ subplot!(pkg::PlottingPackage, subplt::Subplot; kw...) = error("subplot!($pkg, s const BACKENDS = [:qwt, :gadfly, :unicodeplots, :pyplot, :immerse, :bokeh, :plotly, :gr] -const INITIALIZED_BACKENDS = Set{Symbol}() +const _initialized_backends = Set{Symbol}() backends() = BACKENDS -function backendInstance(sym::Symbol) +function _backend_instance(sym::Symbol) sym == :qwt && return QwtPackage() sym == :gadfly && return GadflyPackage() sym == :unicodeplots && return UnicodePlotsPackage() @@ -107,7 +107,7 @@ type CurrentBackend sym::Symbol pkg::PlottingPackage end -CurrentBackend(sym::Symbol) = CurrentBackend(sym, backendInstance(sym)) +CurrentBackend(sym::Symbol) = CurrentBackend(sym, _backend_instance(sym)) # --------------------------------------------------------- @@ -134,7 +134,7 @@ function backend() end currentBackendSymbol = CURRENT_BACKEND.sym - if !(currentBackendSymbol in INITIALIZED_BACKENDS) + if !(currentBackendSymbol in _initialized_backends) # initialize println("[Plots.jl] Initializing backend: ", CURRENT_BACKEND.sym) @@ -283,7 +283,7 @@ function backend() else error("Unknown backend $currentBackendSymbol. Choose from: $BACKENDS") end - push!(INITIALIZED_BACKENDS, currentBackendSymbol) + push!(_initialized_backends, currentBackendSymbol) end CURRENT_BACKEND.pkg diff --git a/src/plotter2.jl b/src/plotter2.jl new file mode 100644 index 00000000..30bdc665 --- /dev/null +++ b/src/plotter2.jl @@ -0,0 +1,119 @@ + +immutable NoPackage <: PlottingPackage end + +const _backendType = Dict{Symbol, DataType}(:none => NoPackage) +const _backendSymbol = Dict{DataType, Symbol}(NoPackage => :none) +const _backends = Symbol[] +const _initialized_backends = Set{Symbol}() + +backends() = _backends +backend_name() = CURRENT_BACKEND.sym +_backend_instance(sym::Symbol) = haskey(_backendType, sym) ? _backendType[sym]() : error("Unsupported backend $sym") + +macro init_plotting_pkg(s) + str = lowercase(string(s)) + sym = symbol(str) + T = symbol(string(s) * "Package") + esc(quote + immutable $T <: PlottingPackage end + export $sym + $sym(; kw...) = (default(; kw...); backend(symbol($str))) + backend_name(::$T) = symbol($str) + push!(_backends, symbol($str)) + _backendType[symbol($str)] = $T + _backendSymbol[$T] = symbol($str) + include("backends/" * $str * ".jl") + end) +end + +@init_plotting_pkg Immerse +@init_plotting_pkg Gadfly +@init_plotting_pkg PyPlot +@init_plotting_pkg Qwt +@init_plotting_pkg UnicodePlots +@init_plotting_pkg Winston +@init_plotting_pkg Bokeh +@init_plotting_pkg Plotly +@init_plotting_pkg GR +@init_plotting_pkg GLVisualize +@init_plotting_pkg PGFPlots + +include("backends/supported.jl") + +# --------------------------------------------------------- + + +plot(pkg::PlottingPackage; kw...) = error("plot($pkg; kw...) is not implemented") +plot!(pkg::PlottingPackage, plt::Plot; kw...) = error("plot!($pkg, plt; kw...) is not implemented") +_update_plot(pkg::PlottingPackage, plt::Plot, d::Dict) = error("_update_plot($pkg, plt, d) is not implemented") +_update_plot_pos_size{P<:PlottingPackage}(plt::PlottingObject{P}, d::Dict) = nothing +subplot(pkg::PlottingPackage; kw...) = error("subplot($pkg; kw...) is not implemented") +subplot!(pkg::PlottingPackage, subplt::Subplot; kw...) = error("subplot!($pkg, subplt; kw...) is not implemented") + +# --------------------------------------------------------- + + +type CurrentBackend + sym::Symbol + pkg::PlottingPackage +end +CurrentBackend(sym::Symbol) = CurrentBackend(sym, _backend_instance(sym)) + +# --------------------------------------------------------- + +function pickDefaultBackend() + for pkgstr in ("PyPlot", "Immerse", "Qwt", "Gadfly", "GR", "UnicodePlots", "Bokeh", "GLVisualize") + if Pkg.installed(pkgstr) != nothing + return backend(symbol(lowercase(pkgstr))) + end + end + + # the default if nothing else is installed + backend(:plotly) +end + + +# --------------------------------------------------------- + +""" +Returns the current plotting package name. Initializes package on first call. +""" +function backend() + + global CURRENT_BACKEND + if CURRENT_BACKEND.sym == :none + pickDefaultBackend() + end + + sym = CURRENT_BACKEND.sym + if !(sym in _initialized_backends) + + # initialize + println("[Plots.jl] Initializing backend: ", sym) + + inst = _backend_instance(sym) + try + _initialize_backend(inst) + catch err + warn("Couldn't initialize $sym. (might need to install it?)") + rethrow(err) + end + + push!(_initialized_backends, sym) + + end + CURRENT_BACKEND.pkg +end + +""" +Set the plot backend. +""" +function backend(pkg::PlottingPackage) + CURRENT_BACKEND.sym = backend_name(pkg) + CURRENT_BACKEND.pkg = pkg +end + +function backend(modname::Symbol) + CURRENT_BACKEND.sym = modname + CURRENT_BACKEND.pkg = _backend_instance(modname) +end diff --git a/src/subplot.jl b/src/subplot.jl index dee0a7cd..07b56500 100644 --- a/src/subplot.jl +++ b/src/subplot.jl @@ -135,7 +135,7 @@ convertSeriesIndex(subplt::Subplot, n::Int) = ceil(Int, n / subplt.p) function validateSubplotSupported() if !subplotSupported() - error(CURRENT_BACKEND.sym, " does not support the subplot/subplot! commands at this time. Try one of: ", join(filter(pkg->subplotSupported(backendInstance(pkg)), backends()),", ")) + error(CURRENT_BACKEND.sym, " does not support the subplot/subplot! commands at this time. Try one of: ", join(filter(pkg->subplotSupported(_backend_instance(pkg)), backends()),", ")) end end diff --git a/src/utils.jl b/src/utils.jl index 90431042..68d27cb3 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -416,7 +416,7 @@ function supportGraph(allvals, func) y = ASCIIString[] for val in vals for b in bs - supported = func(Plots.backendInstance(b)) + supported = func(Plots._backend_instance(b)) if val in supported push!(x, string(b)) push!(y, string(val)) diff --git a/test/refimg/gadfly/ref13.png b/test/refimg/gadfly/ref13.png index caf2109c07d03c7d68112b573fd3d9aa44bf3a6a..e533d428a50c60130e25ab30a1ffd9ca885ec798 100644 GIT binary patch literal 119621 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

74;Zhy=K2Ru31$?|6f_v(*N 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 Nfv2mV%Q~loCIIUe&Qt&Z From 2643417c0ba5ac33747ed009426d7cc1882ec882 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Thu, 4 Feb 2016 12:59:40 -0500 Subject: [PATCH 056/121] readme --- README.md | 397 +----------------------------------------------------- 1 file changed, 1 insertion(+), 396 deletions(-) diff --git a/README.md b/README.md index 22740644..1ce9e432 100644 --- a/README.md +++ b/README.md @@ -18,399 +18,4 @@ Plots is a plotting API and toolset. My goals with the package are: Use the preprocessing pipeline in Plots to fully describe your visualization before it calls the backend code. This maintains modularity and allows for efficient separation of front end code, algorithms, and backend graphics. New graphical backends can be added with minimal effort. -Check out the [summary graphs](img/supported/supported.md) for the features that each backend supports. - -Please add wishlist items, bugs, or any other comments/questions to the issues list. - -## Examples for each implemented backend: - -- [Gadfly.jl/Immerse.jl](https://github.com/tbreloff/ExamplePlots.jl/tree/master/docs/gadfly_examples.md) -- [PyPlot.jl](https://github.com/tbreloff/ExamplePlots.jl/tree/master/docs/pyplot_examples.md) -- [UnicodePlots.jl](https://github.com/tbreloff/ExamplePlots.jl/tree/master/docs/unicodeplots_examples.md) -- [Qwt.jl](https://github.com/tbreloff/ExamplePlots.jl/tree/master/docs/qwt_examples.md) - -Also check out the many [IJulia notebooks](http://nbviewer.ipython.org/github/tbreloff/ExamplePlots.jl/tree/master/examples/) with many examples. - -## Installation - -First, add the package - -```julia -Pkg.add("Plots") - -# if you want the latest features: -Pkg.checkout("Plots") - -# or for the bleeding edge: -Pkg.checkout("Plots", "dev") -``` - -then get any plotting packages you need (obviously, you should get at least one backend). - -```julia -Pkg.add("Gadfly") -Pkg.add("Immerse") -Pkg.add("PyPlot") -Pkg.add("UnicodePlots") -Pkg.add("Qwt") -Pkg.add("Bokeh") -``` - -## Use - -Load it in. The underlying plotting backends are not imported until `backend()` is called (which happens -on your first call to `plot` or `subplot`). This means that you don't need any backends to be installed when you call `using Plots`. - -Plots will try to figure out a good default backend for you automatically based on what backends are installed. - -```julia -using Plots -``` - -Do a plot in Gadfly (inspired by [this example](http://gadflyjl.org/geom_point.html)), then save a png: - -```julia -gadfly() # switch to Gadfly as a backend -dataframes() # turn on support for DataFrames inputs - -# load some data -using RDatasets -iris = dataset("datasets", "iris"); - -# This will bring up a browser window with the plot. Add a semicolon at the end to skip display. -scatter(iris, :SepalLength, :SepalWidth, group=:Species, m=([:+ :d :s], 12), smooth=0.99, bg=:black) - -# save a png (equivalent to png("gadfly1.png") and savefig("gadfly1.png")) -png("gadfly1") -``` - -![gadfly_plt](img/gadfly1.png) - -## API - -Call `backend(backend::Symbol)` or the shorthands (`gadfly()`, `qwt()`, `unicodeplots()`, etc) to set the current plotting backend. -Subsequent commands are converted into the relevant plotting commands for that package: - -```julia -gadfly() -plot(1:10) # this effectively calls `y = 1:10; Gadfly.plot(x=1:length(y), y=y)` -qwt() -plot(1:10) # this effectively calls `Qwt.plot(1:10)` -``` - -Use `plot` to create a new plot object, and `plot!` to add to an existing one: - -```julia -plot(args...; kw...) # creates a new plot window, and sets it to be the `current` -plot!(args...; kw...) # adds to the `current` -plot!(plotobj, args...; kw...) # adds to the plot `plotobj` -``` - -Now that you know which plot object you're updating (new, current, or other), I'll leave it off for simplicity. -There are many ways to pass in data to the plot functions... some examples: - -- Vector-like (subtypes of AbstractArray{T,1}) -- Matrix-like (subtypes of AbstractArray{T,2}) -- Vectors of Vectors -- Functions -- Vectors of Functions -- DataFrames with column symbols (initialize with `dataframes()`) - -In general, you can pass in a `y` only, or an `x` and `y`, both of whatever type(s) you want, and Plots will slice up the data as needed. -For matrices, data is split by columns. For functions, data is mapped. For DataFrames, a Symbol/Symbols in place of x/y will map to -the relevant column(s). - -Here are some example usages... remember you can always use `plot!` to update an existing plot, and that, unless specified, you will update the `current()`. - -```julia -plot() # empty plot object -plot(4) # initialize with 4 empty series -plot(rand(10)) # plot 1 series... x = 1:10 -plot(rand(10,5)) # plot 5 series... x = 1:10 -plot(rand(10), rand(10)) # plot 1 series -plot(rand(10,5), rand(10)) # plot 5 series... y is the same for all -plot(sin, rand(10)) # y = sin(x) -plot(rand(10), sin) # same... y = sin(x) -plot([sin,cos], 0:0.1:π) # plot 2 series, sin(x) and cos(x) -plot([sin,cos], 0, π) # plot sin and cos on the range [0, π] -plot(1:10, Any[rand(10), sin]) # plot 2 series, y = rand(10) for the first, y = sin(x) for the second... x = 1:10 for both -plot(dataset("Ecdat", "Airline"), :Cost) # plot from a DataFrame (call `dataframes()` first to import DataFrames and initialize) -``` - -All plot methods accept a number of keyword arguments (see the tables below), which follow some rules: -- Many arguments have aliases which are replaced during preprocessing. `c` is the same as `color`, `m` is the same as `marker`, etc. You can choose how verbose you'd like to be. (see the tables below) -- There are some special arguments (`xaxis`, `yaxis`, `line`, `marker`, `fill` and the aliases `l`, `m`, `f`) which magically set many related things at once. (see the __Tip__ below) -- If the argument is a "matrix-type", then each column will map to a series, cycling through columns if there are fewer columns than series. Anything else will apply the argument value to every series. -- Many arguments accept many different types... for example the `color` (also `markercolor`, `fillcolor`, etc) argument will accept strings or symbols with a color name, or any `Colors.Colorant`, or a `ColorScheme`, or a symbol representing a `ColorGradient`, or an AbstractVector of colors/symbols/etc... - -You can update certain plot settings after plot creation (not supported on all backends): - -```julia -plot!(title = "New Title", xlabel = "New xlabel", ylabel = "New ylabel") -plot!(xlims = (0, 5.5), ylims = (-2.2, 6), xticks = 0:0.5:10, yticks = [0,1,5,10]) - -# using shorthands: -xaxis!("mylabel", :log10, :flip) -``` - -With `subplot`, create multiple plots at once, with flexible layout options: - -```julia -y = rand(100,3) -subplot(y; n = 3) # create an automatic grid, and let it figure out the shape -subplot(y; n = 3, nr = 1) # create an automatic grid, but fix the number of rows -subplot(y; n = 3, nc = 1) # create an automatic grid, but fix the number of columns -subplot(y; layout = [1, 2]) # explicit layout. Lists the number of plots in each row -``` - -__Tip__: You can call `subplot!(args...; kw...)` to add to an existing subplot. - -__Tip__: Calling `subplot!` on a `Plot` object, or `plot!` on a `Subplot` object will throw an error. - -Shorthands: - -```julia -scatter(args...; kw...) = plot(args...; kw..., linetype = :scatter) -scatter!(args...; kw...) = plot!(args...; kw..., linetype = :scatter) -bar(args...; kw...) = plot(args...; kw..., linetype = :bar) -bar!(args...; kw...) = plot!(args...; kw..., linetype = :bar) -histogram(args...; kw...) = plot(args...; kw..., linetype = :hist) -histogram!(args...; kw...) = plot!(args...; kw..., linetype = :hist) -heatmap(args...; kw...) = plot(args...; kw..., linetype = :heatmap) -heatmap!(args...; kw...) = plot!(args...; kw..., linetype = :heatmap) -sticks(args...; kw...) = plot(args...; kw..., linetype = :sticks, marker = :ellipse) -sticks!(args...; kw...) = plot!(args...; kw..., linetype = :sticks, marker = :ellipse) -hline(args...; kw...) = plot(args...; kw..., linetype = :hline) -hline!(args...; kw...) = plot!(args...; kw..., linetype = :hline) -vline(args...; kw...) = plot(args...; kw..., linetype = :vline) -vline!(args...; kw...) = plot!(args...; kw..., linetype = :vline) -ohlc(args...; kw...) = plot(args...; kw..., linetype = :ohlc) -ohlc!(args...; kw...) = plot!(args...; kw..., linetype = :ohlc) - -title!(s::AbstractString) = plot!(title = s) -xlabel!(s::AbstractString) = plot!(xlabel = s) -ylabel!(s::AbstractString) = plot!(ylabel = s) -xlims!{T<:Real,S<:Real}(lims::Tuple{T,S}) = plot!(xlims = lims) -ylims!{T<:Real,S<:Real}(lims::Tuple{T,S}) = plot!(ylims = lims) -xticks!{T<:Real}(v::AVec{T}) = plot!(xticks = v) -yticks!{T<:Real}(v::AVec{T}) = plot!(yticks = v) -xflip!(flip::Bool = true) = plot!(xflip = flip) -yflip!(flip::Bool = true) = plot!(yflip = flip) -xaxis!(args...) = plot!(xaxis = args) -yaxis!(args...) = plot!(yaxis = args) -annotate!(anns) = plot!(annotation = anns) -``` - -### Keyword arguments: - -Keyword | Default | Type | Aliases ----- | ---- | ---- | ---- -`:annotation` | `nothing` | Series | `:ann`, `:annotate`, `:annotations`, `:anns` -`:axis` | `left` | Series | `:axiss` -`:background_color` | `RGB{U8}(1.0,1.0,1.0)` | Plot | `:background`, `:background_colour`, `:bg`, `:bg_color`, `:bgcolor` -`:color_palette` | `auto` | Plot | `:palette` -`:fill` | `nothing` | Series | `:area`, `:f` -`:fillalpha` | `nothing` | Series | `:fa`, `:fillalphas`, `:fillopacity` -`:fillcolor` | `match` | Series | `:fc`, `:fcolor`, `:fillcolors`, `:fillcolour` -`:fillrange` | `nothing` | Series | `:fillranges`, `:fillrng` -`:foreground_color` | `auto` | Plot | `:fg`, `:fg_color`, `:fgcolor`, `:foreground`, `:foreground_colour` -`:grid` | `true` | Plot | -`:group` | `nothing` | Series | `:g`, `:groups` -`:guidefont` | `Plots.Font("Helvetica",11,:hcenter,:vcenter,0.0,RGB{U8}(0.0,0.0,0.0))` | Plot | -`:label` | `AUTO` | Series | `:lab`, `:labels` -`:layout` | `nothing` | Plot | -`:legend` | `true` | Plot | `:leg` -`:legendfont` | `Plots.Font("Helvetica",8,:hcenter,:vcenter,0.0,RGB{U8}(0.0,0.0,0.0))` | Plot | -`:line` | `nothing` | Series | `:l` -`:linealpha` | `nothing` | Series | `:la`, `:linealphas`, `:lineopacity` -`:linecolor` | `auto` | Series | `:c`, `:color`, `:colour`, `:linecolors` -`:linestyle` | `solid` | Series | `:linestyles`, `:ls`, `:s`, `:style` -`:linetype` | `path` | Series | `:linetypes`, `:lt`, `:t`, `:type` -`:linewidth` | `1` | Series | `:linewidths`, `:lw`, `:w`, `:width` -`:link` | `false` | Plot | -`:linkfunc` | `nothing` | Plot | -`:linkx` | `false` | Plot | `:xlink` -`:linky` | `false` | Plot | `:ylink` -`:marker` | `nothing` | Series | `:m`, `:mark` -`:markeralpha` | `nothing` | Series | `:alpha`, `:ma`, `:markeralphas`, `:markeropacity`, `:opacity` -`:markercolor` | `match` | Series | `:markercolors`, `:markercolour`, `:mc`, `:mcolor` -`:markershape` | `none` | Series | `:markershapes`, `:shape` -`:markersize` | `6` | Series | `:markersizes`, `:ms`, `:msize` -`:markerstrokealpha` | `nothing` | Series | `:markerstrokealphas` -`:markerstrokecolor` | `match` | Series | `:markerstrokecolors` -`:markerstrokestyle` | `solid` | Series | `:markerstrokestyles` -`:markerstrokewidth` | `1` | Series | `:markerstrokewidths` -`:n` | `-1` | Plot | -`:nbins` | `30` | Series | `:nb`, `:nbin`, `:nbinss` -`:nc` | `-1` | Plot | -`:nlevels` | `15` | Series | `:nlevelss` -`:nr` | `-1` | Plot | -`:pos` | `(0,0)` | Plot | -`:show` | `false` | Plot | `:display`, `:gui` -`:size` | `(500,300)` | Plot | `:windowsize`, `:wsize` -`:smooth` | `false` | Series | `:reg`, `:regression`, `:smooths` -`:surface` | `nothing` | Series | `:surfaces` -`:tickfont` | `Plots.Font("Helvetica",8,:hcenter,:vcenter,0.0,RGB{U8}(0.0,0.0,0.0))` | Plot | -`:title` | `` | Plot | -`:windowtitle` | `Plots.jl` | Plot | `:wtitle` -`:xaxis` | `nothing` | Plot | -`:xflip` | `false` | Plot | -`:xlabel` | `` | Plot | `:xlab` -`:xlims` | `auto` | Plot | `:xlim`, `:xlimit`, `:xlimits` -`:xscale` | `identity` | Plot | -`:xticks` | `auto` | Plot | `:xtick` -`:yaxis` | `nothing` | Plot | -`:yflip` | `false` | Plot | -`:ylabel` | `` | Plot | `:ylab` -`:ylims` | `auto` | Plot | `:ylim`, `:ylimit`, `:ylimits` -`:yrightlabel` | `` | Plot | `:y2lab`, `:y2label`, `:ylab2`, `:ylabel2`, `:ylabelright`, `:ylabr`, `:yrlab` -`:yscale` | `identity` | Plot | -`:yticks` | `auto` | Plot | `:ytick` -`:z` | `nothing` | Series | `:zs` - - -### Plot types: - -Type | Desc | Aliases ----- | ---- | ---- -`:none` | No line | `:n`, `:no` -`:line` | Lines with sorted x-axis | `:l` -`:path` | Lines | `:p` -`:steppre` | Step plot (vertical then horizontal) | `:stepinv`, `:stepinverted`, `:stepsinv`, `:stepsinverted` -`:steppost` | Step plot (horizontal then vertical) | `:stair`, `:stairs`, `:step`, `:steps` -`:sticks` | Vertical lines | `:stem`, `:stems` -`:scatter` | Points, no lines | `:dots` -`:heatmap` | Colored regions by density | -`:hexbin` | Similar to heatmap | -`:hist` | Histogram (doesn't use x) | `:histogram` -`:bar` | Bar plot (centered on x values) | -`:hline` | Horizontal line (doesn't use x) | -`:vline` | Vertical line (doesn't use x) | -`:ohlc` | Open/High/Low/Close chart (expects y is AbstractVector{Plots.OHLC}) | -`:contour` | Contour lines (uses z) | -`:path3d` | 3D path (uses z) | `:line3d` -`:scatter3d` | 3D scatter plot (uses z) | - - -### Line styles: - -Type | Aliases ----- | ---- -`:auto` | `:a` -`:solid` | `:s` -`:dash` | `:d` -`:dot` | -`:dashdot` | `:dd` -`:dashdotdot` | `:ddd` - - -### Markers: - -Type | Aliases ----- | ---- -`:none` | `:n`, `:no` -`:auto` | `:a` -`:cross` | `:+`, `:plus` -`:diamond` | `:d` -`:dtriangle` | `:V`, `:downtri`, `:downtriangle`, `:dt`, `:dtri`, `:v` -`:ellipse` | `:c`, `:circle` -`:heptagon` | `:hep` -`:hexagon` | `:h`, `:hex` -`:octagon` | `:o`, `:oct` -`:pentagon` | `:p`, `:pent` -`:rect` | `:r`, `:sq`, `:square` -`:star4` | -`:star5` | `:s`, `:star`, `:star1` -`:star6` | -`:star7` | -`:star8` | `:s2`, `:star2` -`:utriangle` | `:^`, `:uptri`, `:uptriangle`, `:ut`, `:utri` -`:xcross` | `:X`, `:x` - - -__Tip__: With supported backends, you can pass a `Plots.Shape` object for the `marker`/`markershape` arguments. `Shape` takes a vector of 2-tuples in the constructor, defining the points of the polygon's shape in a unit-scaled coordinate space. To make a square, for example, you could do `Shape([(1,1),(1,-1),(-1,-1),(-1,1)])` - -__Tip__: You can see the default value for a given argument with `default(arg::Symbol)`, and set the default value with `default(arg::Symbol, value)` or `default(; kw...)`. For example set the default window size and whether we should show a legend with `default(size=(600,400), leg=false)`. - -__Tip__: There are some helper arguments you can set: `xaxis`, `yaxis`, `line`, `marker`, `fill`. These go through special preprocessing to extract values into individual arguments. The order doesn't matter, and if you pass a single value it's equivalent to wrapping it in a Tuple. Examples: - -``` -plot(y, xaxis = ("mylabel", :log, :flip, (-1,1))) # this sets the `xlabel`, `xscale`, `xflip`, and `xlims` arguments automatically -plot(y, line = (:bar, :blue, :dot, 10)) # this sets the `linetype`, `color`, `linestyle`, and `linewidth` arguments automatically -plot(y, marker = (:rect, :red, 10)) # this sets the `markershape`, `markercolor`, and `markersize` arguments automatically -plot(y, fill = (:green, 10)) # this sets the `fillcolor` and `fillrange` arguments automatically - # Note: `fillrange` can be: - a number (fill to horizontal line) - a vector of numbers (different for each data point) - a tuple of vectors (fill a band) -``` - -__Tip__: When plotting multiple lines, you can set all series to use the same value, or pass in a matrix to cycle through values. Example: - -```julia -plot(rand(100,4); color = [:red RGB(0,0,1)], # (Matrix) lines 1 and 3 are red, lines 2 and 4 are blue - axis = :auto, # lines 1 and 3 are on the left axis, lines 2 and 4 are on the right - markershape = [:rect, :star] # (Vector) ALL lines are passed the vector [:rect, :star1] - width = 5) # all lines have a width of 5 -``` - -__Tip__: Not all features are supported for each backend, but you can see what's supported by calling the functions: `supportedArgs()`, `supportedAxes()`, `supportedTypes()`, `supportedStyles()`, `supportedMarkers()`, `subplotSupported()` - -__Tip__: Call `gui()` to display the plot in a window. Interactivity depends on backend. Plotting at the REPL (without semicolon) implicitly calls `gui()`. - -### Animations - -Animations are created in 3 steps (see example #2): -- Initialize an `Animation` object. -- Save each frame of the animation with `frame(anim)`. -- Convert the frames to an animated gif with `gif(anim, filename, fps=15)` - - -## TODO features: - -- [x] Plot vectors/matrices/functions -- [x] Plot DataFrames -- [x] Histograms -- [x] Grouping -- [x] Annotations -- [x] Scales -- [x] Categorical Inputs (strings, etc... for hist, bar? or can split one series into multiple?) -- [x] Custom markers -- [x] Animations -- [x] Subplots -- [ ] Contours -- [ ] Boxplots -- [ ] 3D plotting -- [ ] Scenes/Drawing -- [ ] Graphs -- [ ] Interactivity (GUIs) - -## TODO backends: - -- [x] Gadfly.jl -- [x] Immerse.jl -- [x] PyPlot.jl -- [x] UnicodePlots.jl -- [x] Qwt.jl -- [x] Winston.jl (deprecated) -- [ ] GLPlot.jl -- [ ] Bokeh.jl -- [ ] Vega.jl -- [ ] Gaston.jl -- [ ] Plotly.jl -- [ ] GoogleCharts.jl -- [ ] PLplot.jl -- [ ] TextPlots.jl -- [ ] ASCIIPlots.jl -- [ ] Sparklines.jl -- [ ] Hinton.jl -- [ ] ImageTerm.jl -- [ ] GraphViz.jl -- [ ] TikzGraphs.jl -- [ ] GraphLayout.jl - -## More information on backends (both supported and unsupported) - -See the wiki at: https://github.com/JuliaPlot/juliaplot_docs/wiki - - +View the full documentation at [plots.readthedocs.org]. From 5706770a11eed852b34344c6213837d9773876b0 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Thu, 4 Feb 2016 13:00:12 -0500 Subject: [PATCH 057/121] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1ce9e432..5565ee4b 100644 --- a/README.md +++ b/README.md @@ -18,4 +18,4 @@ Plots is a plotting API and toolset. My goals with the package are: Use the preprocessing pipeline in Plots to fully describe your visualization before it calls the backend code. This maintains modularity and allows for efficient separation of front end code, algorithms, and backend graphics. New graphical backends can be added with minimal effort. -View the full documentation at [plots.readthedocs.org]. +View the full documentation at [plots.readthedocs.org](plots.readthedocs.org). From 935c1cfeab299b6e7f2671d4ee406ae36980d964 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Thu, 4 Feb 2016 13:01:06 -0500 Subject: [PATCH 058/121] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5565ee4b..69f76c99 100644 --- a/README.md +++ b/README.md @@ -18,4 +18,4 @@ Plots is a plotting API and toolset. My goals with the package are: Use the preprocessing pipeline in Plots to fully describe your visualization before it calls the backend code. This maintains modularity and allows for efficient separation of front end code, algorithms, and backend graphics. New graphical backends can be added with minimal effort. -View the full documentation at [plots.readthedocs.org](plots.readthedocs.org). +View the [full documentation](http://plots.readthedocs.org). From ade9d86696194828b5471e24f4d07aa0771693f1 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Thu, 4 Feb 2016 14:00:19 -0500 Subject: [PATCH 059/121] deprecated a bunch of images and docs-related stuff; cleaned up travis, imgcomp, and runtests --- .travis.yml | 8 +- .../docs}/example_generation.jl | 0 {docs => deprecated/docs}/readme_template.md | 0 {img => deprecated/img}/gadfly1.png | Bin .../img}/supported/Plots.supportGraphArgs.png | Bin .../img}/supported/Plots.supportGraphAxes.png | Bin .../supported/Plots.supportGraphMarkers.png | Bin .../supported/Plots.supportGraphScales.png | Bin .../supported/Plots.supportGraphStyles.png | Bin .../supported/Plots.supportGraphTypes.png | Bin .../img}/supported/supported.md | 0 .../test}/refimg/gadfly/ref1.png | Bin .../test}/refimg/gadfly/ref10.png | Bin .../test}/refimg/gadfly/ref11.png | Bin .../test}/refimg/gadfly/ref12.png | Bin .../test}/refimg/gadfly/ref13.png | Bin .../test}/refimg/gadfly/ref14.png | Bin .../test}/refimg/gadfly/ref15.png | Bin .../test}/refimg/gadfly/ref16.png | Bin .../test}/refimg/gadfly/ref17.png | Bin .../test}/refimg/gadfly/ref18.png | Bin .../test}/refimg/gadfly/ref2.png | Bin .../test}/refimg/gadfly/ref20.png | Bin .../test}/refimg/gadfly/ref21.png | Bin .../test}/refimg/gadfly/ref22.png | Bin .../test}/refimg/gadfly/ref3.png | Bin .../test}/refimg/gadfly/ref4.png | Bin .../test}/refimg/gadfly/ref5.png | Bin .../test}/refimg/gadfly/ref6.png | Bin .../test}/refimg/gadfly/ref7.png | Bin .../test}/refimg/gadfly/ref8.png | Bin .../test}/refimg/gadfly/ref9.png | Bin .../test}/refimg/pyplot/ref1.png | Bin .../test}/refimg/pyplot/ref10.png | Bin .../test}/refimg/pyplot/ref11.png | Bin .../test}/refimg/pyplot/ref12.png | Bin .../test}/refimg/pyplot/ref13.png | Bin .../test}/refimg/pyplot/ref14.png | Bin .../test}/refimg/pyplot/ref15.png | Bin .../test}/refimg/pyplot/ref16.png | Bin .../test}/refimg/pyplot/ref17.png | Bin .../test}/refimg/pyplot/ref18.png | Bin .../test}/refimg/pyplot/ref2.png | Bin .../test}/refimg/pyplot/ref20.png | Bin .../test}/refimg/pyplot/ref21.png | Bin .../test}/refimg/pyplot/ref22.png | Bin .../test}/refimg/pyplot/ref24.png | Bin .../test}/refimg/pyplot/ref3.png | Bin .../test}/refimg/pyplot/ref4.png | Bin .../test}/refimg/pyplot/ref5.png | Bin .../test}/refimg/pyplot/ref6.png | Bin .../test}/refimg/pyplot/ref7.png | Bin .../test}/refimg/pyplot/ref8.png | Bin .../test}/refimg/pyplot/ref9.png | Bin {test => deprecated/test}/test_plottypes.jl | 0 test/imgcomp.jl | 100 +------------- test/runtests.jl | 124 +----------------- 57 files changed, 7 insertions(+), 225 deletions(-) rename {docs => deprecated/docs}/example_generation.jl (100%) rename {docs => deprecated/docs}/readme_template.md (100%) rename {img => deprecated/img}/gadfly1.png (100%) rename {img => deprecated/img}/supported/Plots.supportGraphArgs.png (100%) rename {img => deprecated/img}/supported/Plots.supportGraphAxes.png (100%) rename {img => deprecated/img}/supported/Plots.supportGraphMarkers.png (100%) rename {img => deprecated/img}/supported/Plots.supportGraphScales.png (100%) rename {img => deprecated/img}/supported/Plots.supportGraphStyles.png (100%) rename {img => deprecated/img}/supported/Plots.supportGraphTypes.png (100%) rename {img => deprecated/img}/supported/supported.md (100%) rename {test => deprecated/test}/refimg/gadfly/ref1.png (100%) rename {test => deprecated/test}/refimg/gadfly/ref10.png (100%) rename {test => deprecated/test}/refimg/gadfly/ref11.png (100%) rename {test => deprecated/test}/refimg/gadfly/ref12.png (100%) rename {test => deprecated/test}/refimg/gadfly/ref13.png (100%) rename {test => deprecated/test}/refimg/gadfly/ref14.png (100%) rename {test => deprecated/test}/refimg/gadfly/ref15.png (100%) rename {test => deprecated/test}/refimg/gadfly/ref16.png (100%) rename {test => deprecated/test}/refimg/gadfly/ref17.png (100%) rename {test => deprecated/test}/refimg/gadfly/ref18.png (100%) rename {test => deprecated/test}/refimg/gadfly/ref2.png (100%) rename {test => deprecated/test}/refimg/gadfly/ref20.png (100%) rename {test => deprecated/test}/refimg/gadfly/ref21.png (100%) rename {test => deprecated/test}/refimg/gadfly/ref22.png (100%) rename {test => deprecated/test}/refimg/gadfly/ref3.png (100%) rename {test => deprecated/test}/refimg/gadfly/ref4.png (100%) rename {test => deprecated/test}/refimg/gadfly/ref5.png (100%) rename {test => deprecated/test}/refimg/gadfly/ref6.png (100%) rename {test => deprecated/test}/refimg/gadfly/ref7.png (100%) rename {test => deprecated/test}/refimg/gadfly/ref8.png (100%) rename {test => deprecated/test}/refimg/gadfly/ref9.png (100%) rename {test => deprecated/test}/refimg/pyplot/ref1.png (100%) rename {test => deprecated/test}/refimg/pyplot/ref10.png (100%) rename {test => deprecated/test}/refimg/pyplot/ref11.png (100%) rename {test => deprecated/test}/refimg/pyplot/ref12.png (100%) rename {test => deprecated/test}/refimg/pyplot/ref13.png (100%) rename {test => deprecated/test}/refimg/pyplot/ref14.png (100%) rename {test => deprecated/test}/refimg/pyplot/ref15.png (100%) rename {test => deprecated/test}/refimg/pyplot/ref16.png (100%) rename {test => deprecated/test}/refimg/pyplot/ref17.png (100%) rename {test => deprecated/test}/refimg/pyplot/ref18.png (100%) rename {test => deprecated/test}/refimg/pyplot/ref2.png (100%) rename {test => deprecated/test}/refimg/pyplot/ref20.png (100%) rename {test => deprecated/test}/refimg/pyplot/ref21.png (100%) rename {test => deprecated/test}/refimg/pyplot/ref22.png (100%) rename {test => deprecated/test}/refimg/pyplot/ref24.png (100%) rename {test => deprecated/test}/refimg/pyplot/ref3.png (100%) rename {test => deprecated/test}/refimg/pyplot/ref4.png (100%) rename {test => deprecated/test}/refimg/pyplot/ref5.png (100%) rename {test => deprecated/test}/refimg/pyplot/ref6.png (100%) rename {test => deprecated/test}/refimg/pyplot/ref7.png (100%) rename {test => deprecated/test}/refimg/pyplot/ref8.png (100%) rename {test => deprecated/test}/refimg/pyplot/ref9.png (100%) rename {test => deprecated/test}/test_plottypes.jl (100%) diff --git a/.travis.yml b/.travis.yml index 4663f986..b09560e8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,11 +13,11 @@ script: - if [[ -a .git/shallow ]]; then git fetch --unshallow; fi - julia -e 'Pkg.clone(pwd()); Pkg.build("Plots")' # - julia -e 'Pkg.clone("https://github.com/tbreloff/Images.jl.git"); Pkg.checkout("Images","tom_imgcompare");' - - julia -e 'Pkg.clone("Images"); Pkg.build("Images")' - - julia -e 'Pkg.clone("ImageMagick"); Pkg.build("ImageMagick")' + # - julia -e 'Pkg.clone("Images"); Pkg.build("Images")' + # - julia -e 'Pkg.clone("ImageMagick"); Pkg.build("ImageMagick")' - julia -e 'Pkg.clone("https://github.com/tbreloff/VisualRegressionTests.jl.git");' - julia -e 'Pkg.clone("https://github.com/tbreloff/ExamplePlots.jl.git");' - - julia -e 'Pkg.clone("Cairo"); Pkg.build("Cairo")' - - julia -e 'ENV["PYTHON"] = ""; Pkg.clone("PyPlot"); Pkg.build("PyPlot")' + # - julia -e 'Pkg.clone("Cairo"); Pkg.build("Cairo")' + # - julia -e 'ENV["PYTHON"] = ""; Pkg.clone("PyPlot"); Pkg.build("PyPlot")' - julia -e 'Pkg.test("Plots"; coverage=false)' # - julia -e 'cd(Pkg.dir("Plots")); Pkg.add("Coverage"); using Coverage; Coveralls.submit(process_folder()); Codecov.submit(process_folder())' diff --git a/docs/example_generation.jl b/deprecated/docs/example_generation.jl similarity index 100% rename from docs/example_generation.jl rename to deprecated/docs/example_generation.jl diff --git a/docs/readme_template.md b/deprecated/docs/readme_template.md similarity index 100% rename from docs/readme_template.md rename to deprecated/docs/readme_template.md diff --git a/img/gadfly1.png b/deprecated/img/gadfly1.png similarity index 100% rename from img/gadfly1.png rename to deprecated/img/gadfly1.png diff --git a/img/supported/Plots.supportGraphArgs.png b/deprecated/img/supported/Plots.supportGraphArgs.png similarity index 100% rename from img/supported/Plots.supportGraphArgs.png rename to deprecated/img/supported/Plots.supportGraphArgs.png diff --git a/img/supported/Plots.supportGraphAxes.png b/deprecated/img/supported/Plots.supportGraphAxes.png similarity index 100% rename from img/supported/Plots.supportGraphAxes.png rename to deprecated/img/supported/Plots.supportGraphAxes.png diff --git a/img/supported/Plots.supportGraphMarkers.png b/deprecated/img/supported/Plots.supportGraphMarkers.png similarity index 100% rename from img/supported/Plots.supportGraphMarkers.png rename to deprecated/img/supported/Plots.supportGraphMarkers.png diff --git a/img/supported/Plots.supportGraphScales.png b/deprecated/img/supported/Plots.supportGraphScales.png similarity index 100% rename from img/supported/Plots.supportGraphScales.png rename to deprecated/img/supported/Plots.supportGraphScales.png diff --git a/img/supported/Plots.supportGraphStyles.png b/deprecated/img/supported/Plots.supportGraphStyles.png similarity index 100% rename from img/supported/Plots.supportGraphStyles.png rename to deprecated/img/supported/Plots.supportGraphStyles.png diff --git a/img/supported/Plots.supportGraphTypes.png b/deprecated/img/supported/Plots.supportGraphTypes.png similarity index 100% rename from img/supported/Plots.supportGraphTypes.png rename to deprecated/img/supported/Plots.supportGraphTypes.png diff --git a/img/supported/supported.md b/deprecated/img/supported/supported.md similarity index 100% rename from img/supported/supported.md rename to deprecated/img/supported/supported.md diff --git a/test/refimg/gadfly/ref1.png b/deprecated/test/refimg/gadfly/ref1.png similarity index 100% rename from test/refimg/gadfly/ref1.png rename to deprecated/test/refimg/gadfly/ref1.png diff --git a/test/refimg/gadfly/ref10.png b/deprecated/test/refimg/gadfly/ref10.png similarity index 100% rename from test/refimg/gadfly/ref10.png rename to deprecated/test/refimg/gadfly/ref10.png diff --git a/test/refimg/gadfly/ref11.png b/deprecated/test/refimg/gadfly/ref11.png similarity index 100% rename from test/refimg/gadfly/ref11.png rename to deprecated/test/refimg/gadfly/ref11.png diff --git a/test/refimg/gadfly/ref12.png b/deprecated/test/refimg/gadfly/ref12.png similarity index 100% rename from test/refimg/gadfly/ref12.png rename to deprecated/test/refimg/gadfly/ref12.png diff --git a/test/refimg/gadfly/ref13.png b/deprecated/test/refimg/gadfly/ref13.png similarity index 100% rename from test/refimg/gadfly/ref13.png rename to deprecated/test/refimg/gadfly/ref13.png diff --git a/test/refimg/gadfly/ref14.png b/deprecated/test/refimg/gadfly/ref14.png similarity index 100% rename from test/refimg/gadfly/ref14.png rename to deprecated/test/refimg/gadfly/ref14.png diff --git a/test/refimg/gadfly/ref15.png b/deprecated/test/refimg/gadfly/ref15.png similarity index 100% rename from test/refimg/gadfly/ref15.png rename to deprecated/test/refimg/gadfly/ref15.png diff --git a/test/refimg/gadfly/ref16.png b/deprecated/test/refimg/gadfly/ref16.png similarity index 100% rename from test/refimg/gadfly/ref16.png rename to deprecated/test/refimg/gadfly/ref16.png diff --git a/test/refimg/gadfly/ref17.png b/deprecated/test/refimg/gadfly/ref17.png similarity index 100% rename from test/refimg/gadfly/ref17.png rename to deprecated/test/refimg/gadfly/ref17.png diff --git a/test/refimg/gadfly/ref18.png b/deprecated/test/refimg/gadfly/ref18.png similarity index 100% rename from test/refimg/gadfly/ref18.png rename to deprecated/test/refimg/gadfly/ref18.png diff --git a/test/refimg/gadfly/ref2.png b/deprecated/test/refimg/gadfly/ref2.png similarity index 100% rename from test/refimg/gadfly/ref2.png rename to deprecated/test/refimg/gadfly/ref2.png diff --git a/test/refimg/gadfly/ref20.png b/deprecated/test/refimg/gadfly/ref20.png similarity index 100% rename from test/refimg/gadfly/ref20.png rename to deprecated/test/refimg/gadfly/ref20.png diff --git a/test/refimg/gadfly/ref21.png b/deprecated/test/refimg/gadfly/ref21.png similarity index 100% rename from test/refimg/gadfly/ref21.png rename to deprecated/test/refimg/gadfly/ref21.png diff --git a/test/refimg/gadfly/ref22.png b/deprecated/test/refimg/gadfly/ref22.png similarity index 100% rename from test/refimg/gadfly/ref22.png rename to deprecated/test/refimg/gadfly/ref22.png diff --git a/test/refimg/gadfly/ref3.png b/deprecated/test/refimg/gadfly/ref3.png similarity index 100% rename from test/refimg/gadfly/ref3.png rename to deprecated/test/refimg/gadfly/ref3.png diff --git a/test/refimg/gadfly/ref4.png b/deprecated/test/refimg/gadfly/ref4.png similarity index 100% rename from test/refimg/gadfly/ref4.png rename to deprecated/test/refimg/gadfly/ref4.png diff --git a/test/refimg/gadfly/ref5.png b/deprecated/test/refimg/gadfly/ref5.png similarity index 100% rename from test/refimg/gadfly/ref5.png rename to deprecated/test/refimg/gadfly/ref5.png diff --git a/test/refimg/gadfly/ref6.png b/deprecated/test/refimg/gadfly/ref6.png similarity index 100% rename from test/refimg/gadfly/ref6.png rename to deprecated/test/refimg/gadfly/ref6.png diff --git a/test/refimg/gadfly/ref7.png b/deprecated/test/refimg/gadfly/ref7.png similarity index 100% rename from test/refimg/gadfly/ref7.png rename to deprecated/test/refimg/gadfly/ref7.png diff --git a/test/refimg/gadfly/ref8.png b/deprecated/test/refimg/gadfly/ref8.png similarity index 100% rename from test/refimg/gadfly/ref8.png rename to deprecated/test/refimg/gadfly/ref8.png diff --git a/test/refimg/gadfly/ref9.png b/deprecated/test/refimg/gadfly/ref9.png similarity index 100% rename from test/refimg/gadfly/ref9.png rename to deprecated/test/refimg/gadfly/ref9.png diff --git a/test/refimg/pyplot/ref1.png b/deprecated/test/refimg/pyplot/ref1.png similarity index 100% rename from test/refimg/pyplot/ref1.png rename to deprecated/test/refimg/pyplot/ref1.png diff --git a/test/refimg/pyplot/ref10.png b/deprecated/test/refimg/pyplot/ref10.png similarity index 100% rename from test/refimg/pyplot/ref10.png rename to deprecated/test/refimg/pyplot/ref10.png diff --git a/test/refimg/pyplot/ref11.png b/deprecated/test/refimg/pyplot/ref11.png similarity index 100% rename from test/refimg/pyplot/ref11.png rename to deprecated/test/refimg/pyplot/ref11.png diff --git a/test/refimg/pyplot/ref12.png b/deprecated/test/refimg/pyplot/ref12.png similarity index 100% rename from test/refimg/pyplot/ref12.png rename to deprecated/test/refimg/pyplot/ref12.png diff --git a/test/refimg/pyplot/ref13.png b/deprecated/test/refimg/pyplot/ref13.png similarity index 100% rename from test/refimg/pyplot/ref13.png rename to deprecated/test/refimg/pyplot/ref13.png diff --git a/test/refimg/pyplot/ref14.png b/deprecated/test/refimg/pyplot/ref14.png similarity index 100% rename from test/refimg/pyplot/ref14.png rename to deprecated/test/refimg/pyplot/ref14.png diff --git a/test/refimg/pyplot/ref15.png b/deprecated/test/refimg/pyplot/ref15.png similarity index 100% rename from test/refimg/pyplot/ref15.png rename to deprecated/test/refimg/pyplot/ref15.png diff --git a/test/refimg/pyplot/ref16.png b/deprecated/test/refimg/pyplot/ref16.png similarity index 100% rename from test/refimg/pyplot/ref16.png rename to deprecated/test/refimg/pyplot/ref16.png diff --git a/test/refimg/pyplot/ref17.png b/deprecated/test/refimg/pyplot/ref17.png similarity index 100% rename from test/refimg/pyplot/ref17.png rename to deprecated/test/refimg/pyplot/ref17.png diff --git a/test/refimg/pyplot/ref18.png b/deprecated/test/refimg/pyplot/ref18.png similarity index 100% rename from test/refimg/pyplot/ref18.png rename to deprecated/test/refimg/pyplot/ref18.png diff --git a/test/refimg/pyplot/ref2.png b/deprecated/test/refimg/pyplot/ref2.png similarity index 100% rename from test/refimg/pyplot/ref2.png rename to deprecated/test/refimg/pyplot/ref2.png diff --git a/test/refimg/pyplot/ref20.png b/deprecated/test/refimg/pyplot/ref20.png similarity index 100% rename from test/refimg/pyplot/ref20.png rename to deprecated/test/refimg/pyplot/ref20.png diff --git a/test/refimg/pyplot/ref21.png b/deprecated/test/refimg/pyplot/ref21.png similarity index 100% rename from test/refimg/pyplot/ref21.png rename to deprecated/test/refimg/pyplot/ref21.png diff --git a/test/refimg/pyplot/ref22.png b/deprecated/test/refimg/pyplot/ref22.png similarity index 100% rename from test/refimg/pyplot/ref22.png rename to deprecated/test/refimg/pyplot/ref22.png diff --git a/test/refimg/pyplot/ref24.png b/deprecated/test/refimg/pyplot/ref24.png similarity index 100% rename from test/refimg/pyplot/ref24.png rename to deprecated/test/refimg/pyplot/ref24.png diff --git a/test/refimg/pyplot/ref3.png b/deprecated/test/refimg/pyplot/ref3.png similarity index 100% rename from test/refimg/pyplot/ref3.png rename to deprecated/test/refimg/pyplot/ref3.png diff --git a/test/refimg/pyplot/ref4.png b/deprecated/test/refimg/pyplot/ref4.png similarity index 100% rename from test/refimg/pyplot/ref4.png rename to deprecated/test/refimg/pyplot/ref4.png diff --git a/test/refimg/pyplot/ref5.png b/deprecated/test/refimg/pyplot/ref5.png similarity index 100% rename from test/refimg/pyplot/ref5.png rename to deprecated/test/refimg/pyplot/ref5.png diff --git a/test/refimg/pyplot/ref6.png b/deprecated/test/refimg/pyplot/ref6.png similarity index 100% rename from test/refimg/pyplot/ref6.png rename to deprecated/test/refimg/pyplot/ref6.png diff --git a/test/refimg/pyplot/ref7.png b/deprecated/test/refimg/pyplot/ref7.png similarity index 100% rename from test/refimg/pyplot/ref7.png rename to deprecated/test/refimg/pyplot/ref7.png diff --git a/test/refimg/pyplot/ref8.png b/deprecated/test/refimg/pyplot/ref8.png similarity index 100% rename from test/refimg/pyplot/ref8.png rename to deprecated/test/refimg/pyplot/ref8.png diff --git a/test/refimg/pyplot/ref9.png b/deprecated/test/refimg/pyplot/ref9.png similarity index 100% rename from test/refimg/pyplot/ref9.png rename to deprecated/test/refimg/pyplot/ref9.png diff --git a/test/test_plottypes.jl b/deprecated/test/test_plottypes.jl similarity index 100% rename from test/test_plottypes.jl rename to deprecated/test/test_plottypes.jl diff --git a/test/imgcomp.jl b/test/imgcomp.jl index b8c65878..85ff1266 100644 --- a/test/imgcomp.jl +++ b/test/imgcomp.jl @@ -1,11 +1,4 @@ -# # include this first to help with crashing?? -# try -# @eval using Gtk -# catch err -# warn("Gtk not loaded. err: $err") -# end - using VisualRegressionTests using ExamplePlots @@ -17,53 +10,10 @@ try info("Matplotlib version: $(PyPlot.matplotlib[:__version__])") end -# include("../docs/example_generation.jl") - using Plots, FactCheck -# import Images, ImageMagick -# if !isdefined(ImageMagick, :init_deps) -# function ImageMagick.init_deps() -# ccall((:MagickWandGenesis,libwand), Void, ()) -# end -# end - -# function makeImageWidget(fn) -# img = Gtk.GtkImageLeaf(fn) -# vbox = Gtk.GtkBoxLeaf(:v) -# push!(vbox, Gtk.GtkLabelLeaf(fn)) -# push!(vbox, img) -# show(img) -# vbox -# end - -# function replaceReferenceImage(tmpfn, reffn) -# cmd = `cp $tmpfn $reffn` -# run(cmd) -# info("Replaced reference image with: $cmd") -# end - -# "Show a Gtk popup with both images and a confirmation whether we should replace the new image with the old one" -# function compareToReferenceImage(tmpfn, reffn) - -# # add the images -# imgbox = Gtk.GtkBoxLeaf(:h) -# push!(imgbox, makeImageWidget(tmpfn)) -# push!(imgbox, makeImageWidget(reffn)) - -# win = Gtk.GtkWindowLeaf("Should we make this the new reference image?") -# push!(win, Gtk.GtkFrameLeaf(imgbox)) - -# showall(win) - -# # now ask the question -# if Gtk.ask_dialog("Should we make this the new reference image?", "No", "Yes") -# replaceReferenceImage(tmpfn, reffn) -# end - -# destroy(win) -# end +default(size=(500,300)) # TODO: use julia's Condition type and the wait() and notify() functions to initialize a Window, then wait() on a condition that @@ -87,18 +37,8 @@ function image_comparison_tests(pkg::Symbol, idx::Int; debug = false, popup = is png(fn) end - # run the example - # map(eval, PlotExamples._examples[idx].exprs) - - # # save the png - # tmpfn = tempname() * ".png" - # png(tmpfn) - - # # load the saved png - # tmpimg = Images.load(tmpfn) - # reference image directory setup - refdir = joinpath(Pkg.dir("Plots"), "test", "refimg", string(pkg)) + refdir = joinpath(Pkg.dir("ExamplePlots"), "test", "refimg", string(pkg)) try run(`mkdir -p $refdir`) catch err @@ -109,42 +49,6 @@ function image_comparison_tests(pkg::Symbol, idx::Int; debug = false, popup = is # the test vtest = VisualTest(func, reffn, idx) test_images(vtest, popup=popup, sigma=sigma, eps=eps) - - # try - - # # info("Comparing $tmpfn to reference $reffn") - - # # load the reference image - # refimg = Images.load(reffn) - - # # run the comparison test... a difference will throw an error - # # NOTE: sigma is a 2-length vector with x/y values for the number of pixels - # # to blur together when comparing images - # diffpct = Images.test_approx_eq_sigma_eps(tmpimg, refimg, sigma, eps) - - # # we passed! - # info("Reference image $reffn matches. Difference: $diffpct") - # return true - - # catch err - # warn("Image did not match reference image $reffn. err: $err") - # # showerror(Base.STDERR, err) - - # if isinteractive() - - # # if we're in interactive mode, open a popup and give us a chance to examine the images - # warn("Should we make this the new reference image?") - # compareToReferenceImage(tmpfn, reffn) - # # println("exited") - # return - - # else - - # # if we rejected the image, or if we're in automated tests, throw the error - # rethrow(err) - # end - - # end end function image_comparison_facts(pkg::Symbol; skip = [], debug = false, sigma = [1,1], eps = 1e-2) diff --git a/test/runtests.jl b/test/runtests.jl index 46887353..ba2b498e 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,35 +1,10 @@ module PlotsTests - -# # don't let pyplot use a gui... it'll crash -# # note: Agg will set gui -> :none in PyPlot -# ENV["MPLBACKEND"] = "Agg" -# try -# @eval import PyPlot -# catch err -# warn("Couldn't import PyPlot: $err") -# end - - -# using Plots -# using FactCheck - -# # note: wrap first include in a try block because of the ImageMagick init_deps bug -# try -# include("imgcomp.jl") -# end include("imgcomp.jl") # don't actually show the plots srand(1234) default(show=false) - -# note: we wrap in a try block so that the tests only run if we have the backend installed -# try - # Pkg.installed("Gadfly") - # gadfly() - # backend() - img_eps = 5e-2 facts("Gadfly") do @@ -37,116 +12,19 @@ facts("Gadfly") do @fact backend() --> Plots.GadflyPackage() @fact typeof(plot(1:10)) --> Plots.Plot{Plots.GadflyPackage} - - # plot(x::AVec, y::AVec; kw...) # one line (will assert length(x) == length(y)) @fact plot(Int[1,2,3], rand(3)) --> not(nothing) - # @fact_throws plot(1:5, 1:4) - - # plot(x::AVec, y::AMat; kw...) # multiple lines (one per column of x), all sharing x (will assert length(x) == size(y,1)) @fact plot(sort(rand(10)), rand(Int, 10, 3)) --> not(nothing) - # @fact_throws(plot!(rand(10), rand(9,2))) - - # plot(x::AMat, y::AMat; kw...) # multiple lines (one per column of x/y... will assert size(x) == size(y)) @fact plot!(rand(10,3), rand(10,3)) --> not(nothing) image_comparison_facts(:gadfly, skip=[4,6,19,23,24], eps=img_eps) end - facts("PyPlot") do @fact pyplot() --> Plots.PyPlotPackage() @fact backend() --> Plots.PyPlotPackage() + image_comparison_facts(:pyplot, skip=[10,19,21,23], eps=img_eps) end - -# catch err -# warn("Skipped Gadfly due to: ", string(err)) -# end - -# # note: we wrap in a try block so that the tests only run if we have the backend installed -# try -# Pkg.installed("Qwt") -# qwt() -# backend() -# facts("Qwt") do -# @fact backend(:qwt) --> Plots.QwtPackage() -# @fact backend() --> Plots.QwtPackage() -# @fact typeof(plot(1:10)) --> Plots.Plot{Plots.QwtPackage} - -# # plot(y::AVec; kw...) # one line... x = 1:length(y) -# @fact plot(1:10) --> not(nothing) -# @fact length(current().o.lines) --> 1 - -# # plot(x::AVec, f::Function; kw...) # one line, y = f(x) -# @fact plot(1:10, sin) --> not(nothing) -# @fact current().o.lines[1].y --> sin(collect(1:10)) - -# # plot(x::AMat, f::Function; kw...) # multiple lines, yᵢⱼ = f(xᵢⱼ) -# @fact plot(rand(10,2), sin) --> not(nothing) -# @fact length(current().o.lines) --> 2 - -# # plot(y::AMat; kw...) # multiple lines (one per column of x), all sharing x = 1:size(y,1) -# @fact plot!(rand(10,2)) --> not(nothing) -# @fact length(current().o.lines) --> 4 - -# # plot(x::AVec, fs::AVec{Function}; kw...) # multiple lines, yᵢⱼ = fⱼ(xᵢ) -# @fact plot(1:10, Function[sin,cos]) --> not(nothing) -# @fact current().o.lines[1].y --> sin(collect(1:10)) -# @fact current().o.lines[2].y --> cos(collect(1:10)) - -# # plot(y::AVec{AVec}; kw...) # multiple lines, each with x = 1:length(y[i]) -# @fact plot([11:20 ; rand(10)]) --> not(nothing) -# @fact current().o.lines[1].x[4] --> 4 -# @fact current().o.lines[1].y[4] --> 14 -# end -# catch err -# warn("Skipped Qwt due to: ", string(err)) -# end - -# try - # Pkg.installed("PyPlot") - # pyplot() - # backend() - # facts("PyPlot") do - # @fact backend(:pyplot) --> Plots.PyPlotPackage() - # @fact backend() --> Plots.PyPlotPackage() - # @fact typeof(plot(1:10)) --> Plots.Plot{Plots.PyPlotPackage} - - # # image_comparison_facts(:pyplot, skip=[19]) - # end -# catch err -# warn("Skipped PyPlot due to: ", string(err)) -# end - - -# try -# Pkg.installed("UnicodePlots") -# unicodeplots() -# backend() -# facts("UnicodePlots") do -# @fact backend(:unicodeplots) --> Plots.UnicodePlotsPackage() -# @fact backend() --> Plots.UnicodePlotsPackage() -# @fact typeof(plot(1:10)) --> Plots.Plot{Plots.UnicodePlotsPackage} -# end -# catch err -# warn("Skipped UnicodePlots due to: ", string(err)) -# end - - -# try -# Pkg.installed("Winston") -# winston() -# backend() -# facts("Winston") do -# @fact backend(:winston) --> Plots.WinstonPackage() -# @fact backend() --> Plots.WinstonPackage() -# @fact typeof(plot(1:10)) --> Plots.Plot{Plots.WinstonPackage} -# end -# catch err -# warn("Skipped Winston due to: ", string(err)) -# end - - FactCheck.exitstatus() end # module From eef1981f20caf360535beb2152aa18ffce97cd90 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Thu, 4 Feb 2016 14:20:34 -0500 Subject: [PATCH 060/121] travis --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index b09560e8..275f1d99 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,7 +17,7 @@ script: # - julia -e 'Pkg.clone("ImageMagick"); Pkg.build("ImageMagick")' - julia -e 'Pkg.clone("https://github.com/tbreloff/VisualRegressionTests.jl.git");' - julia -e 'Pkg.clone("https://github.com/tbreloff/ExamplePlots.jl.git");' - # - julia -e 'Pkg.clone("Cairo"); Pkg.build("Cairo")' - # - julia -e 'ENV["PYTHON"] = ""; Pkg.clone("PyPlot"); Pkg.build("PyPlot")' + - julia -e 'Pkg.clone("Cairo"); Pkg.build("Cairo")' + - julia -e 'ENV["PYTHON"] = ""; Pkg.clone("PyPlot"); Pkg.build("PyPlot")' - julia -e 'Pkg.test("Plots"; coverage=false)' # - julia -e 'cd(Pkg.dir("Plots")); Pkg.add("Coverage"); using Coverage; Coveralls.submit(process_folder()); Codecov.submit(process_folder())' From f74d6197486035007a3f664a2b8976dec5139ede Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Thu, 4 Feb 2016 16:05:21 -0500 Subject: [PATCH 061/121] pgfplots supported --- src/Plots.jl | 5 --- src/backends/gr.jl | 8 ++--- src/backends/supported.jl | 66 +++++++++++++++++++++++++++++++++++++++ src/utils.jl | 2 +- 4 files changed, 71 insertions(+), 10 deletions(-) diff --git a/src/Plots.jl b/src/Plots.jl index 5c85dad6..8fbb37f9 100644 --- a/src/Plots.jl +++ b/src/Plots.jl @@ -121,11 +121,6 @@ export # spy, corrplot -# --------------------------------------------------------- - - -const IMG_DIR = Pkg.dir("Plots") * "/img/" - # --------------------------------------------------------- diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 3b1488b2..77244e05 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -368,11 +368,11 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, diag = sqrt((viewport[2] - viewport[1])^2 + (viewport[4] - viewport[3])^2) charheight = max(0.018 * diag, 0.01) ticksize = 0.01 * (viewport[2] - viewport[1]) - GR.savestate() + # GR.savestate() GR.setlinewidth(1) GR.grid3d(xtick, 0, ztick, xmin, ymin, zmin, 2, 0, 2) GR.grid3d(0, ytick, 0, xmax, ymin, zmin, 0, 2, 0) - GR.restorestate() + # GR.restorestate() z = reshape(z, length(x) * length(y)) if p[:linetype] == :surface GR.setcolormap(GR.COLORMAP_COOLWARM) @@ -400,11 +400,11 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, diag = sqrt((viewport[2] - viewport[1])^2 + (viewport[4] - viewport[3])^2) charheight = max(0.018 * diag, 0.01) ticksize = 0.01 * (viewport[2] - viewport[1]) - GR.savestate() + # GR.savestate() GR.setlinewidth(1) GR.grid3d(xtick, 0, ztick, xmin, ymin, zmin, 2, 0, 2) GR.grid3d(0, ytick, 0, xmax, ymin, zmin, 0, 2, 0) - GR.restorestate() + # GR.restorestate() if p[:linetype] == :scatter3d haskey(p, :markercolor) && GR.setmarkercolorind(gr_getcolorind(p[:markercolor])) haskey(p, :markershape) && GR.setmarkertype(gr_markertype[p[:markershape]]) diff --git a/src/backends/supported.jl b/src/backends/supported.jl index 76b69c08..f10d75cc 100644 --- a/src/backends/supported.jl +++ b/src/backends/supported.jl @@ -630,3 +630,69 @@ supportedStyles(::GLVisualizePackage) = [:auto, :solid] #, :dash, :dot, :dashdot supportedMarkers(::GLVisualizePackage) = [:none, :auto, :ellipse] #, :rect, :diamond, :utriangle, :dtriangle, :cross, :xcross, :star5] #vcat(_allMarkers, Shape) supportedScales(::GLVisualizePackage) = [:identity] #, :log, :log2, :log10, :asinh, :sqrt] subplotSupported(::GLVisualizePackage) = false + +# -------------------------------------------------------------------------------------- + +supportedArgs(::PGFPlotsPackage) = [ + # :annotation, + # :axis, + # :background_color, + # :color_palette, + # :fillrange, + # :fillcolor, + # :fillalpha, + # :foreground_color, + # :group, + # :label, + # :layout, + # :legend, + # :linecolor, + # :linestyle, + # :linetype, + # :linewidth, + # :linealpha, + # :markershape, + # :markercolor, + # :markersize, + # :markeralpha, + # :markerstrokewidth, + # :markerstrokecolor, + # :markerstrokestyle, + # :n, + # :nbins, + # :nc, + # :nr, + # :pos, + # :smooth, + # :show, + # :size, + # :title, + # :windowtitle, + # :x, + # :xlabel, + # :xlims, + # :xticks, + # :y, + # :ylabel, + # :ylims, + # :yrightlabel, + # :yticks, + # :xscale, + # :yscale, + # :xflip, + # :yflip, + # :z, + # :tickfont, + # :guidefont, + # :legendfont, + # :grid, + # :surface + # :levels, + ] +supportedAxes(::PGFPlotsPackage) = [:auto, :left] +supportedTypes(::PGFPlotsPackage) = [:contour] #, :path, :scatter ,:steppre, :steppost, :sticks, :heatmap, :hexbin, :hist, :bar, :hline, :vline, :contour] +supportedStyles(::PGFPlotsPackage) = [:auto, :solid] #, :dash, :dot, :dashdot, :dashdotdot] +supportedMarkers(::PGFPlotsPackage) = [:none, :auto, :ellipse] #, :rect, :diamond, :utriangle, :dtriangle, :cross, :xcross, :star5] #vcat(_allMarkers, Shape) +supportedScales(::PGFPlotsPackage) = [:identity] #, :log, :log2, :log10, :asinh, :sqrt] +subplotSupported(::PGFPlotsPackage) = false + diff --git a/src/utils.jl b/src/utils.jl index 68d27cb3..b0980e14 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -445,7 +445,7 @@ function dumpSupportGraphs() for func in (supportGraphArgs, supportGraphTypes, supportGraphStyles, supportGraphMarkers, supportGraphScales, supportGraphAxes) plt = func() - png(IMG_DIR * "/supported/$(string(func))") + png(joinpath(Pkg.dir("ExamplePlots"), "docs", "examples", "img", "supported", "$(string(func))")) end end From a319c0c94adae6e8f6eabb75d88bee18add018bb Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Fri, 5 Feb 2016 15:10:12 -0500 Subject: [PATCH 062/121] legend and colorbar overhaul --- src/args.jl | 34 +++++++++++++++++++++++++++++++++- src/backends/gadfly.jl | 13 +++++++++---- src/backends/gadfly_shapes.jl | 2 +- src/backends/gr.jl | 2 +- src/backends/plotly.jl | 4 ++-- src/backends/pyplot.jl | 21 ++++++++++++++++----- src/backends/supported.jl | 2 ++ src/backends/unicodeplots.jl | 2 +- src/backends/winston.jl | 2 +- 9 files changed, 66 insertions(+), 16 deletions(-) diff --git a/src/args.jl b/src/args.jl index 78e3c59f..6fb2bfbb 100644 --- a/src/args.jl +++ b/src/args.jl @@ -150,7 +150,8 @@ _plotDefaults[:title] = "" _plotDefaults[:xlabel] = "" _plotDefaults[:ylabel] = "" _plotDefaults[:yrightlabel] = "" -_plotDefaults[:legend] = true +_plotDefaults[:legend] = :best +_plotDefaults[:colorbar] = :legend _plotDefaults[:background_color] = colorant"white" _plotDefaults[:foreground_color] = :auto _plotDefaults[:xlims] = :auto @@ -272,6 +273,9 @@ end :ylabel2 => :yrightlabel, :y2label => :yrightlabel, :leg => :legend, + :key => :legend, + :cbar => :colorbar, + :cb => :colorbar, :bg => :background_color, :bgcolor => :background_color, :bg_color => :background_color, @@ -532,6 +536,14 @@ function preprocessArgs!(d::Dict) # convert into strokes and brushes + # legends + if haskey(d, :legend) + d[:legend] = convertLegendValue(d[:legend]) + end + if haskey(d, :colorbar) + d[:colorbar] = convertLegendValue(d[:colorbar]) + end + # handle subplot links if haskey(d, :link) l = d[:link] @@ -639,6 +651,19 @@ function setDictValue(d_in::Dict, d_out::Dict, k::Symbol, idx::Int, defaults::Di end end +function convertLegendValue(val::Symbol) + if val in (:both, :all, :yes) + :best + elseif val in (:no, :none) + :none + elseif val in (:right, :left, :top, :bottom, :inside, :best, :legend) + val + else + error("Invalid symbol for legend: $val") + end +end +convertLegendValue(val::Bool) = val ? :best : :none + # ----------------------------------------------------------------------------- # build the argument dictionary for the plot @@ -659,6 +684,13 @@ function getPlotArgs(pkg::PlottingPackage, kw, idx::Int; set_defaults = true) end end + # handle legend/colorbar + d[:legend] = convertLegendValue(d[:legend]) + d[:colorbar] = convertLegendValue(d[:colorbar]) + if d[:colorbar] == :legend + d[:colorbar] = d[:legend] + end + # convert color handlePlotColors(pkg, d) diff --git a/src/backends/gadfly.jl b/src/backends/gadfly.jl index 4a72205e..620d20b1 100644 --- a/src/backends/gadfly.jl +++ b/src/backends/gadfly.jl @@ -201,6 +201,7 @@ function getGadflyMarkerTheme(d::Dict, plotargs::Dict) end function addGadflyContColorScale(plt::Plot{GadflyPackage}, c) + plt.plotargs[:colorbar] == :none && return if !isa(c, ColorGradient) c = colorscheme(:bluesreds) end @@ -233,7 +234,7 @@ end function addToGadflyLegend(plt::Plot, d::Dict) # add the legend? - if plt.plotargs[:legend] + if plt.plotargs[:legend] != :none gplt = getGadflyContext(plt) # add the legend if needed @@ -491,9 +492,13 @@ function updateGadflyPlotTheme(plt::Plot, d::Dict) # # TODO: should this be part of the main `plot` command in plot.jl??? # d = merge!(plt.plotargs, d) - # hide the legend? - if !get(d, :legend, true) - kwargs[:key_position] = :none + # # hide the legend? + # if !get(d, :legend, true) + # kwargs[:key_position] = :none + # end + leg = d[d[:legend] == :none ? :colorbar : :legend] + if leg != :best + kwargs[:key_position] = leg == :inside ? :right : leg end if !get(d, :grid, true) diff --git a/src/backends/gadfly_shapes.jl b/src/backends/gadfly_shapes.jl index 73ccd4ec..25672598 100644 --- a/src/backends/gadfly_shapes.jl +++ b/src/backends/gadfly_shapes.jl @@ -66,7 +66,7 @@ function Gadfly.render(geom::ShapeGeometry, theme::Gadfly.Theme, aes::Gadfly.Aes end function gadflyshape(sv::Shape) - ShapeGeometry([(x,-y) for (x,y) in sv.vertices]) + ShapeGeometry(sv.vertices) end diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 77244e05..8dcb5f65 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -435,7 +435,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, GR.restorestate() end - if d[:legend] && legend + if d[:legend] != :none && legend GR.savestate() GR.selntran(0) GR.setscale(0) diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index 9672638d..267ce197 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -231,8 +231,8 @@ function plotly_layout(d::Dict) d_out[:yaxis] = plotlyaxis(d, false) # legend - d_out[:showlegend] = d[:legend] - if d[:legend] + d_out[:showlegend] = d[:legend] != :none + if d[:legend] != :none d_out[:legend] = Dict{Symbol,Any}( :bgcolor => bgcolor, :bordercolor => fgcolor, diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 80772df7..200701e3 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -326,7 +326,10 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) if lt in (:scatter, :scatter3d) extra_kwargs[:s] = d[:markersize].^2 c = d[:markercolor] - if isa(c, ColorGradient) && d[:zcolor] != nothing + if d[:zcolor] != nothing + if !isa(c, ColorGradient) + c = colorscheme(:bluesreds) + end extra_kwargs[:c] = convert(Vector{Float64}, d[:zcolor]) extra_kwargs[:cmap] = getPyPlotColorMap(c, d[:markeralpha]) else @@ -405,8 +408,8 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) handleSmooth(plt, ax, d, d[:smooth]) # add the colorbar legend - if plt.plotargs[:legend] && haskey(extra_kwargs, :cmap) - PyPlot.colorbar(d[:serieshandle]) + if plt.plotargs[:colorbar] != :none && haskey(extra_kwargs, :cmap) + PyPlot.colorbar(d[:serieshandle], ax=ax) end # @show extra_kwargs @@ -671,15 +674,23 @@ end # ----------------------------------------------------------------- +const _pyplot_legend_pos = Dict( + :right => "right", + :left => "center left", + :top => "upper center", + :bottom => "lower center" + ) + # function addPyPlotLegend(plt::Plot) function addPyPlotLegend(plt::Plot, ax) - if plt.plotargs[:legend] + leg = plt.plotargs[:legend] + if leg != :none # gotta do this to ensure both axes are included args = filter(x -> !(x[:linetype] in (:hist,:density,:hexbin,:heatmap,:hline,:vline,:contour, :surface, :wireframe, :path3d, :scatter3d)), plt.seriesargs) if length(args) > 0 leg = ax[:legend]([d[:serieshandle] for d in args], [d[:label] for d in args], - loc="best", + loc = get(_pyplot_legend_pos, leg, "best"), fontsize = plt.plotargs[:legendfont].pointsize # framealpha = 0.6 ) diff --git a/src/backends/supported.jl b/src/backends/supported.jl index f10d75cc..db18577a 100644 --- a/src/backends/supported.jl +++ b/src/backends/supported.jl @@ -33,6 +33,7 @@ supportedArgs(::GadflyPackage) = [ :label, :layout, :legend, + :colorbar, :linestyle, :linetype, :linewidth, @@ -114,6 +115,7 @@ supportedArgs(::PyPlotPackage) = [ :label, :layout, :legend, + :colorbar, :linestyle, :linetype, :linewidth, diff --git a/src/backends/unicodeplots.jl b/src/backends/unicodeplots.jl index 6c959241..b2da0c11 100644 --- a/src/backends/unicodeplots.jl +++ b/src/backends/unicodeplots.jl @@ -59,7 +59,7 @@ function rebuildUnicodePlot!(plt::Plot) # now use the ! functions to add to the plot for d in sargs - addUnicodeSeries!(o, d, iargs[:legend], xlim, ylim) + addUnicodeSeries!(o, d, iargs[:legend] != :none, xlim, ylim) end # save the object diff --git a/src/backends/winston.jl b/src/backends/winston.jl index 1e12f7ad..1bdae23b 100644 --- a/src/backends/winston.jl +++ b/src/backends/winston.jl @@ -205,7 +205,7 @@ end # ---------------------------------------------------------------- function addWinstonLegend(plt::Plot, wplt) - if plt.plotargs[:legend] + if plt.plotargs[:legend] != :none Winston.legend(wplt, [sd[:label] for sd in plt.seriesargs]) end end From ac3c041d6d91136c2de8e28d22dd5e096aff9ed0 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Fri, 5 Feb 2016 15:44:27 -0500 Subject: [PATCH 063/121] split plotly into 2 different backends: plotly and plotlyjs --- src/backends/plotly.jl | 10 +-- src/backends/plotly_blink.jl | 55 ----------------- src/backends/plotlyjs.jl | 116 +++++++++++++++++++++++++++++++++++ src/backends/supported.jl | 69 +++++++++++++++++++++ src/plotter2.jl | 2 + 5 files changed, 192 insertions(+), 60 deletions(-) delete mode 100644 src/backends/plotly_blink.jl create mode 100644 src/backends/plotlyjs.jl diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index 267ce197..184a434c 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -27,11 +27,11 @@ function _initialize_backend(::PlotlyPackage; kw...) # end borrowing (thanks :) ########################### - try - include(joinpath(Pkg.dir("Plots"), "src", "backends", "plotly_blink.jl")) - catch err - warn("Error including PlotlyJS: $err\n Note: Will fall back to built-in display.") - end + # try + # include(joinpath(Pkg.dir("Plots"), "src", "backends", "plotly_blink.jl")) + # catch err + # warn("Error including PlotlyJS: $err\n Note: Will fall back to built-in display.") + # end end # TODO: other initialization end diff --git a/src/backends/plotly_blink.jl b/src/backends/plotly_blink.jl deleted file mode 100644 index 414376c0..00000000 --- a/src/backends/plotly_blink.jl +++ /dev/null @@ -1,55 +0,0 @@ - -# override some methods to use PlotlyJS/Blink - -import PlotlyJS - -function _create_plot(pkg::PlotlyPackage; kw...) - d = Dict(kw) - # TODO: create the window/canvas/context that is the plot within the backend (call it `o`) - # TODO: initialize the plot... title, xlabel, bgcolor, etc - o = PlotlyJS.Plot(PlotlyJS.GenericTrace[], PlotlyJS.Layout(), - Base.Random.uuid4(), PlotlyJS.ElectronDisplay()) - - Plot(o, pkg, 0, d, Dict[]) -end - - -function _add_series(::PlotlyPackage, plt::Plot; kw...) - d = Dict(kw) - - # add to the data array - pdict = plotly_series(d) - typ = pop!(pdict, :type) - gt = PlotlyJS.GenericTrace(typ; pdict...) - push!(plt.o.data, gt) - if PlotlyJS.isactive(plt.o._display) - PlotlyJS.addtraces!(plt.o, gt) - end - - push!(plt.seriesargs, d) - plt -end - -# TODO: override this to update plot items (title, xlabel, etc) after creation -function _update_plot(plt::Plot{PlotlyPackage}, d::Dict) - pdict = plotly_layout(d) - plt.o.layout = PlotlyJS.Layout(pdict) - if PlotlyJS.isactive(plt.o._display) - PlotlyJS.relayout!(plt.o; pdict...) - end -end - - -function Base.display(::PlotsDisplay, plt::Plot{PlotlyPackage}) - dump(plt.o) - display(plt.o) -end - -function Base.display(::PlotsDisplay, plt::Subplot{PlotlyPackage}) - error() -end - -for (mime, fmt) in PlotlyJS._mimeformats - @eval Base.writemime(io::IO, m::MIME{symbol($mime)}, p::Plot{PlotlyPackage}) = - writemime(io, m, p.o) -end diff --git a/src/backends/plotlyjs.jl b/src/backends/plotlyjs.jl new file mode 100644 index 00000000..e2f74f47 --- /dev/null +++ b/src/backends/plotlyjs.jl @@ -0,0 +1,116 @@ + +# https://github.com/spencerlyon2/PlotlyJS.jl + +function _initialize_backend(::PlotlyJSPackage; kw...) + @eval begin + import PlotlyJS + export PlotlyJS + end + + for (mime, fmt) in PlotlyJS._mimeformats + @eval Base.writemime(io::IO, m::MIME{symbol($mime)}, p::Plot{PlotlyJSPackage}) = + writemime(io, m, p.o) + end +end + +# --------------------------------------------------------------------------- + +function _create_plot(pkg::PlotlyJSPackage; kw...) + d = Dict(kw) + # TODO: create the window/canvas/context that is the plot within the backend (call it `o`) + # TODO: initialize the plot... title, xlabel, bgcolor, etc + o = PlotlyJS.Plot(PlotlyJS.GenericTrace[], PlotlyJS.Layout(), + Base.Random.uuid4(), PlotlyJS.ElectronDisplay()) + + Plot(o, pkg, 0, d, Dict[]) +end + + +function _add_series(::PlotlyJSPackage, plt::Plot; kw...) + d = Dict(kw) + + # add to the data array + pdict = plotly_series(d) + typ = pop!(pdict, :type) + gt = PlotlyJS.GenericTrace(typ; pdict...) + push!(plt.o.data, gt) + if PlotlyJS.isactive(plt.o._display) + PlotlyJS.addtraces!(plt.o, gt) + end + + push!(plt.seriesargs, d) + plt +end + + +# --------------------------------------------------------------------------- + + +function _add_annotations{X,Y,V}(plt::Plot{PlotlyJSPackage}, anns::AVec{@compat(Tuple{X,Y,V})}) + # set or add to the annotation_list + if haskey(plt.plotargs, :annotation_list) + append!(plt.plotargs[:annotation_list], anns) + else + plt.plotargs[:annotation_list] = anns + end +end + +# ---------------------------------------------------------------- + +function _before_update_plot(plt::Plot{PlotlyJSPackage}) +end + +# TODO: override this to update plot items (title, xlabel, etc) after creation +function _update_plot(plt::Plot{PlotlyJSPackage}, d::Dict) + pdict = plotly_layout(d) + plt.o.layout = PlotlyJS.Layout(pdict) + if PlotlyJS.isactive(plt.o._display) + PlotlyJS.relayout!(plt.o; pdict...) + end +end + + +function _update_plot_pos_size(plt::PlottingObject{PlotlyJSPackage}, d::Dict) +end + +# ---------------------------------------------------------------- + +# accessors for x/y data + +function Base.getindex(plt::Plot{PlotlyJSPackage}, i::Int) + d = plt.seriesargs[i] + d[:x], d[:y] +end + +function Base.setindex!(plt::Plot{PlotlyJSPackage}, xy::Tuple, i::Integer) + d = plt.seriesargs[i] + d[:x], d[:y] = xy + plt +end + +# ---------------------------------------------------------------- + +function _create_subplot(subplt::Subplot{PlotlyJSPackage}, isbefore::Bool) + # TODO: build the underlying Subplot object. this is where you might layout the panes within a GUI window, for example + true +end + +function _expand_limits(lims, plt::Plot{PlotlyJSPackage}, isx::Bool) + # TODO: call expand limits for each plot data +end + +function _remove_axis(plt::Plot{PlotlyJSPackage}, isx::Bool) + # TODO: if plot is inner subplot, might need to remove ticks or axis labels +end + +# ---------------------------------------------------------------- + +function Base.display(::PlotsDisplay, plt::Plot{PlotlyJSPackage}) + dump(plt.o) + display(plt.o) +end + +function Base.display(::PlotsDisplay, plt::Subplot{PlotlyJSPackage}) + error() +end + diff --git a/src/backends/supported.jl b/src/backends/supported.jl index db18577a..ee7d77b9 100644 --- a/src/backends/supported.jl +++ b/src/backends/supported.jl @@ -568,6 +568,75 @@ subplotSupported(::PlotlyPackage) = true stringsSupported(::PlotlyPackage) = true +# -------------------------------------------------------------------------------------- + +supportedArgs(::PlotlyJSPackage) = [ + :annotation, + # :axis, + :background_color, + :color_palette, + :fillrange, + :fillcolor, + :fillalpha, + :foreground_color, + :group, + :label, + :layout, + :legend, + :linecolor, + :linestyle, + :linetype, + :linewidth, + :linealpha, + :markershape, + :markercolor, + :markersize, + :markeralpha, + :markerstrokewidth, + :markerstrokecolor, + :markerstrokestyle, + :n, + :nbins, + :nc, + :nr, + # :pos, + # :smooth, + :show, + :size, + :title, + :windowtitle, + :x, + :xlabel, + :xlims, + :xticks, + :y, + :ylabel, + :ylims, + # :yrightlabel, + :yticks, + :xscale, + :yscale, + :xflip, + :yflip, + :z, + :zcolor, + :tickfont, + :guidefont, + :legendfont, + :grid, + :levels, + ] +supportedAxes(::PlotlyJSPackage) = [:auto, :left] +supportedTypes(::PlotlyJSPackage) = [:none, :line, :path, :scatter, :steppre, :steppost, + :heatmap, :hist, :density, :bar, :contour, :surface, :path3d, :scatter3d, + :pie] #,, :sticks, :hexbin, :hline, :vline] +supportedStyles(::PlotlyJSPackage) = [:auto, :solid, :dash, :dot, :dashdot] +supportedMarkers(::PlotlyJSPackage) = [:none, :auto, :ellipse, :rect, :diamond, :utriangle, :dtriangle, :cross, :xcross, + :pentagon, :hexagon, :octagon, :vline, :hline] #vcat(_allMarkers, Shape) +supportedScales(::PlotlyJSPackage) = [:identity, :log10] #, :ln, :log2, :log10, :asinh, :sqrt] +subplotSupported(::PlotlyJSPackage) = true +stringsSupported(::PlotlyJSPackage) = true + # -------------------------------------------------------------------------------------- supportedArgs(::GLVisualizePackage) = [ diff --git a/src/plotter2.jl b/src/plotter2.jl index 30bdc665..ac142ba6 100644 --- a/src/plotter2.jl +++ b/src/plotter2.jl @@ -34,10 +34,12 @@ end @init_plotting_pkg Winston @init_plotting_pkg Bokeh @init_plotting_pkg Plotly +@init_plotting_pkg PlotlyJS @init_plotting_pkg GR @init_plotting_pkg GLVisualize @init_plotting_pkg PGFPlots +include("backends/web.jl") include("backends/supported.jl") # --------------------------------------------------------- From 5db9493d2b90410b0a57245d56f6f3d437927206 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Mon, 8 Feb 2016 13:42:23 -0500 Subject: [PATCH 064/121] added dependency on Requires; added support for plotting tuples/FixedSizeArrays; added animate macro; legend ignores empty labels in gadfly/pyplot --- REQUIRE | 1 + src/Plots.jl | 2 ++ src/animation.jl | 33 +++++++++++++++++++++++++++++++++ src/backends/gadfly.jl | 2 +- src/backends/pyplot.jl | 1 + src/plot.jl | 19 +++++++++++++++++++ test/REQUIRE | 1 + 7 files changed, 58 insertions(+), 1 deletion(-) diff --git a/REQUIRE b/REQUIRE index 04b7f31e..92655edd 100644 --- a/REQUIRE +++ b/REQUIRE @@ -3,3 +3,4 @@ julia 0.4 Colors Reexport Compat +Requires diff --git a/src/Plots.jl b/src/Plots.jl index 8fbb37f9..7f4f4501 100644 --- a/src/Plots.jl +++ b/src/Plots.jl @@ -6,6 +6,7 @@ module Plots using Compat using Reexport @reexport using Colors +using Requires export Plot, @@ -114,6 +115,7 @@ export Animation, frame, gif, + @animate, # recipes PlotRecipe, diff --git a/src/animation.jl b/src/animation.jl index 5122000f..02c5e746 100644 --- a/src/animation.jl +++ b/src/animation.jl @@ -51,3 +51,36 @@ end function Base.writemime(io::IO, ::MIME"text/html", agif::AnimatedGif) write(io, "\" />") end + + +# ----------------------------------------------- + +""" +Collect one frame per for-block iteration and return an `Animation` object. + +Example: + +``` + p = plot(1) + anim = @animate for x=0:0.1:5 + push!(p, 1, sin(x)) + end +``` +""" +macro animate(forloop::Expr) + if forloop.head != :for + error("@animate macro expects a for-block. got: $(forloop.head)") + end + + # add the call to frame to the end of each iteration + animsym = gensym("anim") + block = forloop.args[2] + push!(block.args, :(frame($animsym))) + + # full expression: + esc(quote + $animsym = Animation() # init animation object + $forloop # for loop, saving a frame after each iteration + $animsym # return the animation object + end) +end diff --git a/src/backends/gadfly.jl b/src/backends/gadfly.jl index 620d20b1..bf8ca178 100644 --- a/src/backends/gadfly.jl +++ b/src/backends/gadfly.jl @@ -234,7 +234,7 @@ end function addToGadflyLegend(plt::Plot, d::Dict) # add the legend? - if plt.plotargs[:legend] != :none + if plt.plotargs[:legend] != :none && d[:label] != "" gplt = getGadflyContext(plt) # add the legend if needed diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 200701e3..7fbc1fab 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -687,6 +687,7 @@ function addPyPlotLegend(plt::Plot, ax) if leg != :none # gotta do this to ensure both axes are included args = filter(x -> !(x[:linetype] in (:hist,:density,:hexbin,:heatmap,:hline,:vline,:contour, :surface, :wireframe, :path3d, :scatter3d)), plt.seriesargs) + args = filter(x -> x[:label] != "", args) if length(args) > 0 leg = ax[:legend]([d[:serieshandle] for d in args], [d[:label] for d in args], diff --git a/src/plot.jl b/src/plot.jl index 8a1d1433..e1a6e09a 100644 --- a/src/plot.jl +++ b/src/plot.jl @@ -437,6 +437,25 @@ createKWargsList{T<:Real}(plt::PlottingObject, fx::FuncOrFuncs, fy::FuncOrFuncs, createKWargsList{T<:Real}(plt::PlottingObject, u::AVec{T}, fx::FuncOrFuncs, fy::FuncOrFuncs; kw...) = createKWargsList(plt, mapFuncOrFuncs(fx, u), mapFuncOrFuncs(fy, u); kw...) createKWargsList(plt::PlottingObject, fx::FuncOrFuncs, fy::FuncOrFuncs, umin::Real, umax::Real, numPoints::Int = 1000; kw...) = createKWargsList(plt, fx, fy, linspace(umin, umax, numPoints); kw...) +# (x,y) tuples +function createKWargsList{R1<:Real,R2<:Real}(plt::PlottingObject, xy::AVec{Tuple{R1,R2}}; kw...) + createKWargsList(plt, unzip(xy)...; kw...) +end +function createKWargsList{R1<:Real,R2<:Real}(plt::PlottingObject, xy::Tuple{R1,R2}; kw...) + createKWargsList(plt, [xy[1]], [xy[2]]; kw...) +end + +@require FixedSizeArrays begin + unzip{T}(x::AVec{FixedSizeArrays.Vec{2,T}}) = T[xi[1] for xi in x], T[xi[2] for xi in x] + unzip{T}(x::FixedSizeArrays.Vec{2,T}) = T[x[1]], T[x[2]] + + function createKWargsList{T<:Real}(plt::PlottingObject, xy::AVec{FixedSizeArrays.Vec{2,T}}; kw...) + createKWargsList(plt, unzip(xy)...; kw...) + end + function createKWargsList{T<:Real}(plt::PlottingObject, xy::FixedSizeArrays.Vec{2,T}; kw...) + createKWargsList(plt, [xy[1]], [xy[2]]; kw...) + end +end # special handling... no args... 1 series diff --git a/test/REQUIRE b/test/REQUIRE index 9ad44a64..17a29ad5 100644 --- a/test/REQUIRE +++ b/test/REQUIRE @@ -2,6 +2,7 @@ julia 0.4 Colors Reexport +Requires FactCheck Gadfly Images From aca03d26094d480cb939be6e16a5f4c8f90a1726 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Mon, 8 Feb 2016 14:23:02 -0500 Subject: [PATCH 065/121] replaced dataframes() with require block --- src/plot.jl | 46 +++++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/src/plot.jl b/src/plot.jl index e1a6e09a..add8c3ab 100644 --- a/src/plot.jl +++ b/src/plot.jl @@ -445,17 +445,6 @@ function createKWargsList{R1<:Real,R2<:Real}(plt::PlottingObject, xy::Tuple{R1,R createKWargsList(plt, [xy[1]], [xy[2]]; kw...) end -@require FixedSizeArrays begin - unzip{T}(x::AVec{FixedSizeArrays.Vec{2,T}}) = T[xi[1] for xi in x], T[xi[2] for xi in x] - unzip{T}(x::FixedSizeArrays.Vec{2,T}) = T[x[1]], T[x[2]] - - function createKWargsList{T<:Real}(plt::PlottingObject, xy::AVec{FixedSizeArrays.Vec{2,T}}; kw...) - createKWargsList(plt, unzip(xy)...; kw...) - end - function createKWargsList{T<:Real}(plt::PlottingObject, xy::FixedSizeArrays.Vec{2,T}; kw...) - createKWargsList(plt, [xy[1]], [xy[2]]; kw...) - end -end # special handling... no args... 1 series @@ -476,16 +465,34 @@ end # -------------------------------------------------------------------- -"For DataFrame support. Imports DataFrames and defines the necessary methods which support them." -function dataframes() - @eval import DataFrames - @eval function createKWargsList(plt::PlottingObject, df::DataFrames.AbstractDataFrame, args...; kw...) +@require FixedSizeArrays begin + + unzip{T}(x::AVec{FixedSizeArrays.Vec{2,T}}) = T[xi[1] for xi in x], T[xi[2] for xi in x] + unzip{T}(x::FixedSizeArrays.Vec{2,T}) = T[x[1]], T[x[2]] + + function createKWargsList{T<:Real}(plt::PlottingObject, xy::AVec{FixedSizeArrays.Vec{2,T}}; kw...) + createKWargsList(plt, unzip(xy)...; kw...) + end + + function createKWargsList{T<:Real}(plt::PlottingObject, xy::FixedSizeArrays.Vec{2,T}; kw...) + createKWargsList(plt, [xy[1]], [xy[2]]; kw...) + end + +end + +# -------------------------------------------------------------------- + +# For DataFrame support. Imports DataFrames and defines the necessary methods which support them. + +@require DataFrames begin + + function createKWargsList(plt::PlottingObject, df::DataFrames.AbstractDataFrame, args...; kw...) createKWargsList(plt, args...; kw..., dataframe = df) end # expecting the column name of a dataframe that was passed in... anything else should error - @eval function extractGroupArgs(s::Symbol, df::DataFrames.AbstractDataFrame, args...) + function extractGroupArgs(s::Symbol, df::DataFrames.AbstractDataFrame, args...) if haskey(df, s) return extractGroupArgs(df[s]) else @@ -493,7 +500,7 @@ function dataframes() end end - @eval function getDataFrameFromKW(; kw...) + function getDataFrameFromKW(; kw...) for (k,v) in kw if k == :dataframe return v @@ -503,8 +510,9 @@ function dataframes() end # the conversion functions for when we pass symbols or vectors of symbols to reference dataframes - @eval convertToAnyVector(s::Symbol; kw...) = Any[getDataFrameFromKW(;kw...)[s]], s - @eval convertToAnyVector(v::AVec{Symbol}; kw...) = (df = getDataFrameFromKW(;kw...); Any[df[s] for s in v]), v + convertToAnyVector(s::Symbol; kw...) = Any[getDataFrameFromKW(;kw...)[s]], s + convertToAnyVector(v::AVec{Symbol}; kw...) = (df = getDataFrameFromKW(;kw...); Any[df[s] for s in v]), v + end From 5f8ecfa3fae356f6d1165a68ec6311da9158c1ee Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Mon, 8 Feb 2016 14:24:25 -0500 Subject: [PATCH 066/121] deprecated plotter.jl --- {src => deprecated}/plotter.jl | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {src => deprecated}/plotter.jl (100%) diff --git a/src/plotter.jl b/deprecated/plotter.jl similarity index 100% rename from src/plotter.jl rename to deprecated/plotter.jl From 3e49af909390f361efdd692579a9bad0487f329f Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Tue, 9 Feb 2016 19:22:05 -0500 Subject: [PATCH 067/121] allow Function for fillrange and zcolor; fix fill kw --- src/args.jl | 11 +++++++++-- src/plot.jl | 8 ++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/args.jl b/src/args.jl index 6fb2bfbb..387a5f1c 100644 --- a/src/args.jl +++ b/src/args.jl @@ -493,7 +493,16 @@ function processFillArg(d::Dict, arg) arg.color == nothing || (d[:fillcolor] = arg.color == :auto ? :auto : colorscheme(arg.color)) arg.alpha == nothing || (d[:fillalpha] = arg.alpha) + # fillrange function + elseif trueOrAllTrue(a -> isa(a, Function), arg) + d[:fillrange] = arg + + # fillalpha + elseif trueOrAllTrue(a -> typeof(a) <: Real && a > 0 && a < 1, arg) + d[:fillalpha] = arg + elseif !handleColors!(d, arg, :fillcolor) + d[:fillrange] = arg end end @@ -746,8 +755,6 @@ function getSeriesArgs(pkg::PlottingPackage, plotargs::Dict, kw, commandIndex::I c = (c == :match ? d[:linecolor] : getSeriesRGBColor(c, plotargs, plotIndex)) d[:fillcolor] = c - # TODO: rebuild - # set label label = d[:label] label = (label == "AUTO" ? "y$globalIndex" : label) diff --git a/src/plot.jl b/src/plot.jl index add8c3ab..a73191ef 100644 --- a/src/plot.jl +++ b/src/plot.jl @@ -321,6 +321,14 @@ function createKWargsList(plt::PlottingObject, x, y; kw...) d[:linetype] = :path end + # map functions to vectors + if isa(d[:zcolor], Function) + d[:zcolor] = map(d[:zcolor], d[:x]) + end + if isa(d[:fillrange], Function) + d[:fillrange] = map(d[:fillrange], d[:x]) + end + # cleanup those fields that were used only for generating kw args for k in (:idxfilter, :numUncounted, :dataframe) delete!(d, k) From 6c6769ca98476a48f18a62c47580622c223a89f1 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Wed, 10 Feb 2016 13:09:22 -0500 Subject: [PATCH 068/121] handle vector of PlotText as annotations --- src/plot.jl | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/plot.jl b/src/plot.jl index a73191ef..c8c41605 100644 --- a/src/plot.jl +++ b/src/plot.jl @@ -186,12 +186,20 @@ updateDictWithMeta(d::Dict, plotargs::Dict, meta, isx::Bool) = nothing annotations(::@compat(Void)) = [] annotations{X,Y,V}(v::AVec{@compat(Tuple{X,Y,V})}) = v annotations{X,Y,V}(t::@compat(Tuple{X,Y,V})) = [t] +annotations(v::AVec{PlotText}) = v annotations(anns) = error("Expecting a tuple (or vector of tuples) for annotations: ", "(x, y, annotation)\n got: $(typeof(anns))") function _add_annotations(plt::Plot, d::Dict) anns = annotations(get(d, :annotation, nothing)) if !isempty(anns) + + # if we just have a list of PlotText objects, then create (x,y,text) tuples + if typeof(anns) <: AVec{PlotText} + x, y = plt[plt.n] + anns = Tuple{Float64,Float64,PlotText}[(x[i], y[i], t) for (i,t) in enumerate(anns)] + end + _add_annotations(plt, anns) end end From 6a4a78a26a2986605befab8174ce79241956b5f6 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Fri, 12 Feb 2016 15:17:31 -0500 Subject: [PATCH 069/121] skip pyplot test 13 --- test/runtests.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/runtests.jl b/test/runtests.jl index ba2b498e..601fe491 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -23,7 +23,7 @@ facts("PyPlot") do @fact pyplot() --> Plots.PyPlotPackage() @fact backend() --> Plots.PyPlotPackage() - image_comparison_facts(:pyplot, skip=[10,19,21,23], eps=img_eps) + image_comparison_facts(:pyplot, skip=[10,13,19,21,23], eps=img_eps) end FactCheck.exitstatus() From e8d4fd7aac001a17d65fc62230b1fff428e7fb40 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Fri, 12 Feb 2016 15:41:00 -0500 Subject: [PATCH 070/121] skip pyplot test 4 --- test/runtests.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/runtests.jl b/test/runtests.jl index 601fe491..4a691432 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -23,7 +23,7 @@ facts("PyPlot") do @fact pyplot() --> Plots.PyPlotPackage() @fact backend() --> Plots.PyPlotPackage() - image_comparison_facts(:pyplot, skip=[10,13,19,21,23], eps=img_eps) + image_comparison_facts(:pyplot, skip=[4,10,13,19,21,23], eps=img_eps) end FactCheck.exitstatus() From 0fdb48bda323e1a842fca20ed11816f79187a359 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Tue, 16 Feb 2016 16:22:54 -0500 Subject: [PATCH 071/121] fixes for ticks --- src/args.jl | 6 ++++++ src/backends/gadfly.jl | 2 +- src/backends/plotly.jl | 5 ----- src/backends/pyplot.jl | 3 ++- src/utils.jl | 1 + test/imgcomp.jl | 20 ++++++++++++++------ 6 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/args.jl b/src/args.jl index 387a5f1c..2f57f0ec 100644 --- a/src/args.jl +++ b/src/args.jl @@ -518,6 +518,12 @@ function preprocessArgs!(d::Dict) processAxisArg(d, axisletter, arg) end delete!(d, asym) + + # turn :labels into :ticks_and_labels + tsym = symbol(axisletter * "ticks") + if haskey(d, tsym) && ticksType(d[tsym]) == :labels + d[tsym] = (1:length(d[tsym]), d[tsym]) + end end # handle line args diff --git a/src/backends/gadfly.jl b/src/backends/gadfly.jl index bf8ca178..48cff987 100644 --- a/src/backends/gadfly.jl +++ b/src/backends/gadfly.jl @@ -369,7 +369,7 @@ function addGadflyTicksGuide(gplt, ticks, isx::Bool) gfunc = isx ? Gadfly.Scale.x_discrete : Gadfly.Scale.y_discrete labelmap = Dict(zip(ticks...)) labelfunc = val -> labelmap[val] - push!(gplt.scales, gfunc(levels = ticks[1], labels = labelfunc)) + push!(gplt.scales, gfunc(levels = collect(ticks[1]), labels = labelfunc)) else error("Invalid input for $(isx ? "xticks" : "yticks"): ", ticks) diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index 184a434c..2c2b86bc 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -27,11 +27,6 @@ function _initialize_backend(::PlotlyPackage; kw...) # end borrowing (thanks :) ########################### - # try - # include(joinpath(Pkg.dir("Plots"), "src", "backends", "plotly_blink.jl")) - # catch err - # warn("Error including PlotlyJS: $err\n Note: Will fall back to built-in display.") - # end end # TODO: other initialization end diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 7fbc1fab..1f280ef0 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -493,7 +493,8 @@ function addPyPlotTicks(ax, ticks, isx::Bool) if ttype == :ticks ax[isx ? :set_xticks : :set_yticks](ticks) elseif ttype == :ticks_and_labels - ax[isx ? :set_xticks : :set_yticks](ticks...) + ax[isx ? :set_xticks : :set_yticks](ticks[1]) + ax[isx ? :set_xticklabels : :set_yticklabels](ticks[2]) else error("Invalid input for $(isx ? "xticks" : "yticks"): ", ticks) end diff --git a/src/utils.jl b/src/utils.jl index b0980e14..5bc7d6dc 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -206,6 +206,7 @@ isscalar(::Any) = false # ticksType{T<:Real,S<:Real}(ticks::@compat(Tuple{T,S})) = :limits ticksType{T<:Real}(ticks::AVec{T}) = :ticks +ticksType{T<:AbstractString}(ticks::AVec{T}) = :labels ticksType{T<:AVec,S<:AVec}(ticks::@compat(Tuple{T,S})) = :ticks_and_labels ticksType(ticks) = :invalid diff --git a/test/imgcomp.jl b/test/imgcomp.jl index 85ff1266..bfc233df 100644 --- a/test/imgcomp.jl +++ b/test/imgcomp.jl @@ -16,6 +16,9 @@ using Plots, FactCheck default(size=(500,300)) +# reference image directory setup +_refdir = joinpath(Pkg.dir("ExamplePlots"), "test", "refimg", string(pkg)) + # TODO: use julia's Condition type and the wait() and notify() functions to initialize a Window, then wait() on a condition that # is referenced in a button press callback (the button clicked callback will call notify() on that condition) @@ -37,23 +40,28 @@ function image_comparison_tests(pkg::Symbol, idx::Int; debug = false, popup = is png(fn) end - # reference image directory setup - refdir = joinpath(Pkg.dir("ExamplePlots"), "test", "refimg", string(pkg)) try - run(`mkdir -p $refdir`) + run(`mkdir -p $(_refdir)`) catch err display(err) end - reffn = joinpath(refdir, "ref$idx.png") + reffn = joinpath(_refdir, "ref$idx.png") # the test vtest = VisualTest(func, reffn, idx) test_images(vtest, popup=popup, sigma=sigma, eps=eps) end -function image_comparison_facts(pkg::Symbol; skip = [], debug = false, sigma = [1,1], eps = 1e-2) +function image_comparison_facts(pkg::Symbol; + skip = [], # skip these examples (int index) + only = nothing, # limit to these examples (int index) + debug = false, # print debug information? + sigma = [1,1], # number of pixels to "blur" + eps = 1e-2) # acceptable error (percent) for i in 1:length(ExamplePlots._examples) i in skip && continue - @fact image_comparison_tests(pkg, i, debug=debug, sigma=sigma, eps=eps) |> success --> true + if only == nothing || i in only + @fact image_comparison_tests(pkg, i, debug=debug, sigma=sigma, eps=eps) |> success --> true + end end end From 92c9e82dee0eedfb9b0f9e4518c56ac126058a63 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Tue, 16 Feb 2016 16:45:46 -0500 Subject: [PATCH 072/121] fix refdir --- test/imgcomp.jl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/imgcomp.jl b/test/imgcomp.jl index bfc233df..e898e174 100644 --- a/test/imgcomp.jl +++ b/test/imgcomp.jl @@ -16,9 +16,6 @@ using Plots, FactCheck default(size=(500,300)) -# reference image directory setup -_refdir = joinpath(Pkg.dir("ExamplePlots"), "test", "refimg", string(pkg)) - # TODO: use julia's Condition type and the wait() and notify() functions to initialize a Window, then wait() on a condition that # is referenced in a button press callback (the button clicked callback will call notify() on that condition) @@ -34,6 +31,9 @@ function image_comparison_tests(pkg::Symbol, idx::Int; debug = false, popup = is # ensure consistent results srand(1234) + # reference image directory setup + refdir = joinpath(Pkg.dir("ExamplePlots"), "test", "refimg", string(pkg)) + # test function func = (fn, idx) -> begin map(eval, example.exprs) @@ -41,11 +41,11 @@ function image_comparison_tests(pkg::Symbol, idx::Int; debug = false, popup = is end try - run(`mkdir -p $(_refdir)`) + run(`mkdir -p $refdir`) catch err display(err) end - reffn = joinpath(_refdir, "ref$idx.png") + reffn = joinpath(refdir, "ref$idx.png") # the test vtest = VisualTest(func, reffn, idx) From b8d136588c105b476cffcbd7052affed2a43bc1c Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Tue, 16 Feb 2016 18:02:04 -0500 Subject: [PATCH 073/121] gif macro and every/when syntax --- src/Plots.jl | 1 + src/animation.jl | 82 ++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 67 insertions(+), 16 deletions(-) diff --git a/src/Plots.jl b/src/Plots.jl index 7f4f4501..313ff267 100644 --- a/src/Plots.jl +++ b/src/Plots.jl @@ -116,6 +116,7 @@ export frame, gif, @animate, + @gif, # recipes PlotRecipe, diff --git a/src/animation.jl b/src/animation.jl index 02c5e746..13075a78 100644 --- a/src/animation.jl +++ b/src/animation.jl @@ -55,6 +55,69 @@ end # ----------------------------------------------- +function _animate(forloop::Expr, args...; callgif = false) + if forloop.head != :for + error("@animate macro expects a for-block. got: $(forloop.head)") + end + + # add the call to frame to the end of each iteration + animsym = gensym("anim") + countersym = gensym("counter") + block = forloop.args[2] + + # create filter + n = length(args) + filterexpr = if n == 0 + # no filter... every iteration gets a frame + true + + elseif args[1] == :every + # filter every `freq` frames (starting with the first frame) + @assert n == 2 + freq = args[2] + @assert isa(freq, Integer) && freq > 0 + :(mod1($countersym, $freq) == 1) + + elseif args[1] == :when + # filter on custom expression + @assert n == 2 + args[2] + + else + error("Unsupported animate filter: $args") + end + + push!(block.args, :(if $filterexpr; frame($animsym); end)) + push!(block.args, :($countersym += 1)) + + # add a final call to `gif(anim)`? + retval = callgif ? :(gif($animsym)) : animsym + + # full expression: + esc(quote + $animsym = Animation() # init animation object + $countersym = 1 # init iteration counter + $forloop # for loop, saving a frame after each iteration + $retval # return the animation object, or the gif + end) +end + +""" +Builds an `Animation` using one frame per loop iteration, then create an animated GIF. + +Example: + +``` + p = plot(1) + @gif for x=0:0.1:5 + push!(p, 1, sin(x)) + end +``` +""" +macro gif(forloop::Expr, args...) + _animate(forloop, args...; callgif = true) +end + """ Collect one frame per for-block iteration and return an `Animation` object. @@ -65,22 +128,9 @@ Example: anim = @animate for x=0:0.1:5 push!(p, 1, sin(x)) end + gif(anim) ``` """ -macro animate(forloop::Expr) - if forloop.head != :for - error("@animate macro expects a for-block. got: $(forloop.head)") - end - - # add the call to frame to the end of each iteration - animsym = gensym("anim") - block = forloop.args[2] - push!(block.args, :(frame($animsym))) - - # full expression: - esc(quote - $animsym = Animation() # init animation object - $forloop # for loop, saving a frame after each iteration - $animsym # return the animation object - end) +macro animate(forloop::Expr, args...) + _animate(forloop, args...) end From 2a9fa9539f0f0bbd33784b6dd090f2c310366d27 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Wed, 17 Feb 2016 10:32:12 -0500 Subject: [PATCH 074/121] fixes to logic accepting arrays of values; additional fixes in gadfly and pyplot for this --- src/args.jl | 20 +++++++++++++++++--- src/backends/gadfly.jl | 13 +++++++++---- src/backends/pyplot.jl | 19 ++++++++++++++++++- 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/src/args.jl b/src/args.jl index 2f57f0ec..e9e55e9f 100644 --- a/src/args.jl +++ b/src/args.jl @@ -507,6 +507,11 @@ function processFillArg(d::Dict, arg) end end +_replace_markershape(shape::Symbol) = get(_markerAliases, shape, shape) +_replace_markershape(shapes::AVec) = map(_replace_markershape, shapes) +_replace_markershape(shape) = shape + + "Handle all preprocessing of args... break out colors/sizes/etc and replace aliases." function preprocessArgs!(d::Dict) replaceAliases!(d, _keyAliases) @@ -539,7 +544,12 @@ function preprocessArgs!(d::Dict) anymarker = true end delete!(d, :marker) - if anymarker && !haskey(d, :markershape) + # if anymarker && !haskey(d, :markershape) + # d[:markershape] = :ellipse + # end + if haskey(d, :markershape) + d[:markershape] = _replace_markershape(d[:markershape]) + elseif anymarker d[:markershape] = :ellipse end @@ -619,6 +629,9 @@ function warnOnUnsupportedArgs(pkg::PlottingPackage, d::Dict) end end +_markershape_supported(pkg::PlottingPackage, shape::Symbol) = shape in supportedMarkers(pkg) +_markershape_supported(pkg::PlottingPackage, shape::Shape) = Shape in supportedMarkers(pkg) +_markershape_supported(pkg::PlottingPackage, shapes::AVec) = all([_markershape_supported(pkg, shape) for shape in shapes]) function warnOnUnsupported(pkg::PlottingPackage, d::Dict) (d[:axis] in supportedAxes(pkg) @@ -629,8 +642,9 @@ function warnOnUnsupported(pkg::PlottingPackage, d::Dict) (d[:linestyle] in supportedStyles(pkg) || warn("linestyle $(d[:linestyle]) is unsupported with $pkg. Choose from: $(supportedStyles(pkg))")) (d[:markershape] == :none - || d[:markershape] in supportedMarkers(pkg) - || (Shape in supportedMarkers(pkg) && typeof(d[:markershape]) <: Shape) + || _markershape_supported(pkg, d[:markershape]) + # || 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 48cff987..f9593028 100644 --- a/src/backends/gadfly.jl +++ b/src/backends/gadfly.jl @@ -168,11 +168,16 @@ end # --------------------------------------------------------------------------- +# extract the underlying ShapeGeometry object(s) +getMarkerGeom(shape::Shape) = gadflyshape(shape) +getMarkerGeom(shape::Symbol) = gadflyshape(_shapes[shape]) +getMarkerGeom(shapes::AVec) = map(getMarkerGeom, shapes) +getMarkerGeom(d::Dict) = getMarkerGeom(d[:markershape]) -function getMarkerGeom(d::Dict) - shape = d[:markershape] - gadflyshape(isa(shape, Shape) ? shape : _shapes[shape]) -end +# function getMarkerGeom(d::Dict) +# shape = d[:markershape] +# gadflyshape(isa(shape, Shape) ? shape : _shapes[shape]) +# end function getGadflyMarkerTheme(d::Dict, plotargs::Dict) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 1f280ef0..ee87fd1d 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -31,6 +31,7 @@ end # convert colorant to 4-tuple RGBA getPyPlotColor(c::Colorant, α=nothing) = map(f->float(f(convertColor(c,α))), (red, green, blue, alpha)) +getPyPlotColor(cvec::ColorVector, α=nothing) = map(getPyPlotColor, convertColor(cvec, α).v) getPyPlotColor(scheme::ColorScheme, α=nothing) = getPyPlotColor(convertColor(getColor(scheme), α)) getPyPlotColor(c, α=nothing) = getPyPlotColor(convertColor(c, α)) # getPyPlotColor(c, alpha) = getPyPlotColor(colorscheme(c, alpha)) @@ -90,8 +91,14 @@ function getPyPlotMarker(marker::Symbol) return "o" end +# getPyPlotMarker(markers::AVec) = map(getPyPlotMarker, markers) +function getPyPlotMarker(markers::AVec) + warn("Vectors of markers are currently unsupported in PyPlot: $markers") + getPyPlotMarker(markers[1]) +end + # pass through -function getPyPlotMarker(marker::@compat(AbstractString)) +function getPyPlotMarker(marker::AbstractString) @assert length(marker) == 1 marker end @@ -249,11 +256,21 @@ end function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) d = Dict(kw) + # 3D plots have a different underlying Axes object in PyPlot lt = d[:linetype] if lt in _3dTypes && isempty(plt.o.kwargs) push!(plt.o.kwargs, (:projection, "3d")) end + # handle mismatched x/y sizes, as PyPlot doesn't like that + x, y = d[:x], d[:y] + nx, ny = map(length, (x,y)) + if nx < ny + d[:x] = Float64[x[mod1(i,nx)] for i=1:ny] + else + d[:y] = Float64[y[mod1(i,ny)] for i=1:nx] + end + ax = getAxis(plt, d[:axis]) if !(lt in supportedTypes(pkg)) error("linetype $(lt) is unsupported in PyPlot. Choose from: $(supportedTypes(pkg))") From c9388e9f563f1cd87399faede19312db186a0c09 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Thu, 18 Feb 2016 18:28:59 -0500 Subject: [PATCH 075/121] bezier curves --- src/components.jl | 55 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src/components.jl b/src/components.jl index 5c4be5ba..f4b8f337 100644 --- a/src/components.jl +++ b/src/components.jl @@ -241,3 +241,58 @@ type OHLC{T<:Real} low::T close::T end + + +@require FixedSizeArrays begin + + export + P2, + P3, + points, + BezierCurve + + typealias P2 FixedSizeArrays.Vec{2,Float64} + typealias P3 FixedSizeArrays.Vec{3,Float64} + + type BezierCurve{T <: FixedSizeArrays.Vec} + points::Vector{T} + end + + function Base.call(bc::BezierCurve, t::Real) + p = zero(P2) + n = length(bc.points)-1 + for i in 0:n + p += bc.points[i+1] * binomial(n, i) * (1-t)^(n-i) * t^i + end + p + end + + Base.mean(x::Real, y::Real) = 0.5*(x+y) + Base.mean{N,T<:Real}(p::FixedSizeArrays.Vec{N,T}, q::FixedSizeArrays.Vec{N,T}) = 0.5 * (p + q) + + points(curve::BezierCurve, n::Integer = 50) = map(curve, linspace(0,1,n)) + + function BezierCurve(p::P2, q::P2) + mn = mean(p,q) + yoffset = max(0.2, min(1.0, abs(mn[2]-p[2]))) + firstoffset = P2(0, yoffset) + + uppery = p + firstoffset + lowery = q - firstoffset + insideoffset = P2(0.2,0) + inside = [] + if abs(p[1]-q[1]) <= 0.1 && p[2] >= q[2] + inside = [uppery+insideoffset, lowery+insideoffset] + end + # inside = if abs(p[1]-q[1]) <= 0 + # [uppery+insideoffset, lowery+insideoffset] + # else + # [] + # end + + # if p[2] < q[2] + 0.5 + + BezierCurve([p, uppery, inside..., lowery, q]) + end + +end From 4f238caf5c15a72141c3713dd9bb3b93ab4e6c18 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Thu, 18 Feb 2016 22:59:31 -0500 Subject: [PATCH 076/121] added annotation options --- src/components.jl | 3 ++- src/plot.jl | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components.jl b/src/components.jl index f4b8f337..035d1b98 100644 --- a/src/components.jl +++ b/src/components.jl @@ -131,6 +131,7 @@ immutable PlotText str::@compat(AbstractString) font::Font end +PlotText(str) = PlotText(string(str), font()) function text(str, args...) PlotText(string(str), font(args...)) @@ -268,7 +269,7 @@ end end Base.mean(x::Real, y::Real) = 0.5*(x+y) - Base.mean{N,T<:Real}(p::FixedSizeArrays.Vec{N,T}, q::FixedSizeArrays.Vec{N,T}) = 0.5 * (p + q) + Base.mean{N,T<:Real}(ps::FixedSizeArrays.Vec{N,T}...) = sum(ps) / length(ps) points(curve::BezierCurve, n::Integer = 50) = map(curve, linspace(0,1,n)) diff --git a/src/plot.jl b/src/plot.jl index c8c41605..5a2dccbe 100644 --- a/src/plot.jl +++ b/src/plot.jl @@ -187,6 +187,7 @@ annotations(::@compat(Void)) = [] annotations{X,Y,V}(v::AVec{@compat(Tuple{X,Y,V})}) = v annotations{X,Y,V}(t::@compat(Tuple{X,Y,V})) = [t] annotations(v::AVec{PlotText}) = v +annotations(v::AVec) = map(PlotText, v) annotations(anns) = error("Expecting a tuple (or vector of tuples) for annotations: ", "(x, y, annotation)\n got: $(typeof(anns))") From 732f2846de61ac4e298fa5523a8b4fcfc553cb59 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Fri, 19 Feb 2016 18:24:56 -0500 Subject: [PATCH 077/121] directed_curve; working on PyPlot fixes --- src/backends/pyplot.jl | 9 +++++---- src/components.jl | 22 +++++++++++----------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index ee87fd1d..771f27d3 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -30,7 +30,7 @@ end # ------------------------------- # convert colorant to 4-tuple RGBA -getPyPlotColor(c::Colorant, α=nothing) = map(f->float(f(convertColor(c,α))), (red, green, blue, alpha)) +getPyPlotColor(c::Colorant, α=nothing) = map(f->float(f(convertColor(c,α))), [red, green, blue, alpha]) getPyPlotColor(cvec::ColorVector, α=nothing) = map(getPyPlotColor, convertColor(cvec, α).v) getPyPlotColor(scheme::ColorScheme, α=nothing) = getPyPlotColor(convertColor(getColor(scheme), α)) getPyPlotColor(c, α=nothing) = getPyPlotColor(convertColor(c, α)) @@ -350,7 +350,7 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) extra_kwargs[:c] = convert(Vector{Float64}, d[:zcolor]) extra_kwargs[:cmap] = getPyPlotColorMap(c, d[:markeralpha]) else - extra_kwargs[:c] = getPyPlotColor(c, d[:markeralpha]) + extra_kwargs[:c] = getPyPlotColor(c, d[:markeralpha])' end if d[:markeralpha] != nothing extra_kwargs[:alpha] = d[:markeralpha] @@ -358,13 +358,14 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) extra_kwargs[:edgecolors] = getPyPlotColor(d[:markerstrokecolor], d[:markerstrokealpha]) extra_kwargs[:linewidths] = d[:markerstrokewidth] else - extra_kwargs[:markersize] = d[:markersize] - extra_kwargs[:markerfacecolor] = getPyPlotColor(d[:markercolor], d[:markeralpha]) + extra_kwargs[:markersize] = d[:markersize].^2 + extra_kwargs[:markerfacecolor] = getPyPlotColor(d[:markercolor], d[:markeralpha])' extra_kwargs[:markeredgecolor] = getPyPlotColor(d[:markerstrokecolor], d[:markerstrokealpha]) extra_kwargs[:markeredgewidth] = d[:markerstrokewidth] extra_kwargs[:drawstyle] = getPyPlotStepStyle(lt) end end + dumpdict(extra_kwargs, "",true) # if d[:markeralpha] != nothing # extra_kwargs[:alpha] = d[:markeralpha] diff --git a/src/components.jl b/src/components.jl index 035d1b98..77652196 100644 --- a/src/components.jl +++ b/src/components.jl @@ -250,7 +250,8 @@ end P2, P3, points, - BezierCurve + BezierCurve, + directed_curve typealias P2 FixedSizeArrays.Vec{2,Float64} typealias P3 FixedSizeArrays.Vec{3,Float64} @@ -273,25 +274,24 @@ end points(curve::BezierCurve, n::Integer = 50) = map(curve, linspace(0,1,n)) - function BezierCurve(p::P2, q::P2) + # build a BezierCurve which leaves point p vertically upwards and arrives point q vertically upwards. + # may create a loop if necessary + function directed_curve(p::P2, q::P2) mn = mean(p,q) - yoffset = max(0.2, min(1.0, abs(mn[2]-p[2]))) + + # these points give the initial/final "rise" + yoffset = max(0.3, min(1.0, abs(mn[2]-p[2]))) firstoffset = P2(0, yoffset) - uppery = p + firstoffset lowery = q - firstoffset + + # try to figure out when to loop around vs just connecting straight + # TODO: choose loop direction based on sign of p[1]?? insideoffset = P2(0.2,0) inside = [] if abs(p[1]-q[1]) <= 0.1 && p[2] >= q[2] inside = [uppery+insideoffset, lowery+insideoffset] end - # inside = if abs(p[1]-q[1]) <= 0 - # [uppery+insideoffset, lowery+insideoffset] - # else - # [] - # end - - # if p[2] < q[2] + 0.5 BezierCurve([p, uppery, inside..., lowery, q]) end From 86fe244d95fc93ca1b96c7f4f04ec6b4bf233f5e Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Fri, 19 Feb 2016 21:59:43 -0500 Subject: [PATCH 078/121] revert pyplot changes --- src/backends/pyplot.jl | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 771f27d3..ee87fd1d 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -30,7 +30,7 @@ end # ------------------------------- # convert colorant to 4-tuple RGBA -getPyPlotColor(c::Colorant, α=nothing) = map(f->float(f(convertColor(c,α))), [red, green, blue, alpha]) +getPyPlotColor(c::Colorant, α=nothing) = map(f->float(f(convertColor(c,α))), (red, green, blue, alpha)) getPyPlotColor(cvec::ColorVector, α=nothing) = map(getPyPlotColor, convertColor(cvec, α).v) getPyPlotColor(scheme::ColorScheme, α=nothing) = getPyPlotColor(convertColor(getColor(scheme), α)) getPyPlotColor(c, α=nothing) = getPyPlotColor(convertColor(c, α)) @@ -350,7 +350,7 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) extra_kwargs[:c] = convert(Vector{Float64}, d[:zcolor]) extra_kwargs[:cmap] = getPyPlotColorMap(c, d[:markeralpha]) else - extra_kwargs[:c] = getPyPlotColor(c, d[:markeralpha])' + extra_kwargs[:c] = getPyPlotColor(c, d[:markeralpha]) end if d[:markeralpha] != nothing extra_kwargs[:alpha] = d[:markeralpha] @@ -358,14 +358,13 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) extra_kwargs[:edgecolors] = getPyPlotColor(d[:markerstrokecolor], d[:markerstrokealpha]) extra_kwargs[:linewidths] = d[:markerstrokewidth] else - extra_kwargs[:markersize] = d[:markersize].^2 - extra_kwargs[:markerfacecolor] = getPyPlotColor(d[:markercolor], d[:markeralpha])' + extra_kwargs[:markersize] = d[:markersize] + extra_kwargs[:markerfacecolor] = getPyPlotColor(d[:markercolor], d[:markeralpha]) extra_kwargs[:markeredgecolor] = getPyPlotColor(d[:markerstrokecolor], d[:markerstrokealpha]) extra_kwargs[:markeredgewidth] = d[:markerstrokewidth] extra_kwargs[:drawstyle] = getPyPlotStepStyle(lt) end end - dumpdict(extra_kwargs, "",true) # if d[:markeralpha] != nothing # extra_kwargs[:alpha] = d[:markeralpha] From 9da4083096698e754200316d86a946e671a5da24 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Sat, 20 Feb 2016 20:57:56 -0500 Subject: [PATCH 079/121] directed_curve --- src/components.jl | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/components.jl b/src/components.jl index 77652196..ae8155b1 100644 --- a/src/components.jl +++ b/src/components.jl @@ -280,17 +280,21 @@ end mn = mean(p,q) # these points give the initial/final "rise" - yoffset = max(0.3, min(1.0, abs(mn[2]-p[2]))) + yoffset = max(0.4, min(1.0, abs(mn[2]-p[2]))) firstoffset = P2(0, yoffset) uppery = p + firstoffset lowery = q - firstoffset # try to figure out when to loop around vs just connecting straight # TODO: choose loop direction based on sign of p[1]?? - insideoffset = P2(0.2,0) + insideoffset = P2(0.5, 0) inside = [] - if abs(p[1]-q[1]) <= 0.1 && p[2] >= q[2] - inside = [uppery+insideoffset, lowery+insideoffset] + x_close_together = abs(p[1] - q[1]) <= 0.1 + p_is_higher = p[2] >= q[2] + if x_close_together && p_is_higher + # add curve points which will create a loop + sgn = p[1] < 0 ? -1 : 1 + inside = [uppery + sgn * insideoffset, lowery + sgn * insideoffset] end BezierCurve([p, uppery, inside..., lowery, q]) From 6b61c5900ca09d1a038e3473d830aafca59b03a7 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Mon, 22 Feb 2016 10:39:03 -0500 Subject: [PATCH 080/121] generalize curves --- src/components.jl | 46 ++++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/src/components.jl b/src/components.jl index ae8155b1..f7b96222 100644 --- a/src/components.jl +++ b/src/components.jl @@ -249,22 +249,22 @@ end export P2, P3, - points, BezierCurve, + curve_points, directed_curve typealias P2 FixedSizeArrays.Vec{2,Float64} typealias P3 FixedSizeArrays.Vec{3,Float64} type BezierCurve{T <: FixedSizeArrays.Vec} - points::Vector{T} + control_points::Vector{T} end function Base.call(bc::BezierCurve, t::Real) p = zero(P2) - n = length(bc.points)-1 + n = length(bc.control_points)-1 for i in 0:n - p += bc.points[i+1] * binomial(n, i) * (1-t)^(n-i) * t^i + p += bc.control_points[i+1] * binomial(n, i) * (1-t)^(n-i) * t^i end p end @@ -272,32 +272,38 @@ end Base.mean(x::Real, y::Real) = 0.5*(x+y) Base.mean{N,T<:Real}(ps::FixedSizeArrays.Vec{N,T}...) = sum(ps) / length(ps) - points(curve::BezierCurve, n::Integer = 50) = map(curve, linspace(0,1,n)) + curve_points(curve::BezierCurve, n::Integer = 30; range = [0,1]) = map(curve, linspace(range..., n)) # build a BezierCurve which leaves point p vertically upwards and arrives point q vertically upwards. - # may create a loop if necessary - function directed_curve(p::P2, q::P2) - mn = mean(p,q) + # may create a loop if necessary. Assumes the view is [0,1] + function directed_curve(p::P2, q::P2; xview = 0:1, yview = 0:1) + mn = mean(p, q) + diff = q - p + + minx, maxx = minimum(xview), maximum(xview) + miny, maxy = minimum(yview), maximum(yview) + diffpct = P2(diff[1] / (maxx - minx), + diff[2] / (maxy - miny)) # these points give the initial/final "rise" - yoffset = max(0.4, min(1.0, abs(mn[2]-p[2]))) - firstoffset = P2(0, yoffset) - uppery = p + firstoffset - lowery = q - firstoffset + vertical_offset = P2(0, (maxy - miny) * max(0.03, min(abs(0.5diffpct[2]), 1.0))) + upper_control = p + vertical_offset + lower_control = q - vertical_offset # try to figure out when to loop around vs just connecting straight # TODO: choose loop direction based on sign of p[1]?? - insideoffset = P2(0.5, 0) - inside = [] - x_close_together = abs(p[1] - q[1]) <= 0.1 - p_is_higher = p[2] >= q[2] - if x_close_together && p_is_higher + x_close_together = abs(diffpct[1]) <= 0.05 + p_is_higher = diff[2] <= 0 + inside_control_points = if x_close_together && p_is_higher # add curve points which will create a loop - sgn = p[1] < 0 ? -1 : 1 - inside = [uppery + sgn * insideoffset, lowery + sgn * insideoffset] + sgn = p[1] < 0.5 * (maxx + minx) ? -1 : 1 + inside_offset = P2(0.3 * (maxx - minx), 0) + [upper_control + sgn * inside_offset, lower_control + sgn * inside_offset] + else + [] end - BezierCurve([p, uppery, inside..., lowery, q]) + BezierCurve([p, upper_control, inside_control_points..., lower_control, q]) end end From 73bd3fa60c24a4206e3b1deb98a13f9763f423fe Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Mon, 22 Feb 2016 22:53:31 -0500 Subject: [PATCH 081/121] curves --- src/components.jl | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/components.jl b/src/components.jl index f7b96222..2c65f26d 100644 --- a/src/components.jl +++ b/src/components.jl @@ -286,19 +286,22 @@ end diff[2] / (maxy - miny)) # these points give the initial/final "rise" - vertical_offset = P2(0, (maxy - miny) * max(0.03, min(abs(0.5diffpct[2]), 1.0))) + # vertical_offset = P2(0, (maxy - miny) * max(0.03, min(abs(0.5diffpct[2]), 1.0))) + vertical_offset = P2(0, max(0.15, 0.5norm(diff))) upper_control = p + vertical_offset lower_control = q - vertical_offset # try to figure out when to loop around vs just connecting straight # TODO: choose loop direction based on sign of p[1]?? - x_close_together = abs(diffpct[1]) <= 0.05 + # x_close_together = abs(diffpct[1]) <= 0.05 p_is_higher = diff[2] <= 0 - inside_control_points = if x_close_together && p_is_higher + inside_control_points = if p_is_higher # add curve points which will create a loop - sgn = p[1] < 0.5 * (maxx + minx) ? -1 : 1 + sgn = mn[1] < 0.5 * (maxx + minx) ? -1 : 1 inside_offset = P2(0.3 * (maxx - minx), 0) - [upper_control + sgn * inside_offset, lower_control + sgn * inside_offset] + additional_offset = P2(sgn * diff[1], 0) # make it even loopier + [upper_control + sgn * (inside_offset + max(0, additional_offset)), + lower_control + sgn * (inside_offset + max(0, -additional_offset))] else [] end From 335b3802b8ccfbeefaa497a4cf6d112f0365bca6 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Wed, 2 Mar 2016 22:48:27 -0500 Subject: [PATCH 082/121] added FixedSizeArrays requirement --- REQUIRE | 1 + src/Plots.jl | 1 + src/components.jl | 4 ++-- src/plot.jl | 4 ++-- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/REQUIRE b/REQUIRE index 92655edd..126413bb 100644 --- a/REQUIRE +++ b/REQUIRE @@ -4,3 +4,4 @@ Colors Reexport Compat Requires +FixedSizeArrays diff --git a/src/Plots.jl b/src/Plots.jl index 313ff267..a24a2437 100644 --- a/src/Plots.jl +++ b/src/Plots.jl @@ -7,6 +7,7 @@ using Compat using Reexport @reexport using Colors using Requires +using FixedSizeArrays export Plot, diff --git a/src/components.jl b/src/components.jl index 2c65f26d..3cc2e7a9 100644 --- a/src/components.jl +++ b/src/components.jl @@ -244,7 +244,7 @@ type OHLC{T<:Real} end -@require FixedSizeArrays begin +# @require FixedSizeArrays begin export P2, @@ -309,4 +309,4 @@ end BezierCurve([p, upper_control, inside_control_points..., lower_control, q]) end -end +# end diff --git a/src/plot.jl b/src/plot.jl index 5a2dccbe..72d6f49e 100644 --- a/src/plot.jl +++ b/src/plot.jl @@ -483,7 +483,7 @@ end # -------------------------------------------------------------------- -@require FixedSizeArrays begin +# @require FixedSizeArrays begin unzip{T}(x::AVec{FixedSizeArrays.Vec{2,T}}) = T[xi[1] for xi in x], T[xi[2] for xi in x] unzip{T}(x::FixedSizeArrays.Vec{2,T}) = T[x[1]], T[x[2]] @@ -496,7 +496,7 @@ end createKWargsList(plt, [xy[1]], [xy[2]]; kw...) end -end +# end # -------------------------------------------------------------------- From 6aa484926676dc699e8770633f87971c9e3f13dd Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Thu, 3 Mar 2016 16:05:27 -0500 Subject: [PATCH 083/121] pyplot lims udpate fix --- src/backends/pyplot.jl | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index ee87fd1d..59335d06 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -471,14 +471,19 @@ function Base.setindex!{X,Y}(plt::Plot{PyPlotPackage}, xy::Tuple{X,Y}, i::Intege end ax = series[:axes] - if plt.plotargs[:xlims] == :auto - xmin, xmax = ax[:get_xlim]() - ax[:set_xlim](min(xmin, minimum(x)), max(xmax, maximum(x))) + ax[:relim]() + ax[:autoscale]() + if plt.plotargs[:xlims] != :auto + # xmin, xmax = ax[:get_xlim]() + # ax[:set_xlim](min(xmin, minimum(x)), max(xmax, maximum(x))) + addPyPlotLims(ax, plt.plotargs[:xlims], true) end - if plt.plotargs[:ylims] == :auto - ymin, ymax = ax[:get_ylim]() - ax[:set_ylim](min(ymin, minimum(y)), max(ymax, maximum(y))) + if plt.plotargs[:ylims] != :auto + # ymin, ymax = ax[:get_ylim]() + # ax[:set_ylim](min(ymin, minimum(y)), max(ymax, maximum(y))) + addPyPlotLims(ax, plt.plotargs[:ylims], false) end + PyPlot.draw() plt end From 347820867da4764130968b8b22aa6a30a71cf6f6 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Thu, 3 Mar 2016 21:43:08 -0500 Subject: [PATCH 084/121] pyplot lim fixes --- src/backends/pyplot.jl | 44 +++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 59335d06..093cca83 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -461,30 +461,42 @@ function Base.getindex(plt::Plot{PyPlotPackage}, i::Integer) end end +function minmaxseries(ds, vec, axis) + lo, hi = Inf, -Inf + for d in ds + d[:axis] == axis || continue + v = d[vec] + if length(v) > 0 + vlo, vhi = extrema(v) + lo = min(lo, vlo) + hi = max(hi, vhi) + end + end + lo, hi +end + +function set_lims!(plt::Plot{PyPlotPackage}, axis::Symbol) + ax = getAxis(plt, axis) + if plt.plotargs[:xlims] == :auto + ax[:set_xlim](minmaxseries(plt.seriesargs, :x, axis)...) + end + if plt.plotargs[:ylims] == :auto + ax[:set_ylim](minmaxseries(plt.seriesargs, :y, axis)...) + end +end + function Base.setindex!{X,Y}(plt::Plot{PyPlotPackage}, xy::Tuple{X,Y}, i::Integer) - series = plt.seriesargs[i][:serieshandle] + d = plt.seriesargs[i] + series = d[:serieshandle] x, y = xy + d[:x], d[:y] = x, y try series[:set_data](x, y) catch series[:set_offsets](hcat(x, y)) end - ax = series[:axes] - ax[:relim]() - ax[:autoscale]() - if plt.plotargs[:xlims] != :auto - # xmin, xmax = ax[:get_xlim]() - # ax[:set_xlim](min(xmin, minimum(x)), max(xmax, maximum(x))) - addPyPlotLims(ax, plt.plotargs[:xlims], true) - end - if plt.plotargs[:ylims] != :auto - # ymin, ymax = ax[:get_ylim]() - # ax[:set_ylim](min(ymin, minimum(y)), max(ymax, maximum(y))) - addPyPlotLims(ax, plt.plotargs[:ylims], false) - end - PyPlot.draw() - + set_lims!(plt, d[:axis]) plt end From 165c84c2464534599e4e7150a8b48e47ea63893e Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Fri, 4 Mar 2016 12:46:33 -0500 Subject: [PATCH 085/121] pyplot minmax fix; convertToAnyVector fix --- src/backends/pyplot.jl | 7 +++++++ src/plot.jl | 3 ++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 093cca83..caf2d518 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -472,6 +472,13 @@ function minmaxseries(ds, vec, axis) hi = max(hi, vhi) end end + if lo == hi + hi = if lo == 0 + 1e-6 + else + hi + min(abs(1e-2hi), 1e-6) + end + end lo, hi end diff --git a/src/plot.jl b/src/plot.jl index 72d6f49e..845c54f0 100644 --- a/src/plot.jl +++ b/src/plot.jl @@ -262,7 +262,8 @@ function convertToAnyVector(v::AVec; kw...) Any[convert(Vector{Float64}, v)], nothing else # something else... treat each element as an item - Any[vi for vi in v], nothing + vcat(Any[convertToAnyVector(vi)[1] for vi in v]...), nothing + # Any[vi for vi in v], nothing end end From 88b9d71bd78e0b36b2823d3b0944eb06fe613161 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Mon, 7 Mar 2016 09:55:05 -0500 Subject: [PATCH 086/121] fixed default PyPlot gradient --- src/backends/pyplot.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index caf2d518..8e4f9fc5 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -45,8 +45,8 @@ function getPyPlotColorMap(c::ColorGradient, α=nothing) pycolors.pymember("LinearSegmentedColormap")[:from_list]("tmp", pyvals) end -# anything else just gets a redsblue gradient -getPyPlotColorMap(c, α=nothing) = getPyPlotColorMap(ColorGradient(:redsblues), α) +# anything else just gets a bluesred gradient +getPyPlotColorMap(c, α=nothing) = getPyPlotColorMap(ColorGradient(:bluesreds), α) # get the style (solid, dashed, etc) function getPyPlotLineStyle(linetype::Symbol, linestyle::Symbol) From ea29af8d3dffe8814538fdefe69794e4dee1da5b Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Mon, 1 Feb 2016 11:20:52 +0100 Subject: [PATCH 087/121] Removed 'private' keyword argument :scale --- src/backends/gr.jl | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 8dcb5f65..593b4ecb 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -132,7 +132,12 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end GR.setviewport(viewport[1], viewport[2], viewport[3], viewport[4]) - scale = d[:scale] + scale = 0 + d[:xscale] == :log10 && (scale |= GR.OPTION_X_LOG) + d[:yscale] == :log10 && (scale |= GR.OPTION_Y_LOG) + get(d, :xflip, false) && (scale |= GR.OPTION_FLIP_X) + get(d, :yflip, false) && (scale |= GR.OPTION_FLIP_Y) + for axis = 1:num_axes xmin, xmax, ymin, ymax = extrema[axis,:] if scale & GR.OPTION_X_LOG == 0 @@ -555,13 +560,6 @@ function _before_update_plot(plt::Plot{GRPackage}) end function _update_plot(plt::Plot{GRPackage}, d::Dict) - scale = 0 - d[:xscale] == :log10 && (scale |= GR.OPTION_X_LOG) - d[:yscale] == :log10 && (scale |= GR.OPTION_Y_LOG) - get(d, :xflip, false) && (scale |= GR.OPTION_FLIP_X) - get(d, :yflip, false) && (scale |= GR.OPTION_FLIP_Y) - plt.plotargs[:scale] = scale - for k in (:title, :xlabel, :ylabel) haskey(d, k) && (plt.plotargs[k] = d[k]) end From 55d7e910e496cf269b123d22d5397aecbc4d8f7a Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Wed, 3 Feb 2016 17:09:03 +0100 Subject: [PATCH 088/121] Added workaround for multiple mime output --- src/backends/gr.jl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 593b4ecb..e8dcc18e 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -598,6 +598,8 @@ end # ---------------------------------------------------------------- function Base.writemime(io::IO, m::MIME"image/png", plt::PlottingObject{GRPackage}) + isijulia() && return + GR.emergencyclosegks() ENV["GKS_WSTYPE"] = "png" gr_display(plt) GR.emergencyclosegks() @@ -606,6 +608,7 @@ end function Base.writemime(io::IO, m::MIME"image/svg+xml", plt::PlottingObject{GRPackage}) isijulia() || return + GR.emergencyclosegks() ENV["GKS_WSTYPE"] = "svg" gr_display(plt) GR.emergencyclosegks() From c5fb4a9228bee6feeab8a64e2cd123f20410826e Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Tue, 9 Feb 2016 17:48:45 +0100 Subject: [PATCH 089/121] Added some sanity checks --- src/backends/gr.jl | 34 ++++++++++++++++++++++++++-------- src/backends/supported.jl | 1 + 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index e8dcc18e..53ee97ac 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -121,6 +121,12 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end end end + if xmax <= xmin + xmax = xmin + 1 + end + if ymax <= ymin + ymax = ymin + 1 + end extrema[axis,:] = [xmin, xmax, ymin, ymax] end @@ -236,14 +242,18 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, GR.setfillcolorind(gr_getcolorind(p[:fillcolor])) GR.setfillintstyle(GR.INTSTYLE_SOLID) end - if p[:fillrange] != nothing - GR.fillarea([p[:x][1]; p[:x]; p[:x][length(p[:x])]], [p[:fillrange]; p[:y]; p[:fillrange]]) + if length(p[:x]) > 1 + if p[:fillrange] != nothing + GR.fillarea([p[:x][1]; p[:x]; p[:x][length(p[:x])]], [p[:fillrange]; p[:y]; p[:fillrange]]) + end + GR.polyline(p[:x], p[:y]) end - GR.polyline(p[:x], p[:y]) legend = true end if p[:linetype] == :line - GR.polyline(p[:x], p[:y]) + if length(p[:x]) > 1 + GR.polyline(p[:x], p[:y]) + end legend = true elseif p[:linetype] in [:steppre, :steppost] n = length(p[:x]) @@ -261,7 +271,9 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end j += 2 end - GR.polyline(x, y) + if n > 1 + GR.polyline(x, y) + end legend = true elseif p[:linetype] == :sticks x, y = p[:x], p[:y] @@ -275,7 +287,9 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, if haskey(d, :markersize) if typeof(d[:markersize]) <: Number GR.setmarkersize(d[:markersize] / 4.0) - GR.polymarker(p[:x], p[:y]) + if length(p[:x]) > 0 + GR.polymarker(p[:x], p[:y]) + end else c = p[:markercolor] GR.setcolormap(-GR.COLORMAP_GLOWING) @@ -289,7 +303,9 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end end else - GR.polymarker(p[:x], p[:y]) + if length(p[:x]) > 0 + GR.polymarker(p[:x], p[:y]) + end end legend = true elseif p[:linetype] == :bar @@ -419,7 +435,9 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end else haskey(p, :linewidth) && GR.setlinewidth(p[:linewidth]) - GR.polyline3d(x, y, z) + if length(x) > 0 + GR.polyline3d(x, y, z) + end end GR.setlinewidth(1) GR.setcharheight(charheight) diff --git a/src/backends/supported.jl b/src/backends/supported.jl index ee7d77b9..a647a079 100644 --- a/src/backends/supported.jl +++ b/src/backends/supported.jl @@ -189,6 +189,7 @@ supportedArgs(::GRPackage) = [ :label, :layout, :legend, + :colorbar, :linestyle, :linetype, :linewidth, From f3d552d8a0ca4d7d727136c9b929c35c4eaeeba3 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Fri, 12 Feb 2016 17:58:40 +0100 Subject: [PATCH 090/121] Temporary workaround for multiple mime output --- src/backends/gr.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 53ee97ac..f5e2ae1b 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -616,7 +616,7 @@ end # ---------------------------------------------------------------- function Base.writemime(io::IO, m::MIME"image/png", plt::PlottingObject{GRPackage}) - isijulia() && return + #isijulia() && return GR.emergencyclosegks() ENV["GKS_WSTYPE"] = "png" gr_display(plt) From 074ba63bf5b49d14598b2e6edd45c5dbfede3d13 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Sat, 13 Feb 2016 08:25:44 +0100 Subject: [PATCH 091/121] Fill workstation background instead of viewport --- src/backends/gr.jl | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index f5e2ae1b..dc6d5adf 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -69,6 +69,16 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, viewport[4] = subplot[3] + 0.95 * (subplot[4] - subplot[3]) end + if haskey(d, :background_color) + GR.savestate() + GR.selntran(0) + GR.setfillintstyle(GR.INTSTYLE_SOLID) + GR.setfillcolorind(gr_getcolorind(d[:background_color])) + GR.fillrect(0, 1, 0, 1) + GR.selntran(1) + GR.restorestate() + end + extrema = zeros(2, 4) num_axes = 1 cmap = false @@ -172,13 +182,6 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end GR.setwindow(xmin, xmax, ymin, ymax) - if axis == 1 && haskey(d, :background_color) - GR.savestate() - GR.setfillintstyle(GR.INTSTYLE_SOLID) - GR.setfillcolorind(gr_getcolorind(d[:background_color])) - GR.fillrect(xmin, xmax, ymin, ymax) - GR.restorestate() - end GR.setscale(scale) if axes_2d From 51c45456c3ea65eab8208775374af74f9394306b Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Sat, 13 Feb 2016 08:26:56 +0100 Subject: [PATCH 092/121] Disable alpha channel when converting PNGs --- src/animation.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/animation.jl b/src/animation.jl index 13075a78..a11e48db 100644 --- a/src/animation.jl +++ b/src/animation.jl @@ -31,7 +31,7 @@ function gif(anim::Animation, fn::@compat(AbstractString) = "tmp.gif"; fps::Inte # high quality speed = round(Int, 100 / fps) - run(`convert -delay $speed -loop 0 $(anim.dir)/*.png $fn`) + run(`convert -delay $speed -loop 0 $(anim.dir)/*.png -alpha off $fn`) catch err warn("Tried to create gif using convert (ImageMagick), but got error: $err\nWill try ffmpeg, but it's lower quality...)") From 51eeed3d5085a7922e202455f37d23cf71d14fbb Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Sat, 13 Feb 2016 09:37:28 +0100 Subject: [PATCH 093/121] Improved subplot layout --- src/backends/gr.jl | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index dc6d5adf..08c1f243 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -54,19 +54,19 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, msize = mwidth * w / width GR.setwsviewport(0, msize, 0, msize * ratio) GR.setwswindow(0, 1, 0, ratio) - viewport[1] = subplot[1] + 0.1 * (subplot[2] - subplot[1]) - viewport[2] = subplot[1] + 0.95 * (subplot[2] - subplot[1]) - viewport[3] = ratio * (subplot[3] + 0.1 * (subplot[4] - subplot[3])) - viewport[4] = ratio * (subplot[3] + 0.95 * (subplot[4] - subplot[3])) + viewport[1] = subplot[1] + 0.125 * (subplot[2] - subplot[1]) + viewport[2] = subplot[1] + 0.95 * (subplot[2] - subplot[1]) + viewport[3] = ratio * (subplot[3] + 0.125 * (subplot[4] - subplot[3])) + viewport[4] = ratio * (subplot[3] + 0.95 * (subplot[4] - subplot[3])) else ratio = float(w) / h msize = mheight * h / height GR.setwsviewport(0, msize * ratio, 0, msize) GR.setwswindow(0, ratio, 0, 1) - viewport[1] = ratio * (subplot[1] + 0.1 * (subplot[2] - subplot[1])) - viewport[2] = ratio * (subplot[1] + 0.95 * (subplot[2] - subplot[1])) - viewport[3] = subplot[3] + 0.1 * (subplot[4] - subplot[3]) - viewport[4] = subplot[3] + 0.95 * (subplot[4] - subplot[3]) + viewport[1] = ratio * (subplot[1] + 0.125 * (subplot[2] - subplot[1])) + viewport[2] = ratio * (subplot[1] + 0.95 * (subplot[2] - subplot[1])) + viewport[3] = subplot[3] + 0.125 * (subplot[4] - subplot[3]) + viewport[4] = subplot[3] + 0.95 * (subplot[4] - subplot[3]) end if haskey(d, :background_color) @@ -74,7 +74,11 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, GR.selntran(0) GR.setfillintstyle(GR.INTSTYLE_SOLID) GR.setfillcolorind(gr_getcolorind(d[:background_color])) - GR.fillrect(0, 1, 0, 1) + if w > h + GR.fillrect(subplot[1], subplot[2], ratio*subplot[3], ratio*subplot[4]) + else + GR.fillrect(ratio*subplot[1], ratio*subplot[2], subplot[3], subplot[4]) + end GR.selntran(1) GR.restorestate() end @@ -141,7 +145,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end if num_axes == 2 || !axes_2d - viewport[2] -= 0.05 + viewport[2] -= 0.0525 end if cmap viewport[2] -= 0.1 @@ -205,13 +209,13 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, if get(d, :title, "") != "" GR.savestate() GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_TOP) - GR.text(0.5, min(ratio, 1), d[:title]) + GR.text(0.5 * (viewport[1] + viewport[2]), min(ratio, 1), d[:title]) GR.restorestate() end if get(d, :xlabel, "") != "" GR.savestate() GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_BOTTOM) - GR.text(0.5, 0, d[:xlabel]) + GR.text(0.5 * (viewport[1] + viewport[2]), 0, d[:xlabel]) GR.restorestate() end if get(d, :ylabel, "") != "" From a3d4e05b0ee26cc29ea1373592f5042864a0efdb Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Tue, 16 Feb 2016 09:18:08 +0100 Subject: [PATCH 094/121] Improved background color handling --- src/backends/gr.jl | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 08c1f243..b37fac83 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -81,6 +81,14 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end GR.selntran(1) GR.restorestate() + c = getColor(d[:background_color]) + if 0.21 * c.r + 0.72 * c.g + 0.07 * c.b < 0.5 + fg = convert(Int, GR.inqcolorfromrgb(1-c.r, 1-c.g, 1-c.b)) + else + fg = 1 + end + else + fg = 1 end extrema = zeros(2, 4) @@ -191,8 +199,10 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, if axes_2d diag = sqrt((viewport[2] - viewport[1])^2 + (viewport[4] - viewport[3])^2) GR.setlinewidth(1) + GR.setlinecolorind(fg) charheight = max(0.018 * diag, 0.01) GR.setcharheight(charheight) + GR.settextcolorind(fg) ticksize = 0.0075 * diag GR.grid(xtick, ytick, 0, 0, majorx, majory) if num_axes == 1 @@ -209,12 +219,14 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, if get(d, :title, "") != "" GR.savestate() GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_TOP) + GR.settextcolorind(fg) GR.text(0.5 * (viewport[1] + viewport[2]), min(ratio, 1), d[:title]) GR.restorestate() end if get(d, :xlabel, "") != "" GR.savestate() GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_BOTTOM) + GR.settextcolorind(fg) GR.text(0.5 * (viewport[1] + viewport[2]), 0, d[:xlabel]) GR.restorestate() end @@ -222,6 +234,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, GR.savestate() GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_TOP) GR.setcharup(-1, 0) + GR.settextcolorind(fg) GR.text(0, 0.5 * (viewport[3] + viewport[4]), d[:ylabel]) GR.restorestate() end @@ -229,6 +242,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, GR.savestate() GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_TOP) GR.setcharup(1, 0) + GR.settextcolorind(fg) GR.text(1, 0.5 * (viewport[3] + viewport[4]), d[:yrightlabel]) GR.restorestate() end @@ -483,13 +497,13 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end px = viewport[2] - 0.05 - w py = viewport[4] - 0.06 + dy = 0.03 * sqrt((viewport[2] - viewport[1])^2 + (viewport[4] - viewport[3])^2) GR.setfillintstyle(GR.INTSTYLE_SOLID) GR.setfillcolorind(0) - GR.fillrect(px - 0.08, px + w + 0.02, py + 0.03, py - 0.03 * length(plt.seriesargs)) + GR.fillrect(px - 0.08, px + w + 0.02, py + dy, py - dy * length(plt.seriesargs)) GR.setlinetype(1) - GR.setlinecolorind(1) GR.setlinewidth(1) - GR.drawrect(px - 0.08, px + w + 0.02, py + 0.03, py - 0.03 * length(plt.seriesargs)) + GR.drawrect(px - 0.08, px + w + 0.02, py + dy, py - dy * length(plt.seriesargs)) haskey(d, :linewidth) && GR.setlinewidth(d[:linewidth]) i = 0 for p in plt.seriesargs @@ -514,8 +528,9 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, lab = p[:label] end GR.settextalign(GR.TEXT_HALIGN_LEFT, GR.TEXT_VALIGN_HALF) + GR.settextcolorind(1) GR.text(px, py, lab) - py -= 0.03 + py -= dy end GR.selntran(1) GR.restorestate() From d08672aa71b41c7cf2404198aa322ce5a1c35696 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Wed, 17 Feb 2016 14:15:05 +0100 Subject: [PATCH 095/121] Improved grid plotting logic --- src/backends/gr.jl | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index b37fac83..22177f2c 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -82,7 +82,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, GR.selntran(1) GR.restorestate() c = getColor(d[:background_color]) - if 0.21 * c.r + 0.72 * c.g + 0.07 * c.b < 0.5 + if 0.21 * c.r + 0.72 * c.g + 0.07 * c.b < 0.9 fg = convert(Int, GR.inqcolorfromrgb(1-c.r, 1-c.g, 1-c.b)) else fg = 1 @@ -204,7 +204,9 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, GR.setcharheight(charheight) GR.settextcolorind(fg) ticksize = 0.0075 * diag - GR.grid(xtick, ytick, 0, 0, majorx, majory) + if fg == 1 + GR.grid(xtick, ytick, 0, 0, majorx, majory) + end if num_axes == 1 GR.axes(xtick, ytick, xorg[1], yorg[1], majorx, majory, ticksize) GR.axes(xtick, ytick, xorg[2], yorg[2], -majorx, -majory, -ticksize) @@ -410,11 +412,9 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, diag = sqrt((viewport[2] - viewport[1])^2 + (viewport[4] - viewport[3])^2) charheight = max(0.018 * diag, 0.01) ticksize = 0.01 * (viewport[2] - viewport[1]) - # GR.savestate() GR.setlinewidth(1) GR.grid3d(xtick, 0, ztick, xmin, ymin, zmin, 2, 0, 2) GR.grid3d(0, ytick, 0, xmax, ymin, zmin, 0, 2, 0) - # GR.restorestate() z = reshape(z, length(x) * length(y)) if p[:linetype] == :surface GR.setcolormap(GR.COLORMAP_COOLWARM) @@ -442,11 +442,11 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, diag = sqrt((viewport[2] - viewport[1])^2 + (viewport[4] - viewport[3])^2) charheight = max(0.018 * diag, 0.01) ticksize = 0.01 * (viewport[2] - viewport[1]) - # GR.savestate() GR.setlinewidth(1) - GR.grid3d(xtick, 0, ztick, xmin, ymin, zmin, 2, 0, 2) - GR.grid3d(0, ytick, 0, xmax, ymin, zmin, 0, 2, 0) - # GR.restorestate() + if p[:linetype] == :path3d + GR.grid3d(xtick, 0, ztick, xmin, ymin, zmin, 2, 0, 2) + GR.grid3d(0, ytick, 0, xmax, ymin, zmin, 0, 2, 0) + end if p[:linetype] == :scatter3d haskey(p, :markercolor) && GR.setmarkercolorind(gr_getcolorind(p[:markercolor])) haskey(p, :markershape) && GR.setmarkertype(gr_markertype[p[:markershape]]) From e342805752a53e81936f1e18025abff27081ebfd Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Sat, 5 Mar 2016 12:16:18 +0100 Subject: [PATCH 096/121] Added missing marker shapes --- src/backends/gr.jl | 6 ++++-- src/backends/supported.jl | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 22177f2c..4f5a05c0 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -16,8 +16,10 @@ const gr_linetype = Dict( const gr_markertype = Dict( :auto => 1, :none => -1, :ellipse => -1, :rect => -7, :diamond => -13, - :utriangle => -3, :dtriangle => -5, :pentagon => -14, :hexagon => 3, - :cross => 2, :xcross => 5, :star5 => 3 ) + :utriangle => -3, :dtriangle => -5, :pentagon => -21, :hexagon => -22, + :heptagon => -23, :octagon => -24, :cross => 2, :xcross => 5, + :hline => -1, :vline => -1, + :star4 => -25, :star5 => -26, :star6 => -27, :star7 => -28, :star8 => -29 ) const gr_halign = Dict(:left => 1, :hcenter => 2, :right => 3) const gr_valign = Dict(:top => 1, :vcenter => 3, :bottom => 5) diff --git a/src/backends/supported.jl b/src/backends/supported.jl index a647a079..0709b1fa 100644 --- a/src/backends/supported.jl +++ b/src/backends/supported.jl @@ -241,7 +241,7 @@ supportedTypes(::GRPackage) = [:none, :line, :path, :steppre, :steppost, :sticks :hline, :vline, :contour, :path3d, :scatter3d, :surface, :wireframe, :ohlc, :pie] supportedStyles(::GRPackage) = [:auto, :solid, :dash, :dot, :dashdot] -supportedMarkers(::GRPackage) = vcat([:none, :ellipse, :rect, :diamond, :utriangle, :dtriangle, :pentagon, :hexagon, :cross, :xcross, :star5], Shape) +supportedMarkers(::GRPackage) = vcat(_allMarkers, Shape) supportedScales(::GRPackage) = [:identity, :log10] subplotSupported(::GRPackage) = true From 9761ede5c48edebc5a3c14a4b95e371fb4e05848 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Sat, 5 Mar 2016 12:56:01 +0100 Subject: [PATCH 097/121] Removed support for hline, vline markers (not yet implemented) --- src/backends/gr.jl | 1 - src/backends/supported.jl | 5 ++++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 4f5a05c0..d13482bd 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -18,7 +18,6 @@ const gr_markertype = Dict( :auto => 1, :none => -1, :ellipse => -1, :rect => -7, :diamond => -13, :utriangle => -3, :dtriangle => -5, :pentagon => -21, :hexagon => -22, :heptagon => -23, :octagon => -24, :cross => 2, :xcross => 5, - :hline => -1, :vline => -1, :star4 => -25, :star5 => -26, :star6 => -27, :star7 => -28, :star8 => -29 ) const gr_halign = Dict(:left => 1, :hcenter => 2, :right => 3) diff --git a/src/backends/supported.jl b/src/backends/supported.jl index 0709b1fa..33bd78db 100644 --- a/src/backends/supported.jl +++ b/src/backends/supported.jl @@ -241,7 +241,10 @@ supportedTypes(::GRPackage) = [:none, :line, :path, :steppre, :steppost, :sticks :hline, :vline, :contour, :path3d, :scatter3d, :surface, :wireframe, :ohlc, :pie] supportedStyles(::GRPackage) = [:auto, :solid, :dash, :dot, :dashdot] -supportedMarkers(::GRPackage) = vcat(_allMarkers, Shape) +supportedMarkers(::GRPackage) = [:auto, :none, :ellipse, :rect, :diamond, :utriangle, + :dtriangle, :pentagon, :hexagon, :heptagon, + :octagon, :cross, :xcross, :star4, :star5, :star6, + :star7, :star8] supportedScales(::GRPackage) = [:identity, :log10] subplotSupported(::GRPackage) = true From 1439a7e289f12e42a5d17807a8d58cce3da3d958 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Mon, 7 Mar 2016 15:14:58 +0100 Subject: [PATCH 098/121] Added support for pie charts --- src/backends/gr.jl | 86 +++++++++++++++++++++++++++++---------- src/backends/supported.jl | 7 +--- 2 files changed, 67 insertions(+), 26 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index d13482bd..8790db68 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -1,7 +1,6 @@ # https://github.com/jheinen/GR.jl - function _initialize_backend(::GRPackage; kw...) @eval begin import GR @@ -9,7 +8,6 @@ function _initialize_backend(::GRPackage; kw...) end end - const gr_linetype = Dict( :auto => 1, :solid => 1, :dash => 2, :dot => 3, :dashdot => 4, :dashdotdot => -1 ) @@ -18,7 +16,8 @@ const gr_markertype = Dict( :auto => 1, :none => -1, :ellipse => -1, :rect => -7, :diamond => -13, :utriangle => -3, :dtriangle => -5, :pentagon => -21, :hexagon => -22, :heptagon => -23, :octagon => -24, :cross => 2, :xcross => 5, - :star4 => -25, :star5 => -26, :star6 => -27, :star7 => -28, :star8 => -29 ) + :star4 => -25, :star5 => -26, :star6 => -27, :star7 => -28, :star8 => -29, + :vline => -30, :hline => -31 ) const gr_halign = Dict(:left => 1, :hcenter => 2, :right => 3) const gr_valign = Dict(:top => 1, :vcenter => 3, :bottom => 5) @@ -122,6 +121,10 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end cmap = true x, y, H = Base.hist2d(E, xbins, ybins) + elseif p[:linetype] == :pie + axes_2d = false + xmin, xmax, ymin, ymax = 0, 1, 0, 1 + x, y = p[:x], p[:y] else if p[:linetype] in [:contour, :surface] cmap = true @@ -131,16 +134,18 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end x, y = p[:x], p[:y] end - xmin = min(minimum(x), xmin) - xmax = max(maximum(x), xmax) - if p[:linetype] == :ohlc - for val in y - ymin = min(val.open, val.high, val.low, val.close, ymin) - ymax = max(val.open, val.high, val.low, val.close, ymax) + if p[:linetype] != :pie + xmin = min(minimum(x), xmin) + xmax = max(maximum(x), xmax) + if p[:linetype] == :ohlc + for val in y + ymin = min(val.open, val.high, val.low, val.close, ymin) + ymax = max(val.open, val.high, val.low, val.close, ymax) + end + else + ymin = min(minimum(y), ymin) + ymax = max(maximum(y), ymax) end - else - ymin = min(minimum(y), ymin) - ymax = max(maximum(y), ymax) end end end @@ -197,13 +202,14 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, GR.setwindow(xmin, xmax, ymin, ymax) GR.setscale(scale) + diag = sqrt((viewport[2] - viewport[1])^2 + (viewport[4] - viewport[3])^2) + charheight = max(0.018 * diag, 0.01) + GR.setcharheight(charheight) + GR.settextcolorind(fg) + if axes_2d - diag = sqrt((viewport[2] - viewport[1])^2 + (viewport[4] - viewport[3])^2) GR.setlinewidth(1) GR.setlinecolorind(fg) - charheight = max(0.018 * diag, 0.01) - GR.setcharheight(charheight) - GR.settextcolorind(fg) ticksize = 0.0075 * diag if fg == 1 GR.grid(xtick, ytick, 0, 0, majorx, majory) @@ -474,8 +480,33 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, GR.polyline([i, i], [y[i].low, y[i].high]) GR.polyline([i, i+ticksize], [y[i].close, y[i].close]) end - elseif p[:linetype] in [:pie] - println("TODO: add support for linetype $(p[:linetype])") + elseif p[:linetype] == :pie + GR.selntran(0) + GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_HALF) + GR.setfillintstyle(GR.INTSTYLE_SOLID) + xmin, xmax, ymin, ymax = viewport + ymax -= 0.05 * (xmax - xmin) + xcenter = 0.5 * (xmin + xmax) + ycenter = 0.5 * (ymin + ymax) + if xmax - xmin > ymax - ymin + r = 0.5 * (ymax - ymin) + xmin, xmax = xcenter - r, xcenter + r + else + r = 0.5 * (xmax - xmin) + ymin, ymax = ycenter - r, ycenter + r + end + x, y = p[:x], p[:y] + total = sum(y) + a1 = 0 + for i in 1:length(y) + a2 = round(Int, a1 + (y[i] / total) * 360.0) + GR.setfillcolorind(980 + (i-1) % 20) + GR.fillarc(xmin, xmax, ymin, ymax, a1, a2) + GR.text(xcenter + 0.5 * r * cos(0.5 * (a1 + a2) * pi / 180), + ycenter + 0.5 * r * sin(0.5 * (a1 + a2) * pi / 180), string(x[i])) + a1 = a2 + end + GR.selntran(1) end GR.restorestate() end @@ -576,7 +607,6 @@ function gr_display(subplt::Subplot{GRPackage}) end function _create_plot(pkg::GRPackage; kw...) - isijulia() && GR.inline("svg") d = Dict(kw) Plot(nothing, pkg, 0, d, Dict[]) end @@ -639,7 +669,6 @@ end # ---------------------------------------------------------------- function Base.writemime(io::IO, m::MIME"image/png", plt::PlottingObject{GRPackage}) - #isijulia() && return GR.emergencyclosegks() ENV["GKS_WSTYPE"] = "png" gr_display(plt) @@ -648,7 +677,6 @@ function Base.writemime(io::IO, m::MIME"image/png", plt::PlottingObject{GRPackag end function Base.writemime(io::IO, m::MIME"image/svg+xml", plt::PlottingObject{GRPackage}) - isijulia() || return GR.emergencyclosegks() ENV["GKS_WSTYPE"] = "svg" gr_display(plt) @@ -656,6 +684,22 @@ function Base.writemime(io::IO, m::MIME"image/svg+xml", plt::PlottingObject{GRPa write(io, readall("gks.svg")) end +function Base.writemime(io::IO, m::MIME"application/pdf", plt::PlottingObject{GRPackage}) + GR.emergencyclosegks() + ENV["GKS_WSTYPE"] = "pdf" + gr_display(plt) + GR.emergencyclosegks() + write(io, readall("gks.pdf")) +end + +function Base.writemime(io::IO, m::MIME"application/postscript", plt::PlottingObject{GRPackage}) + GR.emergencyclosegks() + ENV["GKS_WSTYPE"] = "ps" + gr_display(plt) + GR.emergencyclosegks() + write(io, readall("gks.ps")) +end + function Base.display(::PlotsDisplay, plt::Plot{GRPackage}) gr_display(plt) end diff --git a/src/backends/supported.jl b/src/backends/supported.jl index 33bd78db..e1dadbed 100644 --- a/src/backends/supported.jl +++ b/src/backends/supported.jl @@ -240,11 +240,8 @@ supportedTypes(::GRPackage) = [:none, :line, :path, :steppre, :steppost, :sticks :scatter, :heatmap, :hexbin, :hist, :density, :bar, :hline, :vline, :contour, :path3d, :scatter3d, :surface, :wireframe, :ohlc, :pie] -supportedStyles(::GRPackage) = [:auto, :solid, :dash, :dot, :dashdot] -supportedMarkers(::GRPackage) = [:auto, :none, :ellipse, :rect, :diamond, :utriangle, - :dtriangle, :pentagon, :hexagon, :heptagon, - :octagon, :cross, :xcross, :star4, :star5, :star6, - :star7, :star8] +supportedStyles(::GRPackage) = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] +supportedMarkers(::GRPackage) = vcat(_allMarkers, Shape) supportedScales(::GRPackage) = [:identity, :log10] subplotSupported(::GRPackage) = true From cdff5a9039c2f51b041a819cbdfc2dc72ba67ac9 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Mon, 7 Mar 2016 12:17:33 -0500 Subject: [PATCH 099/121] gr_state macro --- src/backends/gr.jl | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 8790db68..411b8acf 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -26,6 +26,19 @@ const gr_font_family = Dict( "times" => 1, "helvetica" => 5, "courier" => 9, "bookman" => 14, "newcenturyschlbk" => 18, "avantgarde" => 22, "palatino" => 26) +macro gr_state(expr::Expr) + esc(quote + GR.savestate() + try + $expr + catch + GR.restorestate() + rethrow() + end + GR.restorestate() + end) +end + function gr_getcolorind(v) c = getColor(v) return convert(Int, GR.inqcolorfromrgb(c.r, c.g, c.b)) @@ -70,7 +83,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end if haskey(d, :background_color) - GR.savestate() + @gr_state begin #GR.savestate() GR.selntran(0) GR.setfillintstyle(GR.INTSTYLE_SOLID) GR.setfillcolorind(gr_getcolorind(d[:background_color])) @@ -80,7 +93,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, GR.fillrect(ratio*subplot[1], ratio*subplot[2], subplot[3], subplot[4]) end GR.selntran(1) - GR.restorestate() + end # GR.restorestate() c = getColor(d[:background_color]) if 0.21 * c.r + 0.72 * c.g + 0.07 * c.b < 0.9 fg = convert(Int, GR.inqcolorfromrgb(1-c.r, 1-c.g, 1-c.b)) @@ -226,40 +239,40 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end if get(d, :title, "") != "" - GR.savestate() + @gr_state begin #GR.savestate() GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_TOP) GR.settextcolorind(fg) GR.text(0.5 * (viewport[1] + viewport[2]), min(ratio, 1), d[:title]) - GR.restorestate() + end # GR.restorestate() end if get(d, :xlabel, "") != "" - GR.savestate() + @gr_state begin #GR.savestate() GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_BOTTOM) GR.settextcolorind(fg) GR.text(0.5 * (viewport[1] + viewport[2]), 0, d[:xlabel]) - GR.restorestate() + end # GR.restorestate() end if get(d, :ylabel, "") != "" - GR.savestate() + @gr_state begin #GR.savestate() GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_TOP) GR.setcharup(-1, 0) GR.settextcolorind(fg) GR.text(0, 0.5 * (viewport[3] + viewport[4]), d[:ylabel]) - GR.restorestate() + end # GR.restorestate() end if get(d, :yrightlabel, "") != "" - GR.savestate() + @gr_state begin #GR.savestate() GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_TOP) GR.setcharup(1, 0) GR.settextcolorind(fg) GR.text(1, 0.5 * (viewport[3] + viewport[4]), d[:yrightlabel]) - GR.restorestate() + end # GR.restorestate() end legend = false for p in plt.seriesargs - GR.savestate() + @gr_state begin ## GR.savestate() xmin, xmax, ymin, ymax = extrema[gr_getaxisind(p),:] GR.setwindow(xmin, xmax, ymin, ymax) if p[:linetype] in [:path, :line, :steppre, :steppost, :sticks, :hline, :vline, :ohlc] @@ -508,11 +521,11 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end GR.selntran(1) end - GR.restorestate() + end # GR.restorestate() end if d[:legend] != :none && legend - GR.savestate() + @gr_state begin #GR.savestate() GR.selntran(0) GR.setscale(0) w = 0 @@ -565,11 +578,11 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, py -= dy end GR.selntran(1) - GR.restorestate() + end # GR.restorestate() end if haskey(d, :anns) - GR.savestate() + @gr_state begin #GR.savestate() for ann in d[:anns] x, y, val = ann x, y = GR.wctondc(x, y) @@ -584,7 +597,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, GR.settextalign(gr_halign[val.font.halign], gr_valign[val.font.valign]) GR.text(x, y, val.str) end - GR.restorestate() + end # GR.restorestate() end update && GR.updatews() From 9d3e0651e2848144a51a47779b983d204d59c306 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Mon, 7 Mar 2016 12:57:46 -0500 Subject: [PATCH 100/121] GR fix handling of Shape; PyPlot marker colors fix (hack), closes #145 --- src/backends/gr.jl | 10 +++++++--- src/backends/pyplot.jl | 12 +++++++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 411b8acf..43f101cf 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -19,6 +19,10 @@ const gr_markertype = Dict( :star4 => -25, :star5 => -26, :star6 => -27, :star7 => -28, :star8 => -29, :vline => -30, :hline => -31 ) +set_gr_markertype(shape::Shape) = set_gr_markertype(:ellipse) +set_gr_markertype(shape) = GR.setmarkertype(gr_markertype[shape]) + + const gr_halign = Dict(:left => 1, :hcenter => 2, :right => 3) const gr_valign = Dict(:top => 1, :vcenter => 3, :bottom => 5) @@ -326,7 +330,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, legend = true elseif p[:linetype] == :scatter || (p[:markershape] != :none && axes_2d) haskey(p, :markercolor) && GR.setmarkercolorind(gr_getcolorind(p[:markercolor])) - haskey(p, :markershape) && GR.setmarkertype(gr_markertype[p[:markershape]]) + haskey(p, :markershape) && set_gr_markertype(p[:markershape]) if haskey(d, :markersize) if typeof(d[:markersize]) <: Number GR.setmarkersize(d[:markersize] / 4.0) @@ -469,7 +473,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end if p[:linetype] == :scatter3d haskey(p, :markercolor) && GR.setmarkercolorind(gr_getcolorind(p[:markercolor])) - haskey(p, :markershape) && GR.setmarkertype(gr_markertype[p[:markershape]]) + haskey(p, :markershape) && set_gr_markertype(p[:markershape]) for i = 1:length(z) px, py = GR.wc3towc(x[i], y[i], z[i]) GR.polymarker([px], [py]) @@ -559,7 +563,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end if p[:linetype] == :scatter || p[:markershape] != :none haskey(p, :markercolor) && GR.setmarkercolorind(gr_getcolorind(p[:markercolor])) - haskey(p, :markershape) && GR.setmarkertype(gr_markertype[p[:markershape]]) + haskey(p, :markershape) && set_gr_markertype(p[:markershape]) if p[:linetype] in [:path, :line, :steppre, :steppost, :sticks] GR.polymarker([px - 0.06, px - 0.02], [py, py]) else diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 8e4f9fc5..245803b2 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -350,7 +350,17 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) extra_kwargs[:c] = convert(Vector{Float64}, d[:zcolor]) extra_kwargs[:cmap] = getPyPlotColorMap(c, d[:markeralpha]) else - extra_kwargs[:c] = getPyPlotColor(c, d[:markeralpha]) + # extra_kwargs[:c] = getPyPlotColor(c, d[:markeralpha]) + ppc = getPyPlotColor(c, d[:markeralpha]) + + # total hack due to PyPlot bug (see issue #145). + # hack: duplicate the color vector when the total rgba fields is the same as the series length + if (typeof(ppc) <: AbstractArray && length(ppc)*4 == length(x)) || + (typeof(ppc) <: Tuple && length(x) == 4) + ppc = vcat(ppc, ppc) + end + extra_kwargs[:c] = ppc + end if d[:markeralpha] != nothing extra_kwargs[:alpha] = d[:markeralpha] From 02a1e648bcd4b31800086fe65f35ecd7c61361c1 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Mon, 7 Mar 2016 15:17:29 -0500 Subject: [PATCH 101/121] added gr test; refactored pyplot figure generation, added overwrite_figure arg, closes #144 --- src/args.jl | 10 +++++++--- src/backends/pyplot.jl | 30 ++++++++++++++++++++++++------ src/backends/supported.jl | 3 ++- test/REQUIRE | 1 + test/runtests.jl | 7 +++++++ 5 files changed, 41 insertions(+), 10 deletions(-) diff --git a/src/args.jl b/src/args.jl index e9e55e9f..b9c537bd 100644 --- a/src/args.jl +++ b/src/args.jl @@ -179,14 +179,14 @@ _plotDefaults[:tickfont] = font(8) _plotDefaults[:guidefont] = font(11) _plotDefaults[:legendfont] = font(8) _plotDefaults[:grid] = true -_plotDefaults[:annotation] = nothing # annotation tuple(s)... (x,y,annotation) - +_plotDefaults[:annotation] = nothing # annotation tuple(s)... (x,y,annotation) +_plotDefaults[:overwrite_figure] = false # TODO: x/y scales const _allArgs = sort(collect(union(keys(_seriesDefaults), keys(_plotDefaults)))) -supportedArgs(::PlottingPackage) = _allArgs +supportedArgs(::PlottingPackage) = error("supportedArgs not defined") #_allArgs supportedArgs() = supportedArgs(backend()) @@ -307,6 +307,10 @@ end :palette => :color_palette, :xlink => :linkx, :ylink => :linky, + :clf => :overwrite_figure, + :clearfig => :overwrite_figure, + :overwrite => :overwrite_figure, + :reuse => :overwrite_figure, ) # add all pluralized forms to the _keyAliases dict diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 245803b2..e9b3023b 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -223,6 +223,24 @@ end # ------------------------------------------------------------------ +function pyplot_figure(plotargs::Dict) + w,h = map(px2inch, plotargs[:size]) + bgcolor = getPyPlotColor(plotargs[:background_color]) + fig = if plotargs[:overwrite_figure] + PyPlot.gcf() + else + PyPlot.figure() + end + fig[:set_size_inches](w,h,true) + fig[:set_facecolor](bgcolor) + fig[:set_dpi](DPI) + fig[:set_tight_layout](true) + PyPlot.clf() + PyPlot.plt[:get_current_fig_manager]()[:resize](plotargs[:size]...) + fig +end + + # TODO: # fillto # might have to use barHack/histogramHack?? # reg # true or false, add a regression line for each line @@ -239,9 +257,8 @@ function _create_plot(pkg::PyPlotPackage; kw...) if haskey(d, :subplot) wrap = nothing else - w,h = map(px2inch, d[:size]) - bgcolor = getPyPlotColor(d[:background_color]) - wrap = PyPlotAxisWrapper(nothing, nothing, PyPlot.figure(; figsize = (w,h), facecolor = bgcolor, dpi = DPI, tight_layout = true), []) + wrap = PyPlotAxisWrapper(nothing, nothing, pyplot_figure(d), []) + # wrap = PyPlotAxisWrapper(nothing, nothing, PyPlot.figure(; figsize = (w,h), facecolor = bgcolor, dpi = DPI, tight_layout = true), []) if haskey(d, :linetype) && first(d[:linetype]) in _3dTypes # && isa(plt.o, PyPlotFigWrapper) push!(wrap.kwargs, (:projection, "3d")) @@ -663,9 +680,10 @@ end function _create_subplot(subplt::Subplot{PyPlotPackage}, isbefore::Bool) l = subplt.layout - w,h = map(px2inch, getplotargs(subplt,1)[:size]) - bgcolor = getPyPlotColor(getplotargs(subplt,1)[:background_color]) - fig = PyPlot.figure(; figsize = (w,h), facecolor = bgcolor, dpi = DPI, tight_layout = true) + # w,h = map(px2inch, getplotargs(subplt,1)[:size]) + # bgcolor = getPyPlotColor(getplotargs(subplt,1)[:background_color]) + # fig = PyPlot.figure(; figsize = (w,h), facecolor = bgcolor, dpi = DPI, tight_layout = true) + fig = pyplot_figure(getplotargs(subplt, 1)) nr = nrows(l) for (i,(r,c)) in enumerate(l) diff --git a/src/backends/supported.jl b/src/backends/supported.jl index e1dadbed..36a2bae1 100644 --- a/src/backends/supported.jl +++ b/src/backends/supported.jl @@ -160,6 +160,7 @@ supportedArgs(::PyPlotPackage) = [ :fillalpha, :linealpha, :markeralpha, + :overwrite_figure, ] supportedAxes(::PyPlotPackage) = _allAxes supportedTypes(::PyPlotPackage) = [:none, :line, :path, :steppre, :steppost, #:sticks, @@ -360,7 +361,7 @@ supportedArgs(::UnicodePlotsPackage) = [ # :z, ] supportedAxes(::UnicodePlotsPackage) = [:auto, :left] -supportedTypes(::UnicodePlotsPackage) = [:none, :line, :path, :steppost, :sticks, :scatter, :heatmap, :hexbin, :hist, :bar, :hline, :vline] +supportedTypes(::UnicodePlotsPackage) = [:none, :line, :path, :steppre, :steppost, :sticks, :scatter, :heatmap, :hexbin, :hist, :bar, :hline, :vline] supportedStyles(::UnicodePlotsPackage) = [:auto, :solid] supportedMarkers(::UnicodePlotsPackage) = [:none, :auto, :ellipse] supportedScales(::UnicodePlotsPackage) = [:identity] diff --git a/test/REQUIRE b/test/REQUIRE index 17a29ad5..a2997f73 100644 --- a/test/REQUIRE +++ b/test/REQUIRE @@ -9,3 +9,4 @@ Images ImageMagick PyPlot @osx QuartzImageIO +GR diff --git a/test/runtests.jl b/test/runtests.jl index 4a691432..10387672 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -26,5 +26,12 @@ facts("PyPlot") do image_comparison_facts(:pyplot, skip=[4,10,13,19,21,23], eps=img_eps) end +facts("GR") do + @fact gr() --> Plots.GRPackage() + @fact backend() --> Plots.GRPackage() + + image_comparison_facts(:gr, only=[1], eps=img_eps) +end + FactCheck.exitstatus() end # module From a43d32949e563123a950031f6819e10284e9d459 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Mon, 7 Mar 2016 16:49:13 -0500 Subject: [PATCH 102/121] better handling of 3d matrix input --- src/backends/pyplot.jl | 28 ++++++++++++--- src/components.jl | 5 +++ src/plot.jl | 80 +++++++++++++++++++++++++++++------------- 3 files changed, 85 insertions(+), 28 deletions(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index e9b3023b..364498d1 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -226,20 +226,36 @@ end function pyplot_figure(plotargs::Dict) w,h = map(px2inch, plotargs[:size]) bgcolor = getPyPlotColor(plotargs[:background_color]) + + # reuse the current figure? fig = if plotargs[:overwrite_figure] PyPlot.gcf() else PyPlot.figure() end + + # update the specs fig[:set_size_inches](w,h,true) fig[:set_facecolor](bgcolor) fig[:set_dpi](DPI) fig[:set_tight_layout](true) + + # clear the figure PyPlot.clf() + + # resize the window PyPlot.plt[:get_current_fig_manager]()[:resize](plotargs[:size]...) fig end +function pyplot_3d_setup!(wrap, d) + # 3D? + # if haskey(d, :linetype) && first(d[:linetype]) in _3dTypes # && isa(plt.o, PyPlotFigWrapper) + if trueOrAllTrue(lt -> lt in _3dTypes, get(d, :linetype, :none)) + push!(wrap.kwargs, (:projection, "3d")) + end +end + # TODO: # fillto # might have to use barHack/histogramHack?? @@ -260,9 +276,10 @@ function _create_plot(pkg::PyPlotPackage; kw...) wrap = PyPlotAxisWrapper(nothing, nothing, pyplot_figure(d), []) # wrap = PyPlotAxisWrapper(nothing, nothing, PyPlot.figure(; figsize = (w,h), facecolor = bgcolor, dpi = DPI, tight_layout = true), []) - if haskey(d, :linetype) && first(d[:linetype]) in _3dTypes # && isa(plt.o, PyPlotFigWrapper) - push!(wrap.kwargs, (:projection, "3d")) - end + # if haskey(d, :linetype) && first(d[:linetype]) in _3dTypes # && isa(plt.o, PyPlotFigWrapper) + # push!(wrap.kwargs, (:projection, "3d")) + # end + pyplot_3d_setup!(wrap, d) end plt = Plot(wrap, pkg, 0, d, Dict[]) @@ -683,7 +700,8 @@ function _create_subplot(subplt::Subplot{PyPlotPackage}, isbefore::Bool) # w,h = map(px2inch, getplotargs(subplt,1)[:size]) # bgcolor = getPyPlotColor(getplotargs(subplt,1)[:background_color]) # fig = PyPlot.figure(; figsize = (w,h), facecolor = bgcolor, dpi = DPI, tight_layout = true) - fig = pyplot_figure(getplotargs(subplt, 1)) + plotargs = getplotargs(subplt, 1) + fig = pyplot_figure(plotargs) nr = nrows(l) for (i,(r,c)) in enumerate(l) @@ -694,10 +712,12 @@ function _create_subplot(subplt::Subplot{PyPlotPackage}, isbefore::Bool) ax = fig[:add_subplot](nr, nc, fakeidx) subplt.plts[i].o = PyPlotAxisWrapper(ax, nothing, fig, []) + pyplot_3d_setup!(subplt.plts[i].o, plotargs) end # subplt.o = PyPlotFigWrapper(fig, []) subplt.o = PyPlotAxisWrapper(nothing, nothing, fig, []) + pyplot_3d_setup!(subplt.o, plotargs) true end diff --git a/src/components.jl b/src/components.jl index 3cc2e7a9..1a24822d 100644 --- a/src/components.jl +++ b/src/components.jl @@ -234,6 +234,11 @@ Surface(f::Function, x, y) = Surface(Float64[f(xi,yi) for xi in x, yi in y]) Base.Array(surf::Surface) = surf.surf +for f in (:length, :size) + @eval Base.$f(surf::Surface, args...) = $f(surf.surf, args...) +end +Base.copy(surf::Surface) = Surface(copy(surf.surf)) + # ----------------------------------------------------------------------- type OHLC{T<:Real} diff --git a/src/plot.jl b/src/plot.jl index 845c54f0..9458444b 100644 --- a/src/plot.jl +++ b/src/plot.jl @@ -228,41 +228,49 @@ end typealias FuncOrFuncs @compat(Union{Function, AVec{Function}}) +all3D(d::Dict) = trueOrAllTrue(lt -> lt in (:contour, :surface, :wireframe, :image), get(d, :linetype, :none)) + # missing -convertToAnyVector(v::@compat(Void); kw...) = Any[nothing], nothing +convertToAnyVector(v::@compat(Void), d::Dict) = Any[nothing], nothing # fixed number of blank series -convertToAnyVector(n::Integer; kw...) = Any[zeros(0) for i in 1:n], nothing +convertToAnyVector(n::Integer, d::Dict) = Any[zeros(0) for i in 1:n], nothing # numeric vector -convertToAnyVector{T<:Real}(v::AVec{T}; kw...) = Any[v], nothing +convertToAnyVector{T<:Real}(v::AVec{T}, d::Dict) = Any[v], nothing # string vector -convertToAnyVector{T<:@compat(AbstractString)}(v::AVec{T}; kw...) = Any[v], nothing +convertToAnyVector{T<:@compat(AbstractString)}(v::AVec{T}, d::Dict) = Any[v], nothing # numeric matrix -convertToAnyVector{T<:Real}(v::AMat{T}; kw...) = Any[v[:,i] for i in 1:size(v,2)], nothing +function convertToAnyVector{T<:Real}(v::AMat{T}, d::Dict) + if all3D(d) + Any[Surface(v)] + else + Any[v[:,i] for i in 1:size(v,2)] + end, nothing +end # function -convertToAnyVector(f::Function; kw...) = Any[f], nothing +convertToAnyVector(f::Function, d::Dict) = Any[f], nothing # surface -convertToAnyVector(s::Surface; kw...) = Any[s], nothing +convertToAnyVector(s::Surface, d::Dict) = Any[s], nothing # vector of OHLC -convertToAnyVector(v::AVec{OHLC}; kw...) = Any[v], nothing +convertToAnyVector(v::AVec{OHLC}, d::Dict) = Any[v], nothing # dates -convertToAnyVector{D<:Union{Date,DateTime}}(dts::AVec{D}; kw...) = Any[dts], nothing +convertToAnyVector{D<:Union{Date,DateTime}}(dts::AVec{D}, d::Dict) = Any[dts], nothing # list of things (maybe other vectors, functions, or something else) -function convertToAnyVector(v::AVec; kw...) +function convertToAnyVector(v::AVec, d::Dict) if all(x -> typeof(x) <: Real, v) # all real numbers wrap the whole vector as one item Any[convert(Vector{Float64}, v)], nothing else # something else... treat each element as an item - vcat(Any[convertToAnyVector(vi)[1] for vi in v]...), nothing + vcat(Any[convertToAnyVector(vi, d)[1] for vi in v]...), nothing # Any[vi for vi in v], nothing end end @@ -272,7 +280,7 @@ end # in computeXandY, we take in any of the possible items, convert into proper x/y vectors, then return. # this is also where all the "set x to 1:length(y)" happens, and also where we assert on lengths. -computeX(x::@compat(Void), y) = 1:length(y) +computeX(x::@compat(Void), y) = 1:size(y,1) computeX(x, y) = copy(x) computeY(x, y::Function) = map(y, x) computeY(x, y) = copy(y) @@ -291,8 +299,9 @@ end # create n=max(mx,my) series arguments. the shorter list is cycled through # note: everything should flow through this function createKWargsList(plt::PlottingObject, x, y; kw...) - xs, xmeta = convertToAnyVector(x; kw...) - ys, ymeta = convertToAnyVector(y; kw...) + kwdict = Dict(kw) + xs, xmeta = convertToAnyVector(x, kwdict) + ys, ymeta = convertToAnyVector(y, kwdict) mx = length(xs) my = length(ys) @@ -300,7 +309,7 @@ function createKWargsList(plt::PlottingObject, x, y; kw...) for i in 1:max(mx, my) # try to set labels using ymeta - d = Dict(kw) + d = copy(kwdict) if !haskey(d, :label) && ymeta != nothing if isa(ymeta, Symbol) d[:label] = string(ymeta) @@ -317,13 +326,22 @@ function createKWargsList(plt::PlottingObject, x, y; kw...) dumpdict(d, "after getSeriesArgs") d[:x], d[:y] = computeXandY(xs[mod1(i,mx)], ys[mod1(i,my)]) + lt = d[:linetype] + if isa(d[:y], Surface) + if lt in (:contour, :surface, :wireframe, :image) + z = d[:y] + d[:y] = 1:size(z,2) + d[lt == :image ? :zcolor : :z] = z + end + end + if haskey(d, :idxfilter) d[:x] = d[:x][d[:idxfilter]] d[:y] = d[:y][d[:idxfilter]] end # for linetype `line`, need to sort by x values - if d[:linetype] == :line + if lt == :line # order by x indices = sortperm(d[:x]) d[:x] = d[:x][indices] @@ -379,6 +397,16 @@ function createKWargsList(plt::PlottingObject, x::AVec, y::AVec, zvec::AVec; kw. createKWargsList(plt, x, y; z=zvec, d...) end +function createKWargsList{T<:Real}(plt::PlottingObject, z::AMat{T}; kw...) + d = Dict(kw) + if all3D(d) + n,m = size(z) + createKWargsList(plt, 1:n, 1:m, z; kw...) + else + createKWargsList(plt, nothing, z; kw...) + end +end + # contours or surfaces... function grid function createKWargsList(plt::PlottingObject, x::AVec, y::AVec, zf::Function; kw...) # only allow sorted x/y for now @@ -518,18 +546,22 @@ end end end - function getDataFrameFromKW(; kw...) - for (k,v) in kw - if k == :dataframe - return v - end + function getDataFrameFromKW(d::Dict) + # for (k,v) in kw + # if k == :dataframe + # return v + # end + # end + get(d, :dataframe) do + error("Missing dataframe argument!") end - error("Missing dataframe argument in arguments!") end # the conversion functions for when we pass symbols or vectors of symbols to reference dataframes - convertToAnyVector(s::Symbol; kw...) = Any[getDataFrameFromKW(;kw...)[s]], s - convertToAnyVector(v::AVec{Symbol}; kw...) = (df = getDataFrameFromKW(;kw...); Any[df[s] for s in v]), v + # convertToAnyVector(s::Symbol; kw...) = Any[getDataFrameFromKW(;kw...)[s]], s + # convertToAnyVector(v::AVec{Symbol}; kw...) = (df = getDataFrameFromKW(;kw...); Any[df[s] for s in v]), v + convertToAnyVector(s::Symbol, d::Dict) = Any[getDataFrameFromKW(d)[s]], s + convertToAnyVector(v::AVec{Symbol}, d::Dict) = (df = getDataFrameFromKW(d); Any[df[s] for s in v]), v end From 5699446d6920616ed942d0bffc7fdf97844ca14f Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Mon, 7 Mar 2016 20:36:19 -0500 Subject: [PATCH 103/121] winston warning --- src/backends/winston.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/backends/winston.jl b/src/backends/winston.jl index 1bdae23b..e7d357f3 100644 --- a/src/backends/winston.jl +++ b/src/backends/winston.jl @@ -5,7 +5,8 @@ function _initialize_backend(::WinstonPackage; kw...) @eval begin - ENV["WINSTON_OUTPUT"] = "gtk" + # ENV["WINSTON_OUTPUT"] = "gtk" + warn("Winston is no longer supported... many features will likely be broken.") import Winston, Gtk export Winston, Gtk end From ed336bc0fff7ed5db31eb81efe7a0cd22cea6004 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Mon, 7 Mar 2016 21:38:31 -0500 Subject: [PATCH 104/121] cleaned up magic args; fixed alphas --- src/args.jl | 41 ++++++++++++++++++++++----------------- src/backends/pyplot.jl | 9 +++++---- src/backends/supported.jl | 2 ++ src/components.jl | 15 +++++++++++--- src/utils.jl | 18 +++++++++++++++++ 5 files changed, 60 insertions(+), 25 deletions(-) diff --git a/src/args.jl b/src/args.jl index b9c537bd..c951b37d 100644 --- a/src/args.jl +++ b/src/args.jl @@ -360,12 +360,6 @@ end # ----------------------------------------------------------------------------- -wraptuple(x::@compat(Tuple)) = x -wraptuple(x) = (x,) - -trueOrAllTrue(f::Function, x::AbstractArray) = all(f, x) -trueOrAllTrue(f::Function, x) = f(x) - function handleColors!(d::Dict, arg, csym::Symbol) try if arg == :auto @@ -417,11 +411,13 @@ end function processLineArg(d::Dict, arg) # linetype - if trueOrAllTrue(a -> get(_typeAliases, a, a) in _allTypes, arg) + # if trueOrAllTrue(a -> get(_typeAliases, a, a) in _allTypes, arg) + if allLineTypes(arg) d[:linetype] = arg # linestyle - elseif trueOrAllTrue(a -> get(_styleAliases, a, a) in _allStyles, arg) + # elseif trueOrAllTrue(a -> get(_styleAliases, a, a) in _allStyles, arg) + elseif allStyles(arg) d[:linestyle] = arg elseif typeof(arg) <: Stroke @@ -436,11 +432,13 @@ function processLineArg(d::Dict, arg) arg.alpha == nothing || (d[:fillalpha] = arg.alpha) # linealpha - elseif trueOrAllTrue(a -> typeof(a) <: Real && a > 0 && a < 1, arg) + # elseif trueOrAllTrue(a -> typeof(a) <: Real && a > 0 && a < 1, arg) + elseif allAlphas(arg) d[:linealpha] = arg # linewidth - elseif trueOrAllTrue(a -> typeof(a) <: Real, arg) + # elseif trueOrAllTrue(a -> typeof(a) <: Real, arg) + elseif allReals(arg) d[:linewidth] = arg # color @@ -454,13 +452,16 @@ end 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) + # if trueOrAllTrue(a -> get(_markerAliases, a, a) in _allMarkers, arg) + # d[:markershape] = arg + + # elseif trueOrAllTrue(a -> isa(a, Shape), arg) + if allShapes(arg) d[:markershape] = arg # stroke style - elseif trueOrAllTrue(a -> get(_styleAliases, a, a) in _allStyles, arg) + # elseif trueOrAllTrue(a -> get(_styleAliases, a, a) in _allStyles, arg) + elseif allStyles(arg) d[:markerstrokestyle] = arg elseif typeof(arg) <: Stroke @@ -475,11 +476,13 @@ function processMarkerArg(d::Dict, arg) arg.alpha == nothing || (d[:markeralpha] = arg.alpha) # linealpha - elseif trueOrAllTrue(a -> typeof(a) <: Real && a > 0 && a < 1, arg) + # elseif trueOrAllTrue(a -> typeof(a) <: Real && a > 0 && a < 1, arg) + elseif allAlphas(arg) d[:markeralpha] = arg # markersize - elseif trueOrAllTrue(a -> typeof(a) <: Real, arg) + # elseif trueOrAllTrue(a -> typeof(a) <: Real, arg) + elseif allReals(arg) d[:markersize] = arg # markercolor @@ -498,11 +501,13 @@ function processFillArg(d::Dict, arg) arg.alpha == nothing || (d[:fillalpha] = arg.alpha) # fillrange function - elseif trueOrAllTrue(a -> isa(a, Function), arg) + # elseif trueOrAllTrue(a -> isa(a, Function), arg) + elseif allFunctions(arg) d[:fillrange] = arg # fillalpha - elseif trueOrAllTrue(a -> typeof(a) <: Real && a > 0 && a < 1, arg) + # elseif trueOrAllTrue(a -> typeof(a) <: Real && a > 0 && a < 1, arg) + elseif allAlphas(arg) d[:fillalpha] = arg elseif !handleColors!(d, arg, :fillcolor) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 364498d1..50fbf26c 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -235,7 +235,8 @@ function pyplot_figure(plotargs::Dict) end # update the specs - fig[:set_size_inches](w,h,true) + # fig[:set_size_inches](w,h, (isijulia() ? [] : [true])...) + fig[:set_size_inches](w, h, forward = true) fig[:set_facecolor](bgcolor) fig[:set_dpi](DPI) fig[:set_tight_layout](true) @@ -396,9 +397,9 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) extra_kwargs[:c] = ppc end - if d[:markeralpha] != nothing - extra_kwargs[:alpha] = d[:markeralpha] - end + # if d[:markeralpha] != nothing + # extra_kwargs[:alpha] = d[:markeralpha] + # end extra_kwargs[:edgecolors] = getPyPlotColor(d[:markerstrokecolor], d[:markerstrokealpha]) extra_kwargs[:linewidths] = d[:markerstrokewidth] else diff --git a/src/backends/supported.jl b/src/backends/supported.jl index 36a2bae1..a26d7b3b 100644 --- a/src/backends/supported.jl +++ b/src/backends/supported.jl @@ -44,6 +44,7 @@ supportedArgs(::GadflyPackage) = [ :markeralpha, :markerstrokewidth, :markerstrokecolor, + :markerstrokealpha, # :markerstrokestyle, :n, :nbins, @@ -124,6 +125,7 @@ supportedArgs(::PyPlotPackage) = [ :markersize, :markerstrokewidth, :markerstrokecolor, + :markerstrokealpha, # :markerstrokestyle, :n, :nbins, diff --git a/src/components.jl b/src/components.jl index 1a24822d..a7ffa742 100644 --- a/src/components.jl +++ b/src/components.jl @@ -158,7 +158,8 @@ function stroke(args...; alpha = nothing) for arg in args T = typeof(arg) - if arg in _allStyles + # if arg in _allStyles + if allStyles(arg) style = arg elseif T <: Colorant color = arg @@ -166,7 +167,11 @@ function stroke(args...; alpha = nothing) try color = parse(Colorant, string(arg)) end - elseif typeof(arg) <: Real + # elseif trueOrAllTrue(a -> typeof(a) <: Real && a > 0 && a < 1, arg) + elseif allAlphas(arg) + alpha = arg + # elseif typeof(arg) <: Real + elseif allReals(arg) width = arg else warn("Unused stroke arg: $arg ($(typeof(arg)))") @@ -199,7 +204,11 @@ function brush(args...; alpha = nothing) try color = parse(Colorant, string(arg)) end - elseif typeof(arg) <: Real + # elseif trueOrAllTrue(a -> typeof(a) <: Real && a > 0 && a < 1, arg) + elseif allAlphas(arg) + alpha = arg + # elseif typeof(arg) <: Real + elseif allReals(arg) size = arg else warn("Unused brush arg: $arg ($(typeof(arg)))") diff --git a/src/utils.jl b/src/utils.jl index 5bc7d6dc..69d8e115 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -222,6 +222,24 @@ Base.merge(a::AbstractVector, b::AbstractVector) = sort(unique(vcat(a,b))) # --------------------------------------------------------------- +wraptuple(x::@compat(Tuple)) = x +wraptuple(x) = (x,) + +trueOrAllTrue(f::Function, x::AbstractArray) = all(f, x) +trueOrAllTrue(f::Function, x) = f(x) + +allLineTypes(arg) = trueOrAllTrue(a -> get(_typeAliases, a, a) in _allTypes, arg) +allStyles(arg) = trueOrAllTrue(a -> get(_styleAliases, a, a) in _allStyles, arg) +allShapes(arg) = trueOrAllTrue(a -> get(_markerAliases, a, a) in _allMarkers, arg) || + trueOrAllTrue(a -> isa(a, Shape), arg) +allAlphas(arg) = trueOrAllTrue(a -> (typeof(a) <: Real && a > 0 && a < 1) || + (typeof(a) <: AbstractFloat && (a == zero(typeof(a)) || a == one(typeof(a)))), arg) +allReals(arg) = trueOrAllTrue(a -> typeof(a) <: Real, arg) +allFunctions(arg) = trueOrAllTrue(a -> isa(a, Function), arg) + +# --------------------------------------------------------------- + + """ Allows temporary setting of backend and defaults for Plots. Settings apply only for the `do` block. Example: ``` From 076acfb2429401dbd50d3f88cfcc4cc8202e7765 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Mon, 7 Mar 2016 21:58:01 -0500 Subject: [PATCH 105/121] allow one-sided limits for pyplot --- src/backends/pyplot.jl | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 50fbf26c..fd72257e 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -527,6 +527,7 @@ function minmaxseries(ds, vec, axis) lo, hi end +# TODO: this needs to handle one-sided fixed limits function set_lims!(plt::Plot{PyPlotPackage}, axis::Symbol) ax = getAxis(plt, axis) if plt.plotargs[:xlims] == :auto @@ -563,7 +564,13 @@ function addPyPlotLims(ax, lims, isx::Bool) lims == :auto && return ltype = limsType(lims) if ltype == :limits - ax[isx ? :set_xlim : :set_ylim](lims...) + if isx + isfinite(lims[1]) && ax[:set_xlim](left = lims[1]) + isfinite(lims[2]) && ax[:set_xlim](right = lims[2]) + else + isfinite(lims[1]) && ax[:set_ylim](bottom = lims[1]) + isfinite(lims[2]) && ax[:set_ylim](top = lims[2]) + end else error("Invalid input for $(isx ? "xlims" : "ylims"): ", lims) end From 82f7b298362f476b2e455dbe12a764371b439058 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Tue, 8 Mar 2016 13:21:54 -0500 Subject: [PATCH 106/121] aliases --- src/args.jl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/args.jl b/src/args.jl index c951b37d..5bd6ac85 100644 --- a/src/args.jl +++ b/src/args.jl @@ -232,6 +232,7 @@ end :type => :linetype, :lt => :linetype, :t => :linetype, + :seriestype => :linetype, :style => :linestyle, :s => :linestyle, :ls => :linestyle, @@ -307,6 +308,10 @@ end :palette => :color_palette, :xlink => :linkx, :ylink => :linky, + :nrow => :nr, + :nrows => :nr, + :ncol => :nc, + :ncols => :nc, :clf => :overwrite_figure, :clearfig => :overwrite_figure, :overwrite => :overwrite_figure, From 9a544b0ff3a0b8128ac28a2ff93ab9b10189bb28 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Tue, 8 Mar 2016 14:18:39 -0500 Subject: [PATCH 107/121] warn about Bokeh; 3D parametric plots --- src/backends/bokeh.jl | 1 + src/plot.jl | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/src/backends/bokeh.jl b/src/backends/bokeh.jl index 72b899c5..09fa303d 100644 --- a/src/backends/bokeh.jl +++ b/src/backends/bokeh.jl @@ -4,6 +4,7 @@ function _initialize_backend(::BokehPackage; kw...) @eval begin + warn("Bokeh is no longer supported... many features will likely be broken.") import Bokeh export Bokeh end diff --git a/src/plot.jl b/src/plot.jl index 9458444b..c0405412 100644 --- a/src/plot.jl +++ b/src/plot.jl @@ -483,6 +483,11 @@ createKWargsList{T<:Real}(plt::PlottingObject, fx::FuncOrFuncs, fy::FuncOrFuncs, createKWargsList{T<:Real}(plt::PlottingObject, u::AVec{T}, fx::FuncOrFuncs, fy::FuncOrFuncs; kw...) = createKWargsList(plt, mapFuncOrFuncs(fx, u), mapFuncOrFuncs(fy, u); kw...) createKWargsList(plt::PlottingObject, fx::FuncOrFuncs, fy::FuncOrFuncs, umin::Real, umax::Real, numPoints::Int = 1000; kw...) = createKWargsList(plt, fx, fy, linspace(umin, umax, numPoints); kw...) +# special handling... 3D parametric function(s) +createKWargsList{T<:Real}(plt::PlottingObject, fx::FuncOrFuncs, fy::FuncOrFuncs, fz::FuncOrFuncs, u::AVec{T}; kw...) = createKWargsList(plt, mapFuncOrFuncs(fx, u), mapFuncOrFuncs(fy, u), mapFuncOrFuncs(fz, u); kw...) +createKWargsList{T<:Real}(plt::PlottingObject, u::AVec{T}, fx::FuncOrFuncs, fy::FuncOrFuncs, fz::FuncOrFuncs; kw...) = createKWargsList(plt, mapFuncOrFuncs(fx, u), mapFuncOrFuncs(fy, u), mapFuncOrFuncs(fz, u); kw...) +createKWargsList(plt::PlottingObject, fx::FuncOrFuncs, fy::FuncOrFuncs, fz::FuncOrFuncs, umin::Real, umax::Real, numPoints::Int = 1000; kw...) = createKWargsList(plt, fx, fy, fz, linspace(umin, umax, numPoints); kw...) + # (x,y) tuples function createKWargsList{R1<:Real,R2<:Real}(plt::PlottingObject, xy::AVec{Tuple{R1,R2}}; kw...) createKWargsList(plt, unzip(xy)...; kw...) From ed1cce86ef3bbefb7f0d7771f549c285d6dace3f Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Tue, 8 Mar 2016 15:07:51 -0500 Subject: [PATCH 108/121] ijulia, plotly, and gr display fixes --- src/Plots.jl | 36 +++++++----------------------------- src/backends/gr.jl | 5 +++++ src/backends/plotly.jl | 5 +---- 3 files changed, 13 insertions(+), 33 deletions(-) diff --git a/src/Plots.jl b/src/Plots.jl index a24a2437..b5ff1bdc 100644 --- a/src/Plots.jl +++ b/src/Plots.jl @@ -223,38 +223,16 @@ yaxis!(plt::Plot, args...; kw...) = plot!(pl # --------------------------------------------------------- - -# try -# import DataFrames -# dataframes() -# end - -# const CURRENT_BACKEND = pickDefaultBackend() - -# for be in backends() -# try -# backend(be) -# backend() -# catch err -# @show err -# end -# end - const CURRENT_BACKEND = CurrentBackend(:none) -# function __init__() -# # global const CURRENT_BACKEND = pickDefaultBackend() -# # global const CURRENT_BACKEND = CurrentBackend(:none) +function __init__() -# # global CURRENT_BACKEND -# # println("[Plots.jl] Default backend: ", CURRENT_BACKEND.sym) - -# # # auto init dataframes if the import statement doesn't error out -# # try -# # @eval import DataFrames -# # dataframes() -# # end -# end + # override IJulia inline display + if isijulia() + @eval import IJulia + IJulia.display_dict(plt::PlottingObject) = Dict{ASCIIString, ByteString}("text/html" => sprint(writemime, "text/html", plt)) + end +end # --------------------------------------------------------- diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 43f101cf..31442a15 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -701,6 +701,10 @@ function Base.writemime(io::IO, m::MIME"image/svg+xml", plt::PlottingObject{GRPa write(io, readall("gks.svg")) end +function Base.writemime(io::IO, m::MIME"text/html", plt::PlottingObject{GRPackage}) + writemime(io, MIME("image/svg+xml"), plt) +end + function Base.writemime(io::IO, m::MIME"application/pdf", plt::PlottingObject{GRPackage}) GR.emergencyclosegks() ENV["GKS_WSTYPE"] = "pdf" @@ -722,5 +726,6 @@ function Base.display(::PlotsDisplay, plt::Plot{GRPackage}) end function Base.display(::PlotsDisplay, plt::Subplot{GRPackage}) + gr_display(plt) true end diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index 2c2b86bc..960a7f95 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -457,11 +457,8 @@ end # ---------------------------------------------------------------- - function Base.writemime(io::IO, ::MIME"image/png", plt::PlottingObject{PlotlyPackage}) - isijulia() && return - # TODO: write a png to io - println("todo: png") + warn("todo: png") end function Base.writemime(io::IO, ::MIME"text/html", plt::PlottingObject{PlotlyPackage}) From fe2030b7e310166f07a1cc66c9542db66a66b6cc Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Tue, 8 Mar 2016 17:52:39 -0500 Subject: [PATCH 109/121] working on plotlyjs --- src/backends/plotlyjs.jl | 31 ++++++++++++++++++------------- test/runtests.jl | 2 +- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/backends/plotlyjs.jl b/src/backends/plotlyjs.jl index e2f74f47..e3ab129c 100644 --- a/src/backends/plotlyjs.jl +++ b/src/backends/plotlyjs.jl @@ -8,8 +8,7 @@ function _initialize_backend(::PlotlyJSPackage; kw...) end for (mime, fmt) in PlotlyJS._mimeformats - @eval Base.writemime(io::IO, m::MIME{symbol($mime)}, p::Plot{PlotlyJSPackage}) = - writemime(io, m, p.o) + @eval Base.writemime(io::IO, m::MIME{symbol($mime)}, p::Plot{PlotlyJSPackage}) = writemime(io, m, p.o.plot) end end @@ -19,8 +18,11 @@ function _create_plot(pkg::PlotlyJSPackage; kw...) d = Dict(kw) # TODO: create the window/canvas/context that is the plot within the backend (call it `o`) # TODO: initialize the plot... title, xlabel, bgcolor, etc - o = PlotlyJS.Plot(PlotlyJS.GenericTrace[], PlotlyJS.Layout(), - Base.Random.uuid4(), PlotlyJS.ElectronDisplay()) + # o = PlotlyJS.Plot(PlotlyJS.GenericTrace[], PlotlyJS.Layout(), + # Base.Random.uuid4(), PlotlyJS.ElectronDisplay()) + # T = isijulia() ? PlotlyJS.JupyterPlot : PlotlyJS.ElectronPlot + # o = T(PlotlyJS.Plot()) + o = PlotlyJS.plot() Plot(o, pkg, 0, d, Dict[]) end @@ -28,15 +30,15 @@ end function _add_series(::PlotlyJSPackage, plt::Plot; kw...) d = Dict(kw) + syncplot = plt.o + + dumpdict(d, "addseries", true) # add to the data array pdict = plotly_series(d) typ = pop!(pdict, :type) gt = PlotlyJS.GenericTrace(typ; pdict...) - push!(plt.o.data, gt) - if PlotlyJS.isactive(plt.o._display) - PlotlyJS.addtraces!(plt.o, gt) - end + PlotlyJS.addtraces!(syncplot, gt) push!(plt.seriesargs, d) plt @@ -63,10 +65,10 @@ end # TODO: override this to update plot items (title, xlabel, etc) after creation function _update_plot(plt::Plot{PlotlyJSPackage}, d::Dict) pdict = plotly_layout(d) - plt.o.layout = PlotlyJS.Layout(pdict) - if PlotlyJS.isactive(plt.o._display) - PlotlyJS.relayout!(plt.o; pdict...) - end + dumpdict(pdict, "pdict updateplot", true) + syncplot = plt.o + w,h = d[:size] + PlotlyJS.relayout!(syncplot, pdict, width = w, height = h) end @@ -105,8 +107,11 @@ end # ---------------------------------------------------------------- +function Base.writemime(io::IO, m::MIME"text/html", plt::PlottingObject{PlotlyJSPackage}) + Base.writemime(io, m, plt.o) +end + function Base.display(::PlotsDisplay, plt::Plot{PlotlyJSPackage}) - dump(plt.o) display(plt.o) end diff --git a/test/runtests.jl b/test/runtests.jl index 10387672..3c582d6c 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -30,7 +30,7 @@ facts("GR") do @fact gr() --> Plots.GRPackage() @fact backend() --> Plots.GRPackage() - image_comparison_facts(:gr, only=[1], eps=img_eps) + # image_comparison_facts(:gr, only=[1], eps=img_eps) end FactCheck.exitstatus() From cc798a0c0a798d9600ea36d8f587fb9dd9b86e48 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Wed, 9 Mar 2016 00:16:16 -0500 Subject: [PATCH 110/121] working on plotlyjs --- src/backends/plotlyjs.jl | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/backends/plotlyjs.jl b/src/backends/plotlyjs.jl index e3ab129c..544926f6 100644 --- a/src/backends/plotlyjs.jl +++ b/src/backends/plotlyjs.jl @@ -8,7 +8,12 @@ function _initialize_backend(::PlotlyJSPackage; kw...) end for (mime, fmt) in PlotlyJS._mimeformats - @eval Base.writemime(io::IO, m::MIME{symbol($mime)}, p::Plot{PlotlyJSPackage}) = writemime(io, m, p.o.plot) + @eval Base.writemime(io::IO, m::MIME{symbol($mime)}, p::Plot{PlotlyJSPackage}) = writemime(io, m, p.o) + end + + # override IJulia inline display + if isijulia() + IJulia.display_dict(plt::PlottingObject{PlotlyJSPackage}) = IJulia.display_dict(plt.o) end end @@ -32,7 +37,7 @@ function _add_series(::PlotlyJSPackage, plt::Plot; kw...) d = Dict(kw) syncplot = plt.o - dumpdict(d, "addseries", true) + # dumpdict(d, "addseries", true) # add to the data array pdict = plotly_series(d) @@ -65,7 +70,7 @@ end # TODO: override this to update plot items (title, xlabel, etc) after creation function _update_plot(plt::Plot{PlotlyJSPackage}, d::Dict) pdict = plotly_layout(d) - dumpdict(pdict, "pdict updateplot", true) + # dumpdict(pdict, "pdict updateplot", true) syncplot = plt.o w,h = d[:size] PlotlyJS.relayout!(syncplot, pdict, width = w, height = h) @@ -87,6 +92,9 @@ end function Base.setindex!(plt::Plot{PlotlyJSPackage}, xy::Tuple, i::Integer) d = plt.seriesargs[i] d[:x], d[:y] = xy + # TODO: this is likely ineffecient... we should make a call that ONLY changes the plot data + # PlotlyJS.restyle!(plt.o, i, plotly_series(d)) + PlotlyJS.restyle!(plt.o, i, Dict(:x=>d[:x], :y=>d[:y])) plt end From 3332bfcee161bfd69db5ce26dd6ed26aa8984199 Mon Sep 17 00:00:00 2001 From: Josef Heinen Date: Wed, 9 Mar 2016 10:34:19 +0100 Subject: [PATCH 111/121] Fixed some TODOs (Issue $108) - support the grid keyword - support handling of NaN (gaps in line segments) - support xlims/ylims - removed gr_state macro The GR.savestate / GR.restorestate problem (caused by exceptions) will be solved in GR - probably by something like GR.rewind() => to unwind the attribute stack. --- src/backends/gr.jl | 167 ++++++++++++++++++++++++++++++--------------- 1 file changed, 113 insertions(+), 54 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 31442a15..0486caf6 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -19,10 +19,6 @@ const gr_markertype = Dict( :star4 => -25, :star5 => -26, :star6 => -27, :star7 => -28, :star8 => -29, :vline => -30, :hline => -31 ) -set_gr_markertype(shape::Shape) = set_gr_markertype(:ellipse) -set_gr_markertype(shape) = GR.setmarkertype(gr_markertype[shape]) - - const gr_halign = Dict(:left => 1, :hcenter => 2, :right => 3) const gr_valign = Dict(:top => 1, :vcenter => 3, :bottom => 5) @@ -30,19 +26,6 @@ const gr_font_family = Dict( "times" => 1, "helvetica" => 5, "courier" => 9, "bookman" => 14, "newcenturyschlbk" => 18, "avantgarde" => 22, "palatino" => 26) -macro gr_state(expr::Expr) - esc(quote - GR.savestate() - try - $expr - catch - GR.restorestate() - rethrow() - end - GR.restorestate() - end) -end - function gr_getcolorind(v) c = getColor(v) return convert(Int, GR.inqcolorfromrgb(c.r, c.g, c.b)) @@ -57,6 +40,55 @@ function gr_getaxisind(p) end end +function gr_setmarkershape(p) + if haskey(p, :markershape) + shape = p[:markershape] + if isa(shape, Shape) + p[:vertices] = shape.vertices + else + GR.setmarkertype(gr_markertype[shape]) + p[:vertices] = :none + end + end +end + +function gr_polymarker(p, x, y) + if p[:vertices] != :none + vertices= p[:vertices] + dx = Float64[el[1] for el in vertices] * 0.01 + dy = Float64[el[2] for el in vertices] * 0.01 + GR.selntran(0) + GR.setfillcolorind(gr_getcolorind(p[:markercolor])) + GR.setfillintstyle(GR.INTSTYLE_SOLID) + for i = 1:length(x) + xn, yn = GR.wctondc(x[i], y[i]) + GR.fillarea(xn + dx, yn + dy) + end + GR.selntran(1) + else + GR.polymarker(x, y) + end +end + +function gr_polyline(x, y) + if NaN in x || NaN in y + i = 1 + j = 1 + n = length(x) + while i < n + while j < n && x[j] != Nan && y[j] != NaN + j += 1 + end + if i < j + GR.polyline(x[i:j], y[i:j]) + end + i = j + 1 + end + else + GR.polyline(x, y) + end +end + function gr_display(plt::Plot{GRPackage}, clear=true, update=true, subplot=[0, 1, 0, 1]) d = plt.plotargs @@ -87,7 +119,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end if haskey(d, :background_color) - @gr_state begin #GR.savestate() + GR.savestate() GR.selntran(0) GR.setfillintstyle(GR.INTSTYLE_SOLID) GR.setfillcolorind(gr_getcolorind(d[:background_color])) @@ -97,7 +129,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, GR.fillrect(ratio*subplot[1], ratio*subplot[2], subplot[3], subplot[4]) end GR.selntran(1) - end # GR.restorestate() + GR.restorestate() c = getColor(d[:background_color]) if 0.21 * c.r + 0.72 * c.g + 0.07 * c.b < 0.9 fg = convert(Int, GR.inqcolorfromrgb(1-c.r, 1-c.g, 1-c.b)) @@ -112,6 +144,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, num_axes = 1 cmap = false axes_2d = true + grid_flag = get(d, :grid, true) for axis = 1:2 xmin = ymin = typemax(Float64) @@ -166,6 +199,12 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end end end + if d[:xlims] != :auto + xmin, xmax = d[:xlims] + end + if d[:ylims] != :auto + ymin, ymax = d[:ylims] + end if xmax <= xmin xmax = xmin + 1 end @@ -228,7 +267,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, GR.setlinewidth(1) GR.setlinecolorind(fg) ticksize = 0.0075 * diag - if fg == 1 + if grid_flag && fg == 1 GR.grid(xtick, ytick, 0, 0, majorx, majory) end if num_axes == 1 @@ -243,40 +282,40 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end if get(d, :title, "") != "" - @gr_state begin #GR.savestate() + GR.savestate() GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_TOP) GR.settextcolorind(fg) GR.text(0.5 * (viewport[1] + viewport[2]), min(ratio, 1), d[:title]) - end # GR.restorestate() + GR.restorestate() end if get(d, :xlabel, "") != "" - @gr_state begin #GR.savestate() + GR.savestate() GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_BOTTOM) GR.settextcolorind(fg) GR.text(0.5 * (viewport[1] + viewport[2]), 0, d[:xlabel]) - end # GR.restorestate() + GR.restorestate() end if get(d, :ylabel, "") != "" - @gr_state begin #GR.savestate() + GR.savestate() GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_TOP) GR.setcharup(-1, 0) GR.settextcolorind(fg) GR.text(0, 0.5 * (viewport[3] + viewport[4]), d[:ylabel]) - end # GR.restorestate() + GR.restorestate() end if get(d, :yrightlabel, "") != "" - @gr_state begin #GR.savestate() + GR.savestate() GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_TOP) GR.setcharup(1, 0) GR.settextcolorind(fg) GR.text(1, 0.5 * (viewport[3] + viewport[4]), d[:yrightlabel]) - end # GR.restorestate() + GR.restorestate() end legend = false for p in plt.seriesargs - @gr_state begin ## GR.savestate() + GR.savestate() xmin, xmax, ymin, ymax = extrema[gr_getaxisind(p),:] GR.setwindow(xmin, xmax, ymin, ymax) if p[:linetype] in [:path, :line, :steppre, :steppost, :sticks, :hline, :vline, :ohlc] @@ -299,7 +338,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end if p[:linetype] == :line if length(p[:x]) > 1 - GR.polyline(p[:x], p[:y]) + gr_polyline(p[:x], p[:y]) end legend = true elseif p[:linetype] in [:steppre, :steppost] @@ -330,12 +369,12 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, legend = true elseif p[:linetype] == :scatter || (p[:markershape] != :none && axes_2d) haskey(p, :markercolor) && GR.setmarkercolorind(gr_getcolorind(p[:markercolor])) - haskey(p, :markershape) && set_gr_markertype(p[:markershape]) + gr_setmarkershape(p) if haskey(d, :markersize) if typeof(d[:markersize]) <: Number GR.setmarkersize(d[:markersize] / 4.0) if length(p[:x]) > 0 - GR.polymarker(p[:x], p[:y]) + gr_polymarker(p, p[:x], p[:y]) end else c = p[:markercolor] @@ -346,12 +385,12 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, GR.setmarkercolorind(ci) end GR.setmarkersize(d[:markersize][i] / 4.0) - GR.polymarker([p[:x][i]], [p[:y][i]]) + gr_polymarker(p, [p[:x][i]], [p[:y][i]]) end end else if length(p[:x]) > 0 - GR.polymarker(p[:x], p[:y]) + gr_polymarker(p, p[:x], p[:y]) end end legend = true @@ -437,8 +476,10 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, charheight = max(0.018 * diag, 0.01) ticksize = 0.01 * (viewport[2] - viewport[1]) GR.setlinewidth(1) - GR.grid3d(xtick, 0, ztick, xmin, ymin, zmin, 2, 0, 2) - GR.grid3d(0, ytick, 0, xmax, ymin, zmin, 0, 2, 0) + if grid_flag + GR.grid3d(xtick, 0, ztick, xmin, ymin, zmin, 2, 0, 2) + GR.grid3d(0, ytick, 0, xmax, ymin, zmin, 0, 2, 0) + end z = reshape(z, length(x) * length(y)) if p[:linetype] == :surface GR.setcolormap(GR.COLORMAP_COOLWARM) @@ -467,16 +508,16 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, charheight = max(0.018 * diag, 0.01) ticksize = 0.01 * (viewport[2] - viewport[1]) GR.setlinewidth(1) - if p[:linetype] == :path3d + if grid_flag && p[:linetype] == :path3d GR.grid3d(xtick, 0, ztick, xmin, ymin, zmin, 2, 0, 2) GR.grid3d(0, ytick, 0, xmax, ymin, zmin, 0, 2, 0) end if p[:linetype] == :scatter3d haskey(p, :markercolor) && GR.setmarkercolorind(gr_getcolorind(p[:markercolor])) - haskey(p, :markershape) && set_gr_markertype(p[:markershape]) + gr_setmarkershape(p) for i = 1:length(z) px, py = GR.wc3towc(x[i], y[i], z[i]) - GR.polymarker([px], [py]) + gr_polymarker(p, [px], [py]) end else haskey(p, :linewidth) && GR.setlinewidth(p[:linewidth]) @@ -499,7 +540,6 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end elseif p[:linetype] == :pie GR.selntran(0) - GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_HALF) GR.setfillintstyle(GR.INTSTYLE_SOLID) xmin, xmax, ymin, ymax = viewport ymax -= 0.05 * (xmax - xmin) @@ -512,24 +552,43 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, r = 0.5 * (xmax - xmin) ymin, ymax = ycenter - r, ycenter + r end - x, y = p[:x], p[:y] - total = sum(y) + labels, slices = p[:x], p[:y] + numslices = length(slices) + total = sum(slices) a1 = 0 - for i in 1:length(y) - a2 = round(Int, a1 + (y[i] / total) * 360.0) + x = zeros(3) + y = zeros(3) + for i in 1:numslices + a2 = round(Int, a1 + (slices[i] / total) * 360.0) GR.setfillcolorind(980 + (i-1) % 20) GR.fillarc(xmin, xmax, ymin, ymax, a1, a2) - GR.text(xcenter + 0.5 * r * cos(0.5 * (a1 + a2) * pi / 180), - ycenter + 0.5 * r * sin(0.5 * (a1 + a2) * pi / 180), string(x[i])) + alpha = 0.5 * (a1 + a2) + cosf = r * cos(alpha * pi / 180) + sinf = r * sin(alpha * pi / 180) + x[1] = xcenter + cosf + y[1] = ycenter + sinf + x[2] = x[1] + 0.1 * cosf + y[2] = y[1] + 0.1 * sinf + y[3] = y[2] + if 90 <= alpha < 270 + x[3] = x[2] - 0.05 + GR.settextalign(GR.TEXT_HALIGN_RIGHT, GR.TEXT_VALIGN_HALF) + GR.text(x[3] - 0.01, y[3], string(labels[i])) + else + x[3] = x[2] + 0.05 + GR.settextalign(GR.TEXT_HALIGN_LEFT, GR.TEXT_VALIGN_HALF) + GR.text(x[3] + 0.01, y[3], string(labels[i])) + end + GR.polyline(x, y) a1 = a2 end GR.selntran(1) end - end # GR.restorestate() + GR.restorestate() end if d[:legend] != :none && legend - @gr_state begin #GR.savestate() + GR.savestate() GR.selntran(0) GR.setscale(0) w = 0 @@ -563,11 +622,11 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, end if p[:linetype] == :scatter || p[:markershape] != :none haskey(p, :markercolor) && GR.setmarkercolorind(gr_getcolorind(p[:markercolor])) - haskey(p, :markershape) && set_gr_markertype(p[:markershape]) + gr_setmarkershape(p) if p[:linetype] in [:path, :line, :steppre, :steppost, :sticks] - GR.polymarker([px - 0.06, px - 0.02], [py, py]) + gr_polymarker(p, [px - 0.06, px - 0.02], [py, py]) else - GR.polymarker([px - 0.06, px - 0.04, px - 0.02], [py, py, py]) + gr_polymarker(p, [px - 0.06, px - 0.04, px - 0.02], [py, py, py]) end end if typeof(p[:label]) <: Array @@ -582,11 +641,11 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, py -= dy end GR.selntran(1) - end # GR.restorestate() + GR.restorestate() end if haskey(d, :anns) - @gr_state begin #GR.savestate() + GR.savestate() for ann in d[:anns] x, y, val = ann x, y = GR.wctondc(x, y) @@ -601,7 +660,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, GR.settextalign(gr_halign[val.font.halign], gr_valign[val.font.valign]) GR.text(x, y, val.str) end - end # GR.restorestate() + GR.restorestate() end update && GR.updatews() From b28cd7f8bda81695dd66e147d2d1d0a54c2a28bc Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Wed, 9 Mar 2016 10:23:14 -0500 Subject: [PATCH 112/121] plotlyjs fix --- src/backends/plotlyjs.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/backends/plotlyjs.jl b/src/backends/plotlyjs.jl index 544926f6..e1e87119 100644 --- a/src/backends/plotlyjs.jl +++ b/src/backends/plotlyjs.jl @@ -94,7 +94,7 @@ function Base.setindex!(plt::Plot{PlotlyJSPackage}, xy::Tuple, i::Integer) d[:x], d[:y] = xy # TODO: this is likely ineffecient... we should make a call that ONLY changes the plot data # PlotlyJS.restyle!(plt.o, i, plotly_series(d)) - PlotlyJS.restyle!(plt.o, i, Dict(:x=>d[:x], :y=>d[:y])) + PlotlyJS.restyle!(plt.o, i, Dict(:x=>(d[:x],), :y=>(d[:y],))) plt end From d09ca461413d804816353a2c78b96998be84a2e4 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Wed, 9 Mar 2016 10:59:33 -0500 Subject: [PATCH 113/121] plotlyjs fix --- src/backends/plotlyjs.jl | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/backends/plotlyjs.jl b/src/backends/plotlyjs.jl index e1e87119..6349a98a 100644 --- a/src/backends/plotlyjs.jl +++ b/src/backends/plotlyjs.jl @@ -54,12 +54,15 @@ end function _add_annotations{X,Y,V}(plt::Plot{PlotlyJSPackage}, anns::AVec{@compat(Tuple{X,Y,V})}) - # set or add to the annotation_list - if haskey(plt.plotargs, :annotation_list) + # set or add to the annotation_list + @show typeof(anns), typeof(get(plt.plotargs, :annotation_list, nothing)) + if !haskey(plt.plotargs, :annotation_list) + plt.plotargs[:annotation_list] = Any[] + end append!(plt.plotargs[:annotation_list], anns) - else - plt.plotargs[:annotation_list] = anns - end + # else + # plt.plotargs[:annotation_list] = anns + # end end # ---------------------------------------------------------------- From ded9f332f6b999b74e6a9a3720902f33ebb8b6fc Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Wed, 9 Mar 2016 11:13:31 -0500 Subject: [PATCH 114/121] plotlyjs fix --- src/backends/plotlyjs.jl | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/backends/plotlyjs.jl b/src/backends/plotlyjs.jl index 6349a98a..ab40ec80 100644 --- a/src/backends/plotlyjs.jl +++ b/src/backends/plotlyjs.jl @@ -55,14 +55,10 @@ end function _add_annotations{X,Y,V}(plt::Plot{PlotlyJSPackage}, anns::AVec{@compat(Tuple{X,Y,V})}) # set or add to the annotation_list - @show typeof(anns), typeof(get(plt.plotargs, :annotation_list, nothing)) if !haskey(plt.plotargs, :annotation_list) plt.plotargs[:annotation_list] = Any[] end append!(plt.plotargs[:annotation_list], anns) - # else - # plt.plotargs[:annotation_list] = anns - # end end # ---------------------------------------------------------------- From fd4dd13270b564c45ff81f0b7928c1db66465733 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Wed, 9 Mar 2016 13:36:21 -0500 Subject: [PATCH 115/121] added svg in pyplot; deprecate qwt; writemime backup for html --- src/backends/pyplot.jl | 3 ++- src/backends/qwt.jl | 1 + src/output.jl | 5 +++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index fd72257e..88ba7b81 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -869,7 +869,7 @@ const _pyplot_mimeformats = @compat Dict( "application/pdf" => "pdf", "image/png" => "png", "application/postscript" => "ps", - # "image/svg+xml" => "svg" + "image/svg+xml" => "svg" ) @@ -888,6 +888,7 @@ for (mime, fmt) in _pyplot_mimeformats end end + # function Base.writemime(io::IO, m::MIME"image/png", subplt::Subplot{PyPlotPackage}) # finalizePlot(subplt) # writemime(io, m, getfig(subplt.o)) diff --git a/src/backends/qwt.jl b/src/backends/qwt.jl index e4101a9f..a6b09088 100644 --- a/src/backends/qwt.jl +++ b/src/backends/qwt.jl @@ -3,6 +3,7 @@ function _initialize_backend(::QwtPackage; kw...) @eval begin + warn("Qwt is no longer supported... many features will likely be broken.") import Qwt export Qwt end diff --git a/src/output.jl b/src/output.jl index 5a97848a..ad8bb9f3 100644 --- a/src/output.jl +++ b/src/output.jl @@ -112,3 +112,8 @@ gui(plt::PlottingObject = current()) = display(PlotsDisplay(), plt) # override the REPL display to open a gui window Base.display(::Base.REPL.REPLDisplay, ::MIME"text/plain", plt::PlottingObject) = gui(plt) + +# a backup for html... passes to svg +function Base.writemime(io::IO, ::MIME"text/html", plt::PlottingObject) + writemime(io, MIME("image/svg+xml"), plt) +end From 6db06857ba3cdeb6c6ce697bc1ba908263229248 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Wed, 9 Mar 2016 15:26:30 -0500 Subject: [PATCH 116/121] changed heatmap to hist2d, see #147 for details --- src/Plots.jl | 4 ++++ src/args.jl | 5 ++--- src/backends/gadfly.jl | 6 +++--- src/backends/gr.jl | 4 ++-- src/backends/plotly.jl | 2 +- src/backends/pyplot.jl | 8 ++++---- src/backends/supported.jl | 20 ++++++++++---------- src/backends/winston.jl | 4 ++-- src/recipes.jl | 2 +- 9 files changed, 29 insertions(+), 26 deletions(-) diff --git a/src/Plots.jl b/src/Plots.jl index b5ff1bdc..f643789b 100644 --- a/src/Plots.jl +++ b/src/Plots.jl @@ -33,6 +33,8 @@ export bar!, histogram, histogram!, + histogram2d, + histogram2d!, density, density!, heatmap, @@ -149,6 +151,8 @@ bar(args...; kw...) = plot(args...; kw..., linetype = :bar) bar!(args...; kw...) = plot!(args...; kw..., linetype = :bar) histogram(args...; kw...) = plot(args...; kw..., linetype = :hist) histogram!(args...; kw...) = plot!(args...; kw..., linetype = :hist) +histogram2d(args...; kw...) = plot(args...; kw..., linetype = :hist2d) +histogram2d!(args...; kw...) = plot!(args...; kw..., linetype = :hist2d) density(args...; kw...) = plot(args...; kw..., linetype = :density) density!(args...; kw...) = plot!(args...; kw..., linetype = :density) heatmap(args...; kw...) = plot(args...; kw..., linetype = :heatmap) diff --git a/src/args.jl b/src/args.jl index 5bd6ac85..41139354 100644 --- a/src/args.jl +++ b/src/args.jl @@ -10,7 +10,7 @@ const _allAxes = [:auto, :left, :right] const _3dTypes = [:path3d, :scatter3d, :surface, :wireframe] const _allTypes = vcat([ :none, :line, :path, :steppre, :steppost, :sticks, :scatter, - :heatmap, :hexbin, :hist, :density, :bar, :hline, :vline, :ohlc, + :heatmap, :hexbin, :hist, :hist2d, :hist3d, :density, :bar, :hline, :vline, :ohlc, :contour, :pie ], _3dTypes) @compat const _typeAliases = Dict( @@ -39,7 +39,6 @@ const _allTypes = vcat([ ishistlike(lt::Symbol) = lt in (:hist, :density) islinelike(lt::Symbol) = lt in (:line, :path, :steppre, :steppost) -isheatmaplike(lt::Symbol) = lt in (:heatmap, :hexbin) const _allStyles = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] @@ -129,7 +128,7 @@ _seriesDefaults[:markerstrokecolor] = :match _seriesDefaults[:markerstrokealpha] = nothing # _seriesDefaults[:ribbon] = nothing # _seriesDefaults[:ribboncolor] = :match -_seriesDefaults[:nbins] = 30 # number of bins for heatmaps and hists +_seriesDefaults[:nbins] = 30 # number of bins for hists _seriesDefaults[:smooth] = false # regression line? _seriesDefaults[:group] = nothing # groupby vector # _seriesDefaults[:annotation] = nothing # annotation tuple(s)... (x,y,annotation) diff --git a/src/backends/gadfly.jl b/src/backends/gadfly.jl index f9593028..963af95d 100644 --- a/src/backends/gadfly.jl +++ b/src/backends/gadfly.jl @@ -36,7 +36,7 @@ function getLineGeom(d::Dict) xbins, ybins = maketuple(d[:nbins]) if lt == :hexbin Gadfly.Geom.hexbin(xbincount = xbins, ybincount = ybins) - elseif lt == :heatmap + elseif lt == :hist2d Gadfly.Geom.histogram2d(xbincount = xbins, ybincount = ybins) elseif lt == :hist Gadfly.Geom.histogram(bincount = xbins) @@ -303,7 +303,7 @@ function addGadflySeries!(plt::Plot, d::Dict) lt = d[:linetype] if lt == :ohlc error("Haven't re-implemented after refactoring") - elseif lt in (:heatmap, :hexbin) && (isa(d[:linecolor], ColorGradient) || isa(d[:linecolor], ColorFunction)) + elseif lt in (:hist2d, :hexbin) && (isa(d[:linecolor], ColorGradient) || isa(d[:linecolor], ColorFunction)) push!(gplt.scales, Gadfly.Scale.ContinuousColorScale(p -> RGB(getColorZ(d[:linecolor], p)))) elseif lt == :scatter && d[:markershape] == :none d[:markershape] = :ellipse @@ -314,7 +314,7 @@ function addGadflySeries!(plt::Plot, d::Dict) prepend!(layers, addGadflyMarker!(plt, length(gplt.layers), d, plt.plotargs, smooth...)) end - lt in (:heatmap, :hexbin, :contour) || addToGadflyLegend(plt, d) + lt in (:hist2d, :hexbin, :contour) || addToGadflyLegend(plt, d) # now save the layers that apply to this series d[:gadflylayers] = layers diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 0486caf6..5f43a8c0 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -160,7 +160,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, x, y = 1:size(p[:y], 1), p[:y] elseif p[:linetype] in [:hist, :density] x, y = Base.hist(p[:y]) - elseif p[:linetype] in [:heatmap, :hexbin] + elseif p[:linetype] in [:hist2d, :hexbin] E = zeros(length(p[:x]),2) E[:,1] = p[:x] E[:,2] = p[:y] @@ -423,7 +423,7 @@ function gr_display(plt::Plot{GRPackage}, clear=true, update=true, GR.polyline([xy, xy], [ymin, ymax]) end end - elseif p[:linetype] in [:heatmap, :hexbin] + elseif p[:linetype] in [:hist2d, :hexbin] E = zeros(length(p[:x]),2) E[:,1] = p[:x] E[:,2] = p[:y] diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index 960a7f95..d58953aa 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -296,7 +296,7 @@ function plotly_series(d::Dict; plot_index = nothing) d_out[:type] = "bar" d_out[:x], d_out[:y] = x, y - elseif lt == :heatmap + elseif lt == :hist2d d_out[:type] = "histogram2d" d_out[:x], d_out[:y] = x, y if isa(d[:nbins], Tuple) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 88ba7b81..f6822014 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -169,7 +169,7 @@ function getPyPlotFunction(plt::Plot, axis::Symbol, linetype::Symbol) :density => :hist, :sticks => :bar, :bar => :bar, - :heatmap => :hexbin, + :hist2d => :hexbin, :hexbin => :hexbin, :scatter => :scatter, :contour => :contour, @@ -351,7 +351,7 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) extra_kwargs[:linewidth] = (lt == :sticks ? 0.1 : 0.9) end - elseif lt in (:heatmap, :hexbin) + elseif lt in (:hist2d, :hexbin) extra_kwargs[:gridsize] = d[:nbins] extra_kwargs[:cmap] = getPyPlotColorMap(d[:linecolor]) @@ -461,7 +461,7 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) plotfunc(x, y, z; extra_kwargs...) elseif lt in _3dTypes plotfunc(d[:x], d[:y], d[:z]; extra_kwargs...) - elseif lt in (:scatter, :heatmap, :hexbin) + elseif lt in (:scatter, :hist2d, :hexbin) plotfunc(d[:x], d[:y]; extra_kwargs...) else plotfunc(d[:x], d[:y]; extra_kwargs...)[1] @@ -784,7 +784,7 @@ function addPyPlotLegend(plt::Plot, ax) leg = plt.plotargs[:legend] if leg != :none # gotta do this to ensure both axes are included - args = filter(x -> !(x[:linetype] in (:hist,:density,:hexbin,:heatmap,:hline,:vline,:contour, :surface, :wireframe, :path3d, :scatter3d)), plt.seriesargs) + args = filter(x -> !(x[:linetype] in (:hist,:density,:hexbin,:hist2d,:hline,:vline,:contour, :surface, :wireframe, :path3d, :scatter3d)), plt.seriesargs) args = filter(x -> x[:label] != "", args) if length(args) > 0 leg = ax[:legend]([d[:serieshandle] for d in args], diff --git a/src/backends/supported.jl b/src/backends/supported.jl index a26d7b3b..664de905 100644 --- a/src/backends/supported.jl +++ b/src/backends/supported.jl @@ -80,7 +80,7 @@ supportedArgs(::GadflyPackage) = [ ] supportedAxes(::GadflyPackage) = [:auto, :left] supportedTypes(::GadflyPackage) = [:none, :line, :path, :steppre, :steppost, :sticks, - :scatter, :heatmap, :hexbin, :hist, :bar, + :scatter, :hist2d, :hexbin, :hist, :bar, :hline, :vline, :contour] supportedStyles(::GadflyPackage) = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] supportedMarkers(::GadflyPackage) = vcat(_allMarkers, Shape) @@ -166,7 +166,7 @@ supportedArgs(::PyPlotPackage) = [ ] supportedAxes(::PyPlotPackage) = _allAxes supportedTypes(::PyPlotPackage) = [:none, :line, :path, :steppre, :steppost, #:sticks, - :scatter, :heatmap, :hexbin, :hist, :density, :bar, + :scatter, :hist2d, :hexbin, :hist, :density, :bar, :hline, :vline, :contour, :path3d, :scatter3d, :surface, :wireframe] supportedStyles(::PyPlotPackage) = [:auto, :solid, :dash, :dot, :dashdot] # supportedMarkers(::PyPlotPackage) = [:none, :auto, :rect, :ellipse, :diamond, :utriangle, :dtriangle, :cross, :xcross, :star5, :hexagon] @@ -240,7 +240,7 @@ supportedArgs(::GRPackage) = [ ] supportedAxes(::GRPackage) = _allAxes supportedTypes(::GRPackage) = [:none, :line, :path, :steppre, :steppost, :sticks, - :scatter, :heatmap, :hexbin, :hist, :density, :bar, + :scatter, :hist2d, :hexbin, :hist, :density, :bar, :hline, :vline, :contour, :path3d, :scatter3d, :surface, :wireframe, :ohlc, :pie] supportedStyles(::GRPackage) = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] @@ -304,7 +304,7 @@ supportedArgs(::QwtPackage) = [ # :yflip, # :z, ] -supportedTypes(::QwtPackage) = [:none, :line, :path, :steppre, :steppost, :sticks, :scatter, :heatmap, :hexbin, :hist, :bar, :hline, :vline] +supportedTypes(::QwtPackage) = [:none, :line, :path, :steppre, :steppost, :sticks, :scatter, :hist2d, :hexbin, :hist, :bar, :hline, :vline] supportedMarkers(::QwtPackage) = [:none, :auto, :rect, :ellipse, :diamond, :utriangle, :dtriangle, :cross, :xcross, :star5, :star8, :hexagon] supportedScales(::QwtPackage) = [:identity, :log10] subplotSupported(::QwtPackage) = true @@ -363,7 +363,7 @@ supportedArgs(::UnicodePlotsPackage) = [ # :z, ] supportedAxes(::UnicodePlotsPackage) = [:auto, :left] -supportedTypes(::UnicodePlotsPackage) = [:none, :line, :path, :steppre, :steppost, :sticks, :scatter, :heatmap, :hexbin, :hist, :bar, :hline, :vline] +supportedTypes(::UnicodePlotsPackage) = [:none, :line, :path, :steppre, :steppost, :sticks, :scatter, :hist2d, :hexbin, :hist, :bar, :hline, :vline] supportedStyles(::UnicodePlotsPackage) = [:auto, :solid] supportedMarkers(::UnicodePlotsPackage) = [:none, :auto, :ellipse] supportedScales(::UnicodePlotsPackage) = [:identity] @@ -495,7 +495,7 @@ supportedArgs(::BokehPackage) = [ # :levels, ] supportedAxes(::BokehPackage) = [:auto, :left] -supportedTypes(::BokehPackage) = [:none, :path, :scatter] #,:steppre, :steppost, :sticks, :heatmap, :hexbin, :hist, :bar, :hline, :vline, :contour] +supportedTypes(::BokehPackage) = [:none, :path, :scatter] #,:steppre, :steppost, :sticks, :hist2d, :hexbin, :hist, :bar, :hline, :vline, :contour] supportedStyles(::BokehPackage) = [:auto, :solid, :dash, :dot, :dashdot, :dashdotdot] supportedMarkers(::BokehPackage) = [:none, :auto, :ellipse, :rect, :diamond, :utriangle, :dtriangle, :cross, :xcross, :star5] #vcat(_allMarkers, Shape) supportedScales(::BokehPackage) = [:identity, :ln] #, :ln, :log2, :log10, :asinh, :sqrt] @@ -562,7 +562,7 @@ supportedArgs(::PlotlyPackage) = [ ] supportedAxes(::PlotlyPackage) = [:auto, :left] supportedTypes(::PlotlyPackage) = [:none, :line, :path, :scatter, :steppre, :steppost, - :heatmap, :hist, :density, :bar, :contour, :surface, :path3d, :scatter3d, + :hist2d, :hist, :density, :bar, :contour, :surface, :path3d, :scatter3d, :pie] #,, :sticks, :hexbin, :hline, :vline] supportedStyles(::PlotlyPackage) = [:auto, :solid, :dash, :dot, :dashdot] supportedMarkers(::PlotlyPackage) = [:none, :auto, :ellipse, :rect, :diamond, :utriangle, :dtriangle, :cross, :xcross, @@ -632,7 +632,7 @@ supportedArgs(::PlotlyJSPackage) = [ ] supportedAxes(::PlotlyJSPackage) = [:auto, :left] supportedTypes(::PlotlyJSPackage) = [:none, :line, :path, :scatter, :steppre, :steppost, - :heatmap, :hist, :density, :bar, :contour, :surface, :path3d, :scatter3d, + :hist2d, :hist, :density, :bar, :contour, :surface, :path3d, :scatter3d, :pie] #,, :sticks, :hexbin, :hline, :vline] supportedStyles(::PlotlyJSPackage) = [:auto, :solid, :dash, :dot, :dashdot] supportedMarkers(::PlotlyJSPackage) = [:none, :auto, :ellipse, :rect, :diamond, :utriangle, :dtriangle, :cross, :xcross, @@ -700,7 +700,7 @@ supportedArgs(::GLVisualizePackage) = [ # :levels, ] supportedAxes(::GLVisualizePackage) = [:auto, :left] -supportedTypes(::GLVisualizePackage) = [:contour] #, :path, :scatter ,:steppre, :steppost, :sticks, :heatmap, :hexbin, :hist, :bar, :hline, :vline, :contour] +supportedTypes(::GLVisualizePackage) = [:contour] #, :path, :scatter ,:steppre, :steppost, :sticks, :hist2d, :hexbin, :hist, :bar, :hline, :vline, :contour] supportedStyles(::GLVisualizePackage) = [:auto, :solid] #, :dash, :dot, :dashdot, :dashdotdot] supportedMarkers(::GLVisualizePackage) = [:none, :auto, :ellipse] #, :rect, :diamond, :utriangle, :dtriangle, :cross, :xcross, :star5] #vcat(_allMarkers, Shape) supportedScales(::GLVisualizePackage) = [:identity] #, :log, :log2, :log10, :asinh, :sqrt] @@ -765,7 +765,7 @@ supportedArgs(::PGFPlotsPackage) = [ # :levels, ] supportedAxes(::PGFPlotsPackage) = [:auto, :left] -supportedTypes(::PGFPlotsPackage) = [:contour] #, :path, :scatter ,:steppre, :steppost, :sticks, :heatmap, :hexbin, :hist, :bar, :hline, :vline, :contour] +supportedTypes(::PGFPlotsPackage) = [:contour] #, :path, :scatter ,:steppre, :steppost, :sticks, :hist2d, :hexbin, :hist, :bar, :hline, :vline, :contour] supportedStyles(::PGFPlotsPackage) = [:auto, :solid] #, :dash, :dot, :dashdot, :dashdotdot] supportedMarkers(::PGFPlotsPackage) = [:none, :auto, :ellipse] #, :rect, :diamond, :utriangle, :dtriangle, :cross, :xcross, :star5] #vcat(_allMarkers, Shape) supportedScales(::PGFPlotsPackage) = [:identity] #, :log, :log2, :log10, :asinh, :sqrt] diff --git a/src/backends/winston.jl b/src/backends/winston.jl index e7d357f3..f836c6b8 100644 --- a/src/backends/winston.jl +++ b/src/backends/winston.jl @@ -88,7 +88,7 @@ function _add_series(::WinstonPackage, plt::Plot; kw...) - ## lintype :path, :step, :stepinverted, :sticks, :dots, :none, :heatmap, :hexbin, :hist, :bar + ## lintype :path, :step, :stepinverted, :sticks, :dots, :none, :hist2d, :hexbin, :hist, :bar if d[:linetype] == :none Winston.add(wplt, Winston.Points(d[:x], d[:y]; copy_remove(e, :kind)..., color=getColor(d[:markercolor]))) @@ -123,7 +123,7 @@ function _add_series(::WinstonPackage, plt::Plot; kw...) # elseif d[:linetype] == :dots # fn = Winston.XXX - # elseif d[:linetype] == :heatmap + # elseif d[:linetype] == :hist2d # fn = Winston.XXX # elseif d[:linetype] == :hexbin diff --git a/src/recipes.jl b/src/recipes.jl index adf59872..dd883dec 100644 --- a/src/recipes.jl +++ b/src/recipes.jl @@ -127,7 +127,7 @@ end "Sparsity plot... heatmap of non-zero values of a matrix" function spy{T<:Real}(y::AMat{T}; kw...) I,J,V = findnz(y) - heatmap(J, I; leg=false, yflip=true, nbins=size(y), kw...) + heatmap(J, I; leg=false, yflip=true, kw...) end "Adds a+bx... straight line over the current plot" From f568803af27860653701ee8f7a8427abde6606f9 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Wed, 9 Mar 2016 17:48:43 -0500 Subject: [PATCH 117/121] heatmaps, colorscales, and spy... oh my --- src/Plots.jl | 4 ++-- src/backends/plotly.jl | 44 +++++++++++++++++++++++++++------------ src/backends/supported.jl | 4 ++-- src/colors.jl | 4 ++++ src/plot.jl | 10 ++++----- src/recipes.jl | 7 ++++--- 6 files changed, 48 insertions(+), 25 deletions(-) diff --git a/src/Plots.jl b/src/Plots.jl index f643789b..352d8aae 100644 --- a/src/Plots.jl +++ b/src/Plots.jl @@ -124,8 +124,8 @@ export # recipes PlotRecipe, # EllipseRecipe, - # spy, - corrplot + spy + # corrplot # --------------------------------------------------------- diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index d58953aa..e444260c 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -249,10 +249,10 @@ function get_plot_json(plt::Plot{PlotlyPackage}) end -function plotly_colorscale(grad::ColorGradient) - [[grad.values[i], webcolor(grad.colors[i])] for i in 1:length(grad.colors)] +function plotly_colorscale(grad::ColorGradient, alpha = nothing) + [[grad.values[i], webcolor(grad.colors[i], alpha)] for i in 1:length(grad.colors)] end -plotly_colorscale(c) = plotly_colorscale(ColorGradient(:bluesreds)) +plotly_colorscale(c, alpha = nothing) = plotly_colorscale(ColorGradient(:bluesreds), alpha) const _plotly_markers = Dict{Symbol,Any}( :rect => "square", @@ -316,16 +316,26 @@ function plotly_series(d::Dict; plot_index = nothing) d_out[:histnorm] = "probability density" end - elseif lt in (:contour, :surface, :wireframe) - d_out[:type] = lt == :wireframe ? :surface : string(lt) + elseif lt == :heatmap + d_out[:type] = "heatmap" d_out[:x], d_out[:y] = x, y d_out[:z] = d[:z].surf - # d_out[:showscale] = d[:legend] - if lt == :contour - d_out[:ncontours] = d[:levels] - d_out[:contours] = Dict{Symbol,Any}(:coloring => d[:fillrange] != nothing ? "fill" : "lines") - end - d_out[:colorscale] = plotly_colorscale(d[lt == :contour ? :linecolor : :fillcolor]) + d_out[:colorscale] = plotly_colorscale(d[:fillcolor], d[:fillalpha]) + + elseif lt == :contour + d_out[:type] = "contour" + d_out[:x], d_out[:y] = x, y + d_out[:z] = d[:z].surf + # d_out[:showscale] = d[:colorbar] != :none + d_out[:ncontours] = d[:levels] + d_out[:contours] = Dict{Symbol,Any}(:coloring => d[:fillrange] != nothing ? "fill" : "lines") + d_out[:colorscale] = plotly_colorscale(d[:linecolor], d[:linealpha]) + + elseif lt in (:surface, :wireframe) + d_out[:type] = "surface" + d_out[:x], d_out[:y] = x, y + d_out[:z] = d[:z].surf + d_out[:colorscale] = plotly_colorscale(d[:fillcolor], d[:fillalpha]) elseif lt == :pie d_out[:type] = "pie" @@ -360,11 +370,19 @@ function plotly_series(d::Dict; plot_index = nothing) :width => d[:markerstrokewidth], ), ) + + # gotta hack this (for now?) since plotly can't handle rgba values inside the gradient if d[:zcolor] != nothing - d_out[:marker][:color] = d[:zcolor] - d_out[:marker][:colorscale] = plotly_colorscale(d[:markercolor]) + # d_out[:marker][:color] = d[:zcolor] + # d_out[:marker][:colorscale] = plotly_colorscale(d[:markercolor], d[:markeralpha]) + # d_out[:showscale] = true + grad = ColorGradient(d[:markercolor], alpha=d[:markeralpha]) + zmin, zmax = extrema(d[:zcolor]) + d_out[:marker][:color] = [webcolor(getColorZ(grad, (zi - zmin) / (zmax - zmin))) for zi in d[:zcolor]] end + end + dumpdict(d_out, "", true) # add "line" if hasline diff --git a/src/backends/supported.jl b/src/backends/supported.jl index 664de905..087559fe 100644 --- a/src/backends/supported.jl +++ b/src/backends/supported.jl @@ -563,7 +563,7 @@ supportedArgs(::PlotlyPackage) = [ supportedAxes(::PlotlyPackage) = [:auto, :left] supportedTypes(::PlotlyPackage) = [:none, :line, :path, :scatter, :steppre, :steppost, :hist2d, :hist, :density, :bar, :contour, :surface, :path3d, :scatter3d, - :pie] #,, :sticks, :hexbin, :hline, :vline] + :pie, :heatmap] #,, :sticks, :hexbin, :hline, :vline] supportedStyles(::PlotlyPackage) = [:auto, :solid, :dash, :dot, :dashdot] supportedMarkers(::PlotlyPackage) = [:none, :auto, :ellipse, :rect, :diamond, :utriangle, :dtriangle, :cross, :xcross, :pentagon, :hexagon, :octagon, :vline, :hline] #vcat(_allMarkers, Shape) @@ -633,7 +633,7 @@ supportedArgs(::PlotlyJSPackage) = [ supportedAxes(::PlotlyJSPackage) = [:auto, :left] supportedTypes(::PlotlyJSPackage) = [:none, :line, :path, :scatter, :steppre, :steppost, :hist2d, :hist, :density, :bar, :contour, :surface, :path3d, :scatter3d, - :pie] #,, :sticks, :hexbin, :hline, :vline] + :pie, :heatmap] #,, :sticks, :hexbin, :hline, :vline] supportedStyles(::PlotlyJSPackage) = [:auto, :solid, :dash, :dot, :dashdot] supportedMarkers(::PlotlyJSPackage) = [:none, :auto, :ellipse, :rect, :diamond, :utriangle, :dtriangle, :cross, :xcross, :pentagon, :hexagon, :octagon, :vline, :hline] #vcat(_allMarkers, Shape) diff --git a/src/colors.jl b/src/colors.jl index dc703a84..4d1b9a60 100644 --- a/src/colors.jl +++ b/src/colors.jl @@ -107,6 +107,10 @@ function ColorGradient{T<:Real}(cs::AVec{Symbol}, vals::AVec{T} = linspace(0, 1, ColorGradient(map(convertColor, cs), vals; kw...) end +function ColorGradient(grad::ColorGradient; alpha = nothing) + ColorGradient(convertColor(grad.colors, alpha), grad.values) +end + getColor(gradient::ColorGradient, idx::Int) = gradient.colors[mod1(idx, length(gradient.colors))] function getColorZ(gradient::ColorGradient, z::Real) diff --git a/src/plot.jl b/src/plot.jl index c0405412..ef8d5da8 100644 --- a/src/plot.jl +++ b/src/plot.jl @@ -228,7 +228,7 @@ end typealias FuncOrFuncs @compat(Union{Function, AVec{Function}}) -all3D(d::Dict) = trueOrAllTrue(lt -> lt in (:contour, :surface, :wireframe, :image), get(d, :linetype, :none)) +all3D(d::Dict) = trueOrAllTrue(lt -> lt in (:contour, :heatmap, :surface, :wireframe), get(d, :linetype, :none)) # missing convertToAnyVector(v::@compat(Void), d::Dict) = Any[nothing], nothing @@ -328,10 +328,10 @@ function createKWargsList(plt::PlottingObject, x, y; kw...) lt = d[:linetype] if isa(d[:y], Surface) - if lt in (:contour, :surface, :wireframe, :image) + if lt in (:contour, :heatmap, :surface, :wireframe) z = d[:y] d[:y] = 1:size(z,2) - d[lt == :image ? :zcolor : :z] = z + d[:z] = z end end @@ -429,7 +429,7 @@ function createKWargsList{T<:Real}(plt::PlottingObject, x::AVec, y::AVec, zmat:: # surf[1,1] = convert(Matrix{Float64}, zmat) d = Dict(kw) d[:z] = Surface(convert(Matrix{Float64}, zmat)) - if !(get(d, :linetype, :none) in (:contour, :surface, :wireframe)) + if !(get(d, :linetype, :none) in (:contour, :heatmap, :surface, :wireframe)) d[:linetype] = :contour end createKWargsList(plt, x, y; d...) #, z = surf) @@ -443,7 +443,7 @@ function createKWargsList{T<:Real}(plt::PlottingObject, x::AMat{T}, y::AMat{T}, # surf[1,1] = convert(Matrix{Float64}, zmat) d = Dict(kw) d[:z] = Surface(convert(Matrix{Float64}, zmat)) - if !(get(d, :linetype, :none) in (:contour, :surface, :wireframe)) + if !(get(d, :linetype, :none) in (:contour, :heatmap, :surface, :wireframe)) d[:linetype] = :contour end createKWargsList(plt, Any[x], Any[y]; d...) #kw..., z = surf, linetype = :contour) diff --git a/src/recipes.jl b/src/recipes.jl index dd883dec..c133e813 100644 --- a/src/recipes.jl +++ b/src/recipes.jl @@ -125,9 +125,10 @@ end "Sparsity plot... heatmap of non-zero values of a matrix" -function spy{T<:Real}(y::AMat{T}; kw...) - I,J,V = findnz(y) - heatmap(J, I; leg=false, yflip=true, kw...) +function spy{T<:Real}(z::AMat{T}; kw...) + # I,J,V = findnz(z) + # heatmap(J, I; leg=false, yflip=true, kw...) + heatmap(map(zi->float(zi!=0), z); leg=false, yflip=true, kw...) end "Adds a+bx... straight line over the current plot" From 8e4ff397388866e4c48861bbd0d66fa3784fbe15 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Wed, 9 Mar 2016 20:31:46 -0500 Subject: [PATCH 118/121] loosen ColorGradient constructor --- src/colors.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/colors.jl b/src/colors.jl index 4d1b9a60..5073ac07 100644 --- a/src/colors.jl +++ b/src/colors.jl @@ -103,7 +103,7 @@ function ColorGradient{T<:Real}(s::Symbol, vals::AVec{T} = 0:0; kw...) ColorGradient(cs, vals; kw...) end -function ColorGradient{T<:Real}(cs::AVec{Symbol}, vals::AVec{T} = linspace(0, 1, length(cs)); kw...) +function ColorGradient{T<:Real}(cs::AVec, vals::AVec{T} = linspace(0, 1, length(cs)); kw...) ColorGradient(map(convertColor, cs), vals; kw...) end From 581fdfdfe072de71dc0c86c8a99d1ad07db453db Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Wed, 9 Mar 2016 21:55:09 -0500 Subject: [PATCH 119/121] pyplot heatmap --- src/backends/pyplot.jl | 16 +++++++++++++++- src/backends/supported.jl | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index f6822014..fe843c03 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -176,6 +176,7 @@ function getPyPlotFunction(plt::Plot, axis::Symbol, linetype::Symbol) :scatter3d => :scatter, :surface => :plot_surface, :wireframe => :plot_wireframe, + :heatmap => :imshow, # :surface => pycolors.pymember("LinearSegmentedColormap")[:from_list] ) return ax[get(fmap, linetype, :plot)] @@ -370,6 +371,12 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) extra_kwargs[:linewidth] = d[:linewidth] extra_kwargs[:edgecolor] = getPyPlotColor(d[:linecolor], d[:linealpha]) + elseif lt == :heatmap + extra_kwargs[:cmap] = getPyPlotColorMap(d[:fillcolor], d[:fillalpha]) + left, right = extrema(d[:x]) + bottom, top = extrema(d[:y]) + extra_kwargs[:extent] = left, right, bottom, top + else extra_kwargs[:linestyle] = getPyPlotLineStyle(lt, d[:linestyle]) @@ -459,14 +466,21 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) z = z' end plotfunc(x, y, z; extra_kwargs...) + elseif lt in _3dTypes plotfunc(d[:x], d[:y], d[:z]; extra_kwargs...) + elseif lt in (:scatter, :hist2d, :hexbin) plotfunc(d[:x], d[:y]; extra_kwargs...) - else + + elseif lt == :heatmap + plotfunc(d[:z]; extra_kwargs...) + + else # plot plotfunc(d[:x], d[:y]; extra_kwargs...)[1] end + # smoothing handleSmooth(plt, ax, d, d[:smooth]) # add the colorbar legend diff --git a/src/backends/supported.jl b/src/backends/supported.jl index 087559fe..f9ef2cba 100644 --- a/src/backends/supported.jl +++ b/src/backends/supported.jl @@ -167,7 +167,7 @@ supportedArgs(::PyPlotPackage) = [ supportedAxes(::PyPlotPackage) = _allAxes supportedTypes(::PyPlotPackage) = [:none, :line, :path, :steppre, :steppost, #:sticks, :scatter, :hist2d, :hexbin, :hist, :density, :bar, - :hline, :vline, :contour, :path3d, :scatter3d, :surface, :wireframe] + :hline, :vline, :contour, :path3d, :scatter3d, :surface, :wireframe, :heatmap] supportedStyles(::PyPlotPackage) = [:auto, :solid, :dash, :dot, :dashdot] # supportedMarkers(::PyPlotPackage) = [:none, :auto, :rect, :ellipse, :diamond, :utriangle, :dtriangle, :cross, :xcross, :star5, :hexagon] supportedMarkers(::PyPlotPackage) = vcat(_allMarkers, Shape) From 2e6b8a067d41b2053e3a074166e3f27794c8b169 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Wed, 9 Mar 2016 23:34:56 -0500 Subject: [PATCH 120/121] pyplot heatmaps working; ColorGradient fix --- src/backends/pyplot.jl | 12 +++++------- src/colors.jl | 18 +++++++++--------- src/utils.jl | 7 +++++++ 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index fe843c03..cb19ec86 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -176,7 +176,7 @@ function getPyPlotFunction(plt::Plot, axis::Symbol, linetype::Symbol) :scatter3d => :scatter, :surface => :plot_surface, :wireframe => :plot_wireframe, - :heatmap => :imshow, + :heatmap => :pcolor, # :surface => pycolors.pymember("LinearSegmentedColormap")[:from_list] ) return ax[get(fmap, linetype, :plot)] @@ -373,9 +373,6 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) elseif lt == :heatmap extra_kwargs[:cmap] = getPyPlotColorMap(d[:fillcolor], d[:fillalpha]) - left, right = extrema(d[:x]) - bottom, top = extrema(d[:y]) - extra_kwargs[:extent] = left, right, bottom, top else @@ -425,7 +422,7 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) # end # set these for all types - if !(lt in (:contour,:surface,:wireframe)) + if !(lt in (:contour,:surface,:wireframe,:heatmap)) if !(lt in (:scatter, :scatter3d)) extra_kwargs[:color] = color extra_kwargs[:linewidth] = d[:linewidth] @@ -474,7 +471,8 @@ function _add_series(pkg::PyPlotPackage, plt::Plot; kw...) plotfunc(d[:x], d[:y]; extra_kwargs...) elseif lt == :heatmap - plotfunc(d[:z]; extra_kwargs...) + x, y, z = d[:x], d[:y], d[:z].surf' + plotfunc(heatmap_edges(x), heatmap_edges(y), z; extra_kwargs...) else # plot plotfunc(d[:x], d[:y]; extra_kwargs...)[1] @@ -798,7 +796,7 @@ function addPyPlotLegend(plt::Plot, ax) leg = plt.plotargs[:legend] if leg != :none # gotta do this to ensure both axes are included - args = filter(x -> !(x[:linetype] in (:hist,:density,:hexbin,:hist2d,:hline,:vline,:contour, :surface, :wireframe, :path3d, :scatter3d)), plt.seriesargs) + args = filter(x -> !(x[:linetype] in (:hist,:density,:hexbin,:hist2d,:hline,:vline,:contour,:surface,:wireframe,:heatmap,:path3d,:scatter3d)), plt.seriesargs) args = filter(x -> x[:label] != "", args) if length(args) > 0 leg = ax[:legend]([d[:serieshandle] for d in args], diff --git a/src/colors.jl b/src/colors.jl index 5073ac07..2028ebfb 100644 --- a/src/colors.jl +++ b/src/colors.jl @@ -72,10 +72,10 @@ const _testColors = [colorant"darkblue", colorant"blueviolet", colorant"darkcya "Continuous gradient between values. Wraps a list of bounding colors and the values they represent." immutable ColorGradient <: ColorScheme - colors::Vector{Colorant} - values::Vector{Float64} + colors::Vector + values::Vector - function ColorGradient{T<:Colorant,S<:Real}(cs::AVec{T}, vals::AVec{S} = linspace(0, 1, length(cs)); alpha = nothing) + function ColorGradient{S<:Real}(cs::AVec, vals::AVec{S} = linspace(0, 1, length(cs)); alpha = nothing) if length(cs) == length(vals) return new(convertColor(cs,alpha), collect(vals)) end @@ -103,13 +103,13 @@ function ColorGradient{T<:Real}(s::Symbol, vals::AVec{T} = 0:0; kw...) ColorGradient(cs, vals; kw...) end -function ColorGradient{T<:Real}(cs::AVec, vals::AVec{T} = linspace(0, 1, length(cs)); kw...) - ColorGradient(map(convertColor, cs), vals; kw...) -end +# function ColorGradient{T<:Real}(cs::AVec, vals::AVec{T} = linspace(0, 1, length(cs)); kw...) +# ColorGradient(map(convertColor, cs), vals; kw...) +# end -function ColorGradient(grad::ColorGradient; alpha = nothing) - ColorGradient(convertColor(grad.colors, alpha), grad.values) -end +# function ColorGradient(grad::ColorGradient; alpha = nothing) +# ColorGradient(convertColor(grad.colors, alpha), grad.values) +# end getColor(gradient::ColorGradient, idx::Int) = gradient.colors[mod1(idx, length(gradient.colors))] diff --git a/src/utils.jl b/src/utils.jl index 69d8e115..3bdd2c2f 100644 --- a/src/utils.jl +++ b/src/utils.jl @@ -181,6 +181,13 @@ Base.first(x::Symbol) = x sortedkeys(d::Dict) = sort(collect(keys(d))) +"create an (n+1) list of the outsides of heatmap rectangles" +function heatmap_edges(v::AVec) + vmin, vmax = extrema(v) + extra = 0.5 * (vmax-vmin) / (length(v)-1) + vcat(vmin-extra, 0.5 * (v[1:end-1] + v[2:end]), vmax+extra) +end + function fakedata(sz...) y = zeros(sz...) From b32589f7e724c2e0e889e830460266dc388df3bd Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Thu, 10 Mar 2016 16:20:34 -0500 Subject: [PATCH 121/121] removed plotly debugging --- src/backends/plotly.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index e444260c..bf8614bc 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -382,7 +382,6 @@ function plotly_series(d::Dict; plot_index = nothing) end end - dumpdict(d_out, "", true) # add "line" if hasline

G0weg0sfbQ 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%0D9}$6uQTU%@giu z=-FhYR@|2w(rmNfAW@)~pDbjO)IlvODt6^du|rr+aYrjr{_JskkRHLN;l7TI^l%1) zYSM7i&WIv{U-@TO^al^9D9dUbKqOBV+(fe)5+0 zwm{I#=w+9{G*Eh@(cbni`5z_esrgjZd4~!lh{R}43=VZufl5zs-&L0cplXanEv_^C z!dUWO2bNN|>O^yqTkvkuz`xJ{?}IfR4jHV*FQ5;79Gnkr6I(zV811wTqa@?%>3LSv z555c|hv*oBh(HgMMT)7C?I@n}v&&B&FgO%JXB5js`}y49ybGnln7|J=uP#otIQO|u z^=BLy=nuxKA>VMuPZ}{GC?C8sPs0-NlqbLnSAX?`nN~r7o)jc-)Wtgy-1jC{F7OBm zjupu1Ou_n^2Fm}T8TSgloiQ`o{0GiSmxBY_r%pOLR z^m>ArM_mHHcXooB>lr0>v=6_uF%pOnz*kD1US95K|N5pNF+#WeF%Cte|^8eN6Q2mq-XZ0yVq7?JA-)<) zcOb+T&4uss{qXs>Yt#hP%1r<8u6VFAWI&Wk_Rnv%&JCq{PjMuo5ZimX!V9<^VwOGl zI|Nf{y^@c^KA zR2Woacb{GU2>bHfm&7feI$JrZYo^CV;|utmB4^7W8oaCKnNdRX!Z_T4%b~A$KI0FW zHav@Fm6DgrNebFK^#Vb_)}6=`zX@)X3}?h+6nLBS>`cQ6Q-erbkOZg}lQ#vR!j{ZAWz>@5B){^|?X;0!CO zu>t~3tBYS$6<%zjl4)2R=LN6FFLtyL@o$OtMx;CZwQiXGIv${!M~4Rk$fs?c4?{7+ zQQ;Sf$4gp|pg#s#X1#M7q0D+Cy_%Z5A`Fk%DKfB~s9>3_i+$Vcf}u<8Lj+_L3d|!N z6grkim|+8&rg#Qih#LlC^5nsaWg3emRPzk&s`vK4x6&Hmj5QN{&wT~=A2R#z1MIs7 zCp<0CPE?}Z6+Ilr5+Z#`zHn5Y+fMNCmEiYCNo>3@*6*1O^FW^6MDw=b#n?{ptq8L1 zXBDA#<5s>v9x#@zJON+Z^0#Skf2M(fkx2^&iP`3D%uek6uB+Wc-G{BGM+2{~zTxlu zMQ{6m2WNLCJI%PF5X5`G6W?d@*csI=AX`)cl!*B7V`1d3KV$}8+s#C6C1xHkuP(8# z1?1(oEj`6;RB%EZ&45drWQqgRmx<2D=d=r^EN_ENc#>LVL4(cL98G0 z;*T%S*cM{TRUS7>UN7&bs&V{eYO@P7lf$Fd79SCVy>Odx;8Mrip&te0Et8jLSzp!rlQ)lApu}+-EXZ|==>b*aDJ_&_IJ1J!uj4m zS$SS@?LV6~CZCwsK}uX1LWZ{(`?bxrobFE{MWy{H@hSLg=(qnEjS32(p+jMF z;3+Usm4kc?5iL=-BQFVMnmAn_uoNO-0|Og8H&V%_aBl6Pt^nfu3>-Xdo_nP}rH*3v zf(Q8Lkt}>O3|n3vqLR|Gq!d+U<;DB~{X*iGgH}ehu6b9xpkM(|gWWEnsjV;1T|ypG zx~w7Eg$rMseOAu(Z|JWWk`nUA+tH7-iA)oef#med<%d%+-;756bNzk1dW&ro*x?|i zyk*zhJZ_`R6-6RJAOdUaSmL%K8#=!4!^2*yn6Fpa<8rBk7sszM&)j@Zw&TC{#XVFe z-;8~jFdXxWd=`uQiD~g*%Gqo_e#gV8T?MW^LRD$svycH9TZ4&&udmRQg%pzYFnN{c zNJPAzA49p`Oc-M$tH;lQo_XEl&*v;yPf7C_U{E`Y!BV|!5N^{ijT56I(UOIuBcm#q zMv+ZLoM9ZE*S+Uo*`gZF7V~b4ee7s)!4pRs92~4qKj2Jr(R6q|bAKS_*0jtUZVIsl z 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 literal 10257 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