working on subplots and recipes
This commit is contained in:
parent
f4b716b255
commit
64b8e15918
File diff suppressed because one or more lines are too long
@ -72,6 +72,11 @@ export
|
|||||||
getColor,
|
getColor,
|
||||||
getColorZ,
|
getColorZ,
|
||||||
|
|
||||||
|
PlotRecipe,
|
||||||
|
EllipseRecipe,
|
||||||
|
|
||||||
|
debugplots,
|
||||||
|
|
||||||
supportedArgs,
|
supportedArgs,
|
||||||
supportedAxes,
|
supportedAxes,
|
||||||
supportedTypes,
|
supportedTypes,
|
||||||
@ -94,6 +99,7 @@ include("plotter.jl")
|
|||||||
include("args.jl")
|
include("args.jl")
|
||||||
include("plot.jl")
|
include("plot.jl")
|
||||||
include("subplot.jl")
|
include("subplot.jl")
|
||||||
|
include("recipes.jl")
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
|
|||||||
13
src/args.jl
13
src/args.jl
@ -150,6 +150,9 @@ _plotDefaults[:n] = -1
|
|||||||
_plotDefaults[:nr] = -1
|
_plotDefaults[:nr] = -1
|
||||||
_plotDefaults[:nc] = -1
|
_plotDefaults[:nc] = -1
|
||||||
_plotDefaults[:color_palette] = :auto
|
_plotDefaults[:color_palette] = :auto
|
||||||
|
_plotDefaults[:link] = false
|
||||||
|
_plotDefaults[:linkx] = false
|
||||||
|
_plotDefaults[:linky] = false
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -260,6 +263,8 @@ end
|
|||||||
:gui => :show,
|
:gui => :show,
|
||||||
:display => :show,
|
:display => :show,
|
||||||
:palette => :color_palette,
|
:palette => :color_palette,
|
||||||
|
:xlink => :linkx,
|
||||||
|
:ylink => :linky,
|
||||||
)
|
)
|
||||||
|
|
||||||
# add all pluralized forms to the _keyAliases dict
|
# add all pluralized forms to the _keyAliases dict
|
||||||
@ -446,6 +451,14 @@ function preprocessArgs!(d::Dict)
|
|||||||
end
|
end
|
||||||
delete!(d, :fill)
|
delete!(d, :fill)
|
||||||
|
|
||||||
|
# handle subplot links
|
||||||
|
if haskey(d, :link)
|
||||||
|
l = d[:link]
|
||||||
|
d[:linkx] = l
|
||||||
|
d[:linky] = l
|
||||||
|
delete!(d, :link)
|
||||||
|
end
|
||||||
|
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -54,6 +54,8 @@ supportedArgs(::GadflyPackage) = [
|
|||||||
:xflip,
|
:xflip,
|
||||||
:yflip,
|
:yflip,
|
||||||
:z,
|
:z,
|
||||||
|
:linkx,
|
||||||
|
:linky,
|
||||||
]
|
]
|
||||||
supportedAxes(::GadflyPackage) = [:auto, :left]
|
supportedAxes(::GadflyPackage) = [:auto, :left]
|
||||||
supportedTypes(::GadflyPackage) = [:none, :line, :path, :steppost, :sticks, :scatter, :heatmap, :hexbin, :hist, :bar, :hline, :vline, :ohlc]
|
supportedTypes(::GadflyPackage) = [:none, :line, :path, :steppost, :sticks, :scatter, :heatmap, :hexbin, :hist, :bar, :hline, :vline, :ohlc]
|
||||||
@ -487,17 +489,32 @@ end
|
|||||||
# ----------------------------------------------------------------
|
# ----------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
getGadflyContext(::GadflyPackage, plt::Plot) = plt.o
|
getGadflyContext(plt::Plot{GadflyPackage}) = plt.o
|
||||||
getGadflyContext(::GadflyPackage, subplt::Subplot) = buildGadflySubplotContext(subplt)
|
getGadflyContext(subplt::Subplot{GadflyPackage}) = buildGadflySubplotContext(subplt)
|
||||||
|
|
||||||
# create my Compose.Context grid by hstacking and vstacking the Gadfly.Plot objects
|
# create my Compose.Context grid by hstacking and vstacking the Gadfly.Plot objects
|
||||||
function buildGadflySubplotContext(subplt::Subplot)
|
function buildGadflySubplotContext(subplt::Subplot)
|
||||||
i = 0
|
# i = 0
|
||||||
|
# rows = Any[]
|
||||||
|
# for rowcnt in subplt.layout.rowcounts
|
||||||
|
# push!(rows, Gadfly.hstack([getGadflyContext(plt) for plt in subplt.plts[(1:rowcnt) + i]]...))
|
||||||
|
# i += rowcnt
|
||||||
|
# end
|
||||||
rows = Any[]
|
rows = Any[]
|
||||||
for rowcnt in subplt.layout.rowcounts
|
row = Any[]
|
||||||
push!(rows, Gadfly.hstack([getGadflyContext(plt.backend, plt) for plt in subplt.plts[(1:rowcnt) + i]]...))
|
for (i,(r,c)) in enumerate(subplt.layout)
|
||||||
i += rowcnt
|
|
||||||
|
# add the Plot object to the row
|
||||||
|
push!(row, getGadflyContext(subplt.plts[i]))
|
||||||
|
|
||||||
|
# add the row
|
||||||
|
if c == ncols(subplt.layout, r)
|
||||||
|
push!(rows, Gadfly.hstack(row...))
|
||||||
|
row = Any[]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# stack the rows
|
||||||
Gadfly.vstack(rows...)
|
Gadfly.vstack(rows...)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -506,7 +523,7 @@ function setGadflyDisplaySize(w,h)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function Base.writemime(io::IO, ::MIME"image/png", plt::Plot{GadflyPackage})
|
function Base.writemime(io::IO, ::MIME"image/png", plt::Plot{GadflyPackage})
|
||||||
gplt = getGadflyContext(plt.backend, plt)
|
gplt = getGadflyContext(plt)
|
||||||
setGadflyDisplaySize(plt.initargs[:size]...)
|
setGadflyDisplaySize(plt.initargs[:size]...)
|
||||||
Gadfly.draw(Gadfly.PNG(io, Compose.default_graphic_width, Compose.default_graphic_height), gplt)
|
Gadfly.draw(Gadfly.PNG(io, Compose.default_graphic_width, Compose.default_graphic_height), gplt)
|
||||||
end
|
end
|
||||||
@ -520,7 +537,7 @@ end
|
|||||||
|
|
||||||
|
|
||||||
function Base.writemime(io::IO, ::MIME"image/png", plt::Subplot{GadflyPackage})
|
function Base.writemime(io::IO, ::MIME"image/png", plt::Subplot{GadflyPackage})
|
||||||
gplt = getGadflyContext(plt.backend, plt)
|
gplt = getGadflyContext(plt)
|
||||||
setGadflyDisplaySize(plt.initargs[1][:size]...)
|
setGadflyDisplaySize(plt.initargs[1][:size]...)
|
||||||
Gadfly.draw(Gadfly.PNG(io, Compose.default_graphic_width, Compose.default_graphic_height), gplt)
|
Gadfly.draw(Gadfly.PNG(io, Compose.default_graphic_width, Compose.default_graphic_height), gplt)
|
||||||
end
|
end
|
||||||
|
|||||||
@ -125,8 +125,8 @@ end
|
|||||||
|
|
||||||
# ----------------------------------------------------------------
|
# ----------------------------------------------------------------
|
||||||
|
|
||||||
getGadflyContext(::ImmersePackage, plt::Plot) = plt.o[2]
|
getGadflyContext(plt::Plot{ImmersePackage}) = plt.o[2]
|
||||||
getGadflyContext(::ImmersePackage, subplt::Subplot) = buildGadflySubplotContext(subplt)
|
getGadflyContext(subplt::Subplot{ImmersePackage}) = buildGadflySubplotContext(subplt)
|
||||||
|
|
||||||
function Base.writemime(io::IO, ::MIME"image/png", plt::Plot{ImmersePackage})
|
function Base.writemime(io::IO, ::MIME"image/png", plt::Plot{ImmersePackage})
|
||||||
gplt = getGadflyContext(plt.backend, plt)
|
gplt = getGadflyContext(plt.backend, plt)
|
||||||
@ -149,7 +149,7 @@ end
|
|||||||
|
|
||||||
|
|
||||||
function Base.writemime(io::IO, ::MIME"image/png", plt::Subplot{ImmersePackage})
|
function Base.writemime(io::IO, ::MIME"image/png", plt::Subplot{ImmersePackage})
|
||||||
gplt = getGadflyContext(plt.backend, plt)
|
gplt = getGadflyContext(plt)
|
||||||
setGadflyDisplaySize(plt.initargs[1][:size]...)
|
setGadflyDisplaySize(plt.initargs[1][:size]...)
|
||||||
Gadfly.draw(Gadfly.PNG(io, Compose.default_graphic_width, Compose.default_graphic_height), gplt)
|
Gadfly.draw(Gadfly.PNG(io, Compose.default_graphic_width, Compose.default_graphic_height), gplt)
|
||||||
end
|
end
|
||||||
|
|||||||
@ -334,10 +334,10 @@ mapFuncOrFuncs(f::Function, u::AVec) = map(f, u)
|
|||||||
mapFuncOrFuncs(fs::AVec{Function}, u::AVec) = [map(f, u) for f in fs]
|
mapFuncOrFuncs(fs::AVec{Function}, u::AVec) = [map(f, u) for f in fs]
|
||||||
|
|
||||||
# special handling... xmin/xmax with parametric function(s)
|
# special handling... xmin/xmax with parametric function(s)
|
||||||
function createKWargsList(plt::PlottingObject, fx::FuncOrFuncs, fy::FuncOrFuncs, umin::Real, umax::Real, numPoints::Int = 1000; kw...)
|
createKWargsList{T<:Real}(plt::PlottingObject, fx::FuncOrFuncs, fy::FuncOrFuncs, u::AVec{T}; kw...) = createKWargsList(plt, mapFuncOrFuncs(fx, u), mapFuncOrFuncs(fy, u); kw...)
|
||||||
u = collect(linspace(umin, umax, numPoints))
|
createKWargsList{T<:Real}(plt::PlottingObject, u::AVec{T}, fx::FuncOrFuncs, fy::FuncOrFuncs; kw...) = createKWargsList(plt, mapFuncOrFuncs(fx, u), mapFuncOrFuncs(fy, u); 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))
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
# special handling... no args... 1 series
|
# special handling... no args... 1 series
|
||||||
|
|||||||
51
src/recipes.jl
Normal file
51
src/recipes.jl
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
|
||||||
|
abstract PlotRecipe
|
||||||
|
|
||||||
|
getRecipeXY(recipe::PlotRecipe) = Float64[], Float64[]
|
||||||
|
getRecipeArgs(recipe::PlotRecipe) = ()
|
||||||
|
|
||||||
|
plot(recipe::PlotRecipe, args...; kw...) = plot(getRecipeXY(recipe)..., args...; getRecipeArgs(recipe)..., kw...)
|
||||||
|
plot!(recipe::PlotRecipe, args...; kw...) = plot!(getRecipeXY(recipe)..., args...; getRecipeArgs(recipe)..., kw...)
|
||||||
|
plot!(plt::Plot, recipe::PlotRecipe, args...; kw...) = plot!(getRecipeXY(recipe)..., args...; getRecipeArgs(recipe)..., kw...)
|
||||||
|
|
||||||
|
|
||||||
|
# -------------------------------------------------
|
||||||
|
|
||||||
|
type EllipseRecipe <: PlotRecipe
|
||||||
|
w::Float64
|
||||||
|
h::Float64
|
||||||
|
x::Float64
|
||||||
|
y::Float64
|
||||||
|
θ::Float64
|
||||||
|
end
|
||||||
|
EllipseRecipe(w,h,x,y) = EllipseRecipe(w,h,x,y,0)
|
||||||
|
|
||||||
|
# return x,y coords of a rotated ellipse, centered at the origin
|
||||||
|
function rotatedEllipse(w, h, x, y, θ, rotθ)
|
||||||
|
# coord before rotation
|
||||||
|
xpre = w * cos(θ)
|
||||||
|
ypre = h * sin(θ)
|
||||||
|
|
||||||
|
# rotate
|
||||||
|
xrot = xpre * cos(rotθ) + ypre * sin(rotθ)
|
||||||
|
yrot = ypre * cos(rotθ) - xpre * sin(rotθ)
|
||||||
|
|
||||||
|
# translate
|
||||||
|
xrot + x, yrot + y
|
||||||
|
end
|
||||||
|
|
||||||
|
function getRecipeXY(ep::EllipseRecipe)
|
||||||
|
x, y = unzip([rotatedEllipse(ep.w, ep.h, ep.x, ep.y, u, ep.θ) for u in linspace(0,2π,100)])
|
||||||
|
right = rotatedEllipse(ep.w, ep.h, ep.x, ep.y, 0, ep.θ)
|
||||||
|
top = rotatedEllipse(ep.w, ep.h, ep.x, ep.y, 0.5π, ep.θ)
|
||||||
|
linex = Float64[top[1], ep.x, right[1]]
|
||||||
|
liney = Float64[top[2], ep.y, right[2]]
|
||||||
|
Any[x, linex], Any[y, liney]
|
||||||
|
end
|
||||||
|
|
||||||
|
function getRecipeArgs(ep::EllipseRecipe)
|
||||||
|
d = Dict()
|
||||||
|
d[:line] = (3, [:dot :solid], [:red :blue], :path)
|
||||||
|
d
|
||||||
|
end
|
||||||
|
|
||||||
@ -95,13 +95,14 @@ Base.length(layout::GridLayout) = layout.nr * layout.nc
|
|||||||
Base.start(layout::GridLayout) = 1
|
Base.start(layout::GridLayout) = 1
|
||||||
Base.done(layout::GridLayout, state) = state > length(layout)
|
Base.done(layout::GridLayout, state) = state > length(layout)
|
||||||
function Base.next(layout::GridLayout, state)
|
function Base.next(layout::GridLayout, state)
|
||||||
r = div(state, layout.nc)
|
r = div(state-1, layout.nc) + 1
|
||||||
c = mod1(state, layout.nc)
|
c = mod1(state, layout.nc)
|
||||||
(r,c), state + 1
|
(r,c), state + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
nrows(layout::GridLayout) = layout.nr
|
nrows(layout::GridLayout) = layout.nr
|
||||||
ncols(layout::GridLayout) = layout.nc
|
ncols(layout::GridLayout) = layout.nc
|
||||||
|
ncols(layout::GridLayout, row::Int) = layout.nc
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -167,7 +168,7 @@ function subplot(args...; kw...)
|
|||||||
# # tmpd[:show] = shouldShow
|
# # tmpd[:show] = shouldShow
|
||||||
|
|
||||||
# create the object and do the plotting
|
# create the object and do the plotting
|
||||||
subplt = Subplot(nothing, plts, pkg, length(layout), 0, layout, ds, false)
|
subplt = Subplot(nothing, plts, pkg, length(layout), 0, layout, ds, false, get(d, :linkx, false), get(d, :linky, false))
|
||||||
subplot!(subplt, args...; kw...)
|
subplot!(subplt, args...; kw...)
|
||||||
|
|
||||||
subplt
|
subplt
|
||||||
@ -235,6 +236,13 @@ function subplot!(subplt::Subplot, args...; kw...)
|
|||||||
updatePlotItems(plt, di)
|
updatePlotItems(plt, di)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if subplt.linkx
|
||||||
|
linkXAxis(subplt)
|
||||||
|
end
|
||||||
|
if subplt.linky
|
||||||
|
linkYAxis(subplt)
|
||||||
|
end
|
||||||
|
|
||||||
# set this to be current
|
# set this to be current
|
||||||
current(subplt)
|
current(subplt)
|
||||||
|
|
||||||
|
|||||||
@ -31,15 +31,17 @@ immutable FlexLayout <: SubplotLayout
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
type Subplot{T<:PlottingPackage} <: PlottingObject{T}
|
type Subplot{T<:PlottingPackage, L<:SubplotLayout} <: PlottingObject{T}
|
||||||
o # the underlying object
|
o # the underlying object
|
||||||
plts::Vector{Plot} # the individual plots
|
plts::Vector{Plot} # the individual plots
|
||||||
backend::T
|
backend::T
|
||||||
p::Int # number of plots
|
p::Int # number of plots
|
||||||
n::Int # number of series
|
n::Int # number of series
|
||||||
layout::SubplotLayout
|
layout::L
|
||||||
initargs::Vector{Dict}
|
initargs::Vector{Dict}
|
||||||
initialized::Bool
|
initialized::Bool
|
||||||
|
linkx::Bool
|
||||||
|
linky::Bool
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -114,6 +114,9 @@ maketuple(x::Real) = (x,x)
|
|||||||
maketuple{T,S}(x::@compat(Tuple{T,S})) = x
|
maketuple{T,S}(x::@compat(Tuple{T,S})) = x
|
||||||
|
|
||||||
|
|
||||||
|
unzip{T,S}(v::AVec{@compat(Tuple{T,S})}) = [vi[1] for vi in v], [vi[2] for vi in v]
|
||||||
|
|
||||||
|
|
||||||
function replaceAliases!(d::Dict, aliases::Dict)
|
function replaceAliases!(d::Dict, aliases::Dict)
|
||||||
for (k,v) in d
|
for (k,v) in d
|
||||||
if haskey(aliases, k)
|
if haskey(aliases, k)
|
||||||
@ -153,6 +156,9 @@ type DebugMode
|
|||||||
end
|
end
|
||||||
const _debugMode = DebugMode(false)
|
const _debugMode = DebugMode(false)
|
||||||
|
|
||||||
|
function debugplots(on = true)
|
||||||
|
_debugMode.on = on
|
||||||
|
end
|
||||||
|
|
||||||
function dumpdict(d::Dict, prefix = "")
|
function dumpdict(d::Dict, prefix = "")
|
||||||
_debugMode.on || return
|
_debugMode.on || return
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user