diff --git a/src/Plots.jl b/src/Plots.jl index 6746edc1..cd4a052a 100644 --- a/src/Plots.jl +++ b/src/Plots.jl @@ -178,7 +178,8 @@ include("plot.jl") include("series_args.jl") include("series_new.jl") # include("subplot.jl") -include("layouts.jl") +# include("layouts.jl") +include("subplots.jl") include("recipes.jl") include("animation.jl") include("output.jl") diff --git a/src/backends/winston.jl b/src/backends/winston.jl index 29347e81..4ea2ce54 100644 --- a/src/backends/winston.jl +++ b/src/backends/winston.jl @@ -127,7 +127,8 @@ function getWinstonItems(plt::Plot) window, canvas, wplt end -function _add_series(::WinstonBackend, plt::Plot, d::KW) +function _add_series(plt::Plot{WinstonBackend}, series::Series) + d = series.d window, canvas, wplt = getWinstonItems(plt) # until we call it normally, do the hack @@ -212,8 +213,8 @@ function _add_series(::WinstonBackend, plt::Plot, d::KW) # optionally add a regression line d[:smooth] && d[:seriestype] != :hist && addRegressionLineWinston(d, wplt) - push!(plt.seriesargs, d) - plt + # push!(plt.seriesargs, d) + # plt end diff --git a/src/layouts.jl b/src/old_layouts.jl similarity index 100% rename from src/layouts.jl rename to src/old_layouts.jl diff --git a/src/subplot.jl b/src/old_subplot.jl similarity index 100% rename from src/subplot.jl rename to src/old_subplot.jl diff --git a/src/subplots.jl b/src/subplots.jl new file mode 100644 index 00000000..1e99829f --- /dev/null +++ b/src/subplots.jl @@ -0,0 +1,118 @@ + + +# ----------------------------------------------------------- +# GridLayout +# ----------------------------------------------------------- + +"nested, gridded layout with optional size percentages." +immutable GridLayout <: SubplotLayout + grid::Matrix # Nested layouts. Each position is an AbstractSubplot or another GridLayout + widths::Vector{Float64} + heights::Vector{Float64} +end + +Base.size(layout::GridLayout) = size(layout.grid) +Base.length(layout::GridLayout) = length(layout.grid) +# Base.start(layout::GridLayout) = 1 +# Base.done(layout::GridLayout, state) = state > length(layout) +# function Base.next(layout::GridLayout, state) +# # TODO: change this method to return more info +# # TODO: might consider multiple iterator types.. some backends might have an easier time row-by-row for example +# error() +# r = 1 +# c = 0 +# for i = 1:state +# c += 1 +# if c > layout.rowcounts[r] +# r += 1 +# c = 1 +# end +# end +# (r,c), state + 1 +# end + +nrows(layout::GridLayout) = size(layout, 1) +ncols(layout::GridLayout) = size(layout, 2) + +# get the plot index given row and column +Base.getindex(layout::GridLayout, r::Int, c::Int) = layout.grid[r,c] + +# ----------------------------------------------------------- + +# # we're taking in a nested structure of some kind... parse it out and build a GridLayout +# function subplotlayout(mat::AbstractVecOrMat; widths = nothing, heights = nothing) +# n = 0 +# nr, nc = size(mat) +# grid = Array(IntOrFlex, nr, nc) +# for i=1:nr, j=1:nc +# v = mat[i,j] +# +# if isa(v, Integer) +# grid[i,j] = Int(v) +# n += 1 +# +# elseif isa(v, Tuple) +# warn("need to handle tuples somehow... (idx, sizepct)") +# grid[i,j] = nothing +# +# elseif v == nothing +# grid[i,j] = nothing +# +# elseif isa(v, AbstractVecOrMat) +# grid[i,j] = layout(v) +# n += grid[i,j].n +# +# else +# error("How do we process? $v") +# end +# end +# +# if widths == nothing +# widths = ones(nc) ./ nc +# end +# if heights == nothing +# heights = ones(nr) ./ nr +# end +# +# GridLayout(n, grid, widths, heights) +# end +# +# +# function subplotlayout(sz::Tuple{Int,Int}) +# GridLayout(sz...) +# end +# +# function subplotlayout(rowcounts::AVec{Int}) +# RowsLayout(sum(rowcounts), rowcounts) +# end +# +# function subplotlayout(numplts::Int, nr::Int, nc::Int) +# +# # figure out how many rows/columns we need +# if nr == -1 +# if nc == -1 +# nr = round(Int, sqrt(numplts)) +# nc = ceil(Int, numplts / nr) +# else +# nr = ceil(Int, numplts / nc) +# end +# else +# nc = ceil(Int, numplts / nr) +# end +# +# # if it's a perfect rectangle, just create a grid +# if numplts == nr * nc +# return GridLayout(nr, nc) +# end +# +# # create the rowcounts vector +# i = 0 +# rowcounts = Int[] +# for r in 1:nr +# cnt = min(nc, numplts - i) +# push!(rowcounts, cnt) +# i += cnt +# end +# +# RowsLayout(numplts, rowcounts) +# end diff --git a/src/types.jl b/src/types.jl index 6776b358..0f581d79 100644 --- a/src/types.jl +++ b/src/types.jl @@ -21,7 +21,10 @@ type AxisView axis::Axis end -type Subplot +abstract AbstractSubplot +immutable EmptySubplot <: AbstractSubplot end + +type Subplot <: AbstractSubplot axisviews::Vector{AxisView} subplotargs::KW # args specific to this subplot obj # can store backend-specific data... like a pyplot ax @@ -29,18 +32,18 @@ end type Series d::KW - x - y - z + # x + # y + # z # subplots::Vector{Subplot} end -function Series(d::KW) - x = pop!(d, :x) - y = pop!(d, :y) - z = pop!(d, :z) - Series(d, x, y, z) -end +# function Series(d::KW) +# x = pop!(d, :x) +# y = pop!(d, :y) +# z = pop!(d, :z) +# Series(d, x, y, z) +# end # ----------------------------------------------------------- # Plot