working on subplot; some reorg
This commit is contained in:
parent
c9d2119ba5
commit
4e57f02f5b
36
src/Plots.jl
36
src/Plots.jl
@ -28,45 +28,14 @@ export
|
|||||||
|
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
typealias AVec AbstractVector
|
|
||||||
typealias AMat AbstractMatrix
|
|
||||||
|
|
||||||
abstract PlottingObject
|
|
||||||
abstract PlottingPackage
|
|
||||||
|
|
||||||
const IMG_DIR = Pkg.dir("Plots") * "/img/"
|
const IMG_DIR = Pkg.dir("Plots") * "/img/"
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
type Plot <: PlottingObject
|
include("types.jl")
|
||||||
o # the underlying object
|
include("utils.jl")
|
||||||
plotter::PlottingPackage
|
|
||||||
n::Int # number of series
|
|
||||||
end
|
|
||||||
|
|
||||||
Base.string(plt::Plot) = "Plot{$(plt.plotter) n=$(plt.n)}"
|
|
||||||
Base.print(io::IO, plt::Plot) = print(io, string(plt))
|
|
||||||
Base.show(io::IO, plt::Plot) = print(io, string(plt))
|
|
||||||
|
|
||||||
getplot(plt::Plot, args...) = plt
|
|
||||||
|
|
||||||
# ---------------------------------------------------------
|
|
||||||
|
|
||||||
type CurrentPlot
|
|
||||||
nullableplot::Nullable{PlottingObject}
|
|
||||||
end
|
|
||||||
const CURRENT_PLOT = CurrentPlot(Nullable{PlottingObject}())
|
|
||||||
|
|
||||||
isplotnull() = isnull(CURRENT_PLOT.nullableplot)
|
|
||||||
|
|
||||||
function currentPlot()
|
|
||||||
if isplotnull()
|
|
||||||
error("No current plot/subplot")
|
|
||||||
end
|
|
||||||
get(CURRENT_PLOT.nullableplot)
|
|
||||||
end
|
|
||||||
currentPlot!(plot::PlottingObject) = (CURRENT_PLOT.nullableplot = Nullable(plot))
|
|
||||||
|
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
@ -76,7 +45,6 @@ include("plotter.jl")
|
|||||||
|
|
||||||
# ---------------------------------------------------------
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
include("utils.jl")
|
|
||||||
include("args.jl")
|
include("args.jl")
|
||||||
include("plot.jl")
|
include("plot.jl")
|
||||||
include("subplot.jl")
|
include("subplot.jl")
|
||||||
|
|||||||
63
src/plot.jl
63
src/plot.jl
@ -1,4 +1,28 @@
|
|||||||
|
|
||||||
|
type CurrentPlot
|
||||||
|
nullableplot::Nullable{PlottingObject}
|
||||||
|
end
|
||||||
|
const CURRENT_PLOT = CurrentPlot(Nullable{PlottingObject}())
|
||||||
|
|
||||||
|
isplotnull() = isnull(CURRENT_PLOT.nullableplot)
|
||||||
|
|
||||||
|
function currentPlot()
|
||||||
|
if isplotnull()
|
||||||
|
error("No current plot/subplot")
|
||||||
|
end
|
||||||
|
get(CURRENT_PLOT.nullableplot)
|
||||||
|
end
|
||||||
|
currentPlot!(plot::PlottingObject) = (CURRENT_PLOT.nullableplot = Nullable(plot))
|
||||||
|
|
||||||
|
# ---------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
Base.string(plt::Plot) = "Plot{$(plt.plotter) n=$(plt.n)}"
|
||||||
|
Base.print(io::IO, plt::Plot) = print(io, string(plt))
|
||||||
|
Base.show(io::IO, plt::Plot) = print(io, string(plt))
|
||||||
|
|
||||||
|
getplot(plt::Plot) = plt
|
||||||
|
|
||||||
|
|
||||||
doc"""
|
doc"""
|
||||||
The main plot command. Call `plotter!(:module)` to set the current plotting backend.
|
The main plot command. Call `plotter!(:module)` to set the current plotting backend.
|
||||||
@ -75,12 +99,20 @@ end
|
|||||||
# this adds to a specific plot... most plot commands will flow through here
|
# this adds to a specific plot... most plot commands will flow through here
|
||||||
function plot!(plt::Plot, args...; kw...)
|
function plot!(plt::Plot, args...; kw...)
|
||||||
|
|
||||||
# increment n if we're going directly to the package's plot method
|
# # increment n if we're going directly to the package's plot method
|
||||||
if length(args) == 0
|
# if length(args) == 0
|
||||||
|
# plt.n += 1
|
||||||
|
# end
|
||||||
|
|
||||||
|
# plot!(plt.plotter, plt, args...; kw...)
|
||||||
|
|
||||||
|
|
||||||
|
kwList = createKWargsList(plt, args...; kw...)
|
||||||
|
for (i,d) in enumerate(kwList)
|
||||||
plt.n += 1
|
plt.n += 1
|
||||||
|
plot!(plt.plotter, plt; d...)
|
||||||
end
|
end
|
||||||
|
|
||||||
plot!(plt.plotter, plt, args...; kw...)
|
|
||||||
currentPlot!(plt)
|
currentPlot!(plt)
|
||||||
|
|
||||||
# do we want to show it?
|
# do we want to show it?
|
||||||
@ -93,7 +125,7 @@ function plot!(plt::Plot, args...; kw...)
|
|||||||
end
|
end
|
||||||
|
|
||||||
# show/update the plot
|
# show/update the plot
|
||||||
function Base.display(plt::Plot)
|
function Base.display(plt::PlottingObject)
|
||||||
display(plt.plotter, plt)
|
display(plt.plotter, plt)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -103,6 +135,11 @@ end
|
|||||||
|
|
||||||
doc"Build a vector of dictionaries which hold the keyword arguments for a call to plot!"
|
doc"Build a vector of dictionaries which hold the keyword arguments for a call to plot!"
|
||||||
|
|
||||||
|
# no args... 1 series
|
||||||
|
function createKWargsList(plt::PlottingObject; kw...)
|
||||||
|
[getPlotKeywordArgs(kw, 1, plt.n + 1)]
|
||||||
|
end
|
||||||
|
|
||||||
# create one series where y is vectors of numbers
|
# create one series where y is vectors of numbers
|
||||||
function createKWargsList{T<:Real}(plt::PlottingObject, y::AVec{T}; kw...)
|
function createKWargsList{T<:Real}(plt::PlottingObject, y::AVec{T}; kw...)
|
||||||
d = getPlotKeywordArgs(kw, 1, plt.n + 1)
|
d = getPlotKeywordArgs(kw, 1, plt.n + 1)
|
||||||
@ -245,15 +282,15 @@ end
|
|||||||
|
|
||||||
# -------------------------
|
# -------------------------
|
||||||
|
|
||||||
# most calls should flow through here now... we create a Dict with the keyword args for each series, and plot them
|
# # most calls should flow through here now... we create a Dict with the keyword args for each series, and plot them
|
||||||
function plot!(pkg::PlottingPackage, plt::Plot, args...; kw...)
|
# function plot!(pkg::PlottingPackage, plt::Plot, args...; kw...)
|
||||||
kwList = createKWargsList(plt, args...; kw...)
|
# kwList = createKWargsList(plt, args...; kw...)
|
||||||
for (i,d) in enumerate(kwList)
|
# for (i,d) in enumerate(kwList)
|
||||||
plt.n += 1
|
# plt.n += 1
|
||||||
plot!(pkg, plt; d...)
|
# plot!(pkg, plt; d...)
|
||||||
end
|
# end
|
||||||
plt
|
# plt
|
||||||
end
|
# end
|
||||||
|
|
||||||
# -------------------------
|
# -------------------------
|
||||||
|
|
||||||
|
|||||||
16
src/qwt.jl
16
src/qwt.jl
@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
immutable QwtPackage <: PlottingPackage end
|
immutable QwtPackage <: PlottingPackage end
|
||||||
|
|
||||||
|
# -------------------------------
|
||||||
|
|
||||||
function adjustQwtKeywords(iscreating::Bool; kw...)
|
function adjustQwtKeywords(iscreating::Bool; kw...)
|
||||||
d = Dict(kw)
|
d = Dict(kw)
|
||||||
d[:heatmap_n] = d[:nbins]
|
d[:heatmap_n] = d[:nbins]
|
||||||
@ -36,6 +38,18 @@ function Base.display(::QwtPackage, plt::Plot)
|
|||||||
Qwt.showwidget(plt.o)
|
Qwt.showwidget(plt.o)
|
||||||
end
|
end
|
||||||
|
|
||||||
savepng(::QwtPackage, plt::Plot, fn::String, args...) = Qwt.savepng(plt.o, fn)
|
# -------------------------------
|
||||||
|
|
||||||
|
savepng(::QwtPackage, plt::PlottingObject, fn::String, args...) = Qwt.savepng(plt.o, fn)
|
||||||
|
|
||||||
|
# -------------------------------
|
||||||
|
|
||||||
# subplot(::QwtPackage, args...; kw...) = Qwt.subplot(args...; kw...)
|
# subplot(::QwtPackage, args...; kw...) = Qwt.subplot(args...; kw...)
|
||||||
|
|
||||||
|
function Base.display(::QwtPackage, subplt::SubPlot)
|
||||||
|
for plt in subplt.plts
|
||||||
|
Qwt.refresh(plt.o)
|
||||||
|
end
|
||||||
|
Qwt.showwidget(subplt.o)
|
||||||
|
end
|
||||||
|
|
||||||
|
|||||||
@ -1,8 +1,4 @@
|
|||||||
|
|
||||||
type SubPlotLayout
|
|
||||||
numplts::Int
|
|
||||||
rowcounts::AbstractVector{Int}
|
|
||||||
end
|
|
||||||
|
|
||||||
# create a layout directly
|
# create a layout directly
|
||||||
SubPlotLayout(rowcounts::AbstractVector{Int}) = SubPlotLayout(sum(rowcounts), rowcounts)
|
SubPlotLayout(rowcounts::AbstractVector{Int}) = SubPlotLayout(sum(rowcounts), rowcounts)
|
||||||
@ -40,25 +36,18 @@ Base.length(layout::SubPlotLayout) = layout.numplts
|
|||||||
|
|
||||||
# ------------------------------------------------------------
|
# ------------------------------------------------------------
|
||||||
|
|
||||||
type SubPlot <: PlottingObject
|
|
||||||
o # the underlying object
|
|
||||||
plts::Vector{Plot} # the individual plots
|
|
||||||
plotter::PlottingPackage
|
|
||||||
p::Int # number of plots
|
|
||||||
n::Int # number of series
|
|
||||||
layout::SubPlotLayout
|
|
||||||
end
|
|
||||||
|
|
||||||
Base.string(subplt::SubPlot) = "SubPlot{$(subplt.plotter) p=$(subplt.p) n=$(subplt.n)}"
|
Base.string(subplt::SubPlot) = "SubPlot{$(subplt.plotter) p=$(subplt.p) n=$(subplt.n)}"
|
||||||
Base.print(io::IO, subplt::SubPlot) = print(io, string(subplt))
|
Base.print(io::IO, subplt::SubPlot) = print(io, string(subplt))
|
||||||
Base.show(io::IO, subplt::SubPlot) = print(io, string(subplt))
|
Base.show(io::IO, subplt::SubPlot) = print(io, string(subplt))
|
||||||
|
|
||||||
getplot(subplt::SubPlot, i::Int) = subplt.plts[mod1(i, subplt.p)]
|
getplot(subplt::SubPlot) = subplt.plts[mod1(subplt.n, subplt.p)]
|
||||||
|
|
||||||
# ------------------------------------------------------------
|
# ------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
doc"""
|
doc"""
|
||||||
|
Create a series of plots:
|
||||||
y = rand(100,3)
|
y = rand(100,3)
|
||||||
subplot(y; n = 3) # create an automatic grid, and let it figure out the numrows/numcols... will put plots 1 and 2 on the first row, and plot 3 by itself on the 2nd row
|
subplot(y; n = 3) # create an automatic grid, and let it figure out the numrows/numcols... will put plots 1 and 2 on the first row, and plot 3 by itself on the 2nd row
|
||||||
subplot(y; n = 3, numrows = 1) # create an automatic grid, but fix the number of rows to 1 (so there are n columns)
|
subplot(y; n = 3, numrows = 1) # create an automatic grid, but fix the number of rows to 1 (so there are n columns)
|
||||||
@ -91,28 +80,63 @@ function subplot(args...; kw...)
|
|||||||
subplot!(subplt, args...; kw...)
|
subplot!(subplt, args...; kw...)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
doc"""
|
||||||
|
Adds to a subplot.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# current subplot
|
||||||
|
function subplot!(args...; kw...)
|
||||||
|
subplot!(currentPlot(), args...; kw...)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
# # this creates a new plot with args/kw and sets it to be the current plot
|
# not allowed:
|
||||||
# function plot(args...; kw...)
|
function subplot!(plt::Plot, args...; kw...)
|
||||||
# plt = plot(plotter(); getPlotKeywordArgs(kw, 1, 0)...) # create a new, blank plot
|
error("Can't call subplot! on a Plot!")
|
||||||
# plot!(plt, args...; kw...) # add to it
|
end
|
||||||
# end
|
|
||||||
|
|
||||||
# # this adds to the current plot
|
|
||||||
# function plot!(args...; kw...)
|
# # this adds to a specific subplot... most plot commands will flow through here
|
||||||
# plot!(currentPlot(), args...; kw...)
|
function subplot!(subplt::SubPlot, args...; kw...)
|
||||||
# end
|
kwList = createKWargsList(subplt, args...; kw...)
|
||||||
|
for (i,d) in enumerate(kwList)
|
||||||
|
subplt.n += 1
|
||||||
|
plt = getplot(subplt) # get the Plot object where this series will be drawn
|
||||||
|
plot!(plt; d...)
|
||||||
|
end
|
||||||
|
|
||||||
|
currentPlot!(subplt)
|
||||||
|
|
||||||
|
# do we want to show it?
|
||||||
|
d = Dict(kw)
|
||||||
|
if haskey(d, :show) && d[:show]
|
||||||
|
display(subplt)
|
||||||
|
end
|
||||||
|
|
||||||
|
subplt
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
# # # this creates a new plot with args/kw and sets it to be the current plot
|
||||||
|
# # function plot(args...; kw...)
|
||||||
|
# # plt = plot(plotter(); getPlotKeywordArgs(kw, 1, 0)...) # create a new, blank plot
|
||||||
|
# # plot!(plt, args...; kw...) # add to it
|
||||||
|
# # end
|
||||||
|
|
||||||
|
# # # this adds to the current plot
|
||||||
|
# # function plot!(args...; kw...)
|
||||||
|
# # plot!(currentPlot(), args...; kw...)
|
||||||
|
# # end
|
||||||
|
|
||||||
# # this adds to a specific plot... most plot commands will flow through here
|
# # this adds to a specific plot... most plot commands will flow through here
|
||||||
# function plot!(plt::Plot, args...; kw...)
|
# function plot!(plt::Plot, args...; kw...)
|
||||||
|
|
||||||
# # increment n if we're going directly to the package's plot method
|
# kwList = createKWargsList(plt, args...; kw...)
|
||||||
# if length(args) == 0
|
# for (i,d) in enumerate(kwList)
|
||||||
# plt.n += 1
|
# plt.n += 1
|
||||||
|
# plot!(plt.plotter, plt; d...)
|
||||||
# end
|
# end
|
||||||
|
|
||||||
# plot!(plt.plotter, plt, args...; kw...)
|
|
||||||
# currentPlot!(plt)
|
# currentPlot!(plt)
|
||||||
|
|
||||||
# # do we want to show it?
|
# # do we want to show it?
|
||||||
@ -124,19 +148,4 @@ end
|
|||||||
# plt
|
# plt
|
||||||
# end
|
# end
|
||||||
|
|
||||||
# # show/update the plot
|
|
||||||
# function Base.display(plt::Plot)
|
|
||||||
# display(plt.plotter, plt)
|
|
||||||
# end
|
|
||||||
|
|
||||||
|
|
||||||
# # most calls should flow through here now... we create a Dict with the keyword args for each series, and plot them
|
|
||||||
# function plot!(pkg::PlottingPackage, plt::Plot, args...; kw...)
|
|
||||||
# kwList = createKWargsList(plt, args...; kw...)
|
|
||||||
# for (i,d) in enumerate(kwList)
|
|
||||||
# plt.n += 1
|
|
||||||
# plot!(pkg, plt; d...)
|
|
||||||
# end
|
|
||||||
# plt
|
|
||||||
# end
|
|
||||||
|
|
||||||
|
|||||||
28
src/types.jl
Normal file
28
src/types.jl
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
typealias AVec AbstractVector
|
||||||
|
typealias AMat AbstractMatrix
|
||||||
|
|
||||||
|
abstract PlottingObject
|
||||||
|
abstract PlottingPackage
|
||||||
|
|
||||||
|
type Plot <: PlottingObject
|
||||||
|
o # the underlying object
|
||||||
|
plotter::PlottingPackage
|
||||||
|
n::Int # number of series
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
type SubPlotLayout
|
||||||
|
numplts::Int
|
||||||
|
rowcounts::AbstractVector{Int}
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
type SubPlot <: PlottingObject
|
||||||
|
o # the underlying object
|
||||||
|
plts::Vector{Plot} # the individual plots
|
||||||
|
plotter::PlottingPackage
|
||||||
|
p::Int # number of plots
|
||||||
|
n::Int # number of series
|
||||||
|
layout::SubPlotLayout
|
||||||
|
end
|
||||||
Loading…
x
Reference in New Issue
Block a user