194 lines
4.5 KiB
Julia
194 lines
4.5 KiB
Julia
|
|
typealias AVec AbstractVector
|
|
typealias AMat AbstractMatrix
|
|
|
|
immutable PlotsDisplay <: Display end
|
|
|
|
abstract PlottingPackage
|
|
abstract PlottingObject{T<:PlottingPackage}
|
|
|
|
type Plot{T<:PlottingPackage} <: PlottingObject{T}
|
|
o # the underlying object
|
|
backend::T
|
|
n::Int # number of series
|
|
|
|
# store these just in case
|
|
initargs::Dict
|
|
seriesargs::Vector{Dict} # args for each series
|
|
end
|
|
|
|
|
|
abstract SubplotLayout
|
|
|
|
immutable GridLayout <: SubplotLayout
|
|
nr::Int
|
|
nc::Int
|
|
end
|
|
|
|
immutable FlexLayout <: SubplotLayout
|
|
numplts::Int
|
|
rowcounts::AbstractVector{Int}
|
|
end
|
|
|
|
|
|
type Subplot{T<:PlottingPackage, L<:SubplotLayout} <: PlottingObject{T}
|
|
o # the underlying object
|
|
plts::Vector{Plot} # the individual plots
|
|
backend::T
|
|
p::Int # number of plots
|
|
n::Int # number of series
|
|
layout::L
|
|
initargs::Vector{Dict}
|
|
initialized::Bool
|
|
linkx::Bool
|
|
linky::Bool
|
|
linkfunc::Function # maps (row,column) -> (BoolOrNothing, BoolOrNothing)... if xlink/ylink are nothing, then use subplt.linkx/y
|
|
end
|
|
|
|
# -----------------------------------------------------------------------
|
|
|
|
immutable Shape
|
|
vertices::AVec
|
|
end
|
|
|
|
"get an array of tuples of points on a circle with radius `r`"
|
|
function partialcircle(start_θ, end_θ, n = 20, r=1)
|
|
@compat(Tuple{Float64,Float64})[(r*cos(u),r*sin(u)) for u in linspace(start_θ, end_θ, n)]
|
|
end
|
|
|
|
"interleave 2 vectors into each other (like a zipper's teeth)"
|
|
function weave(x,y; ordering = Vector[x,y])
|
|
ret = eltype(x)[]
|
|
done = false
|
|
while !done
|
|
for o in ordering
|
|
try
|
|
push!(ret, shift!(o))
|
|
end
|
|
# try
|
|
# push!(ret, shift!(y))
|
|
# end
|
|
end
|
|
done = isempty(x) && isempty(y)
|
|
end
|
|
ret
|
|
end
|
|
|
|
|
|
"create a star by weaving together points from an outer and inner circle. `n` is the number of arms"
|
|
function makestar(n; offset = -0.5, radius = 1.0)
|
|
z1 = offset * π
|
|
z2 = z1 + π / (n)
|
|
outercircle = partialcircle(z1, z1 + 2π, n+1, radius)
|
|
innercircle = partialcircle(z2, z2 + 2π, n+1, 0.4radius)
|
|
Shape(weave(outercircle, innercircle)[1:end-2])
|
|
end
|
|
|
|
"create a shape by picking points around the unit circle. `n` is the number of point/sides, `offset` is the starting angle"
|
|
function makeshape(n; offset = -0.5, radius = 1.0)
|
|
z = offset * π
|
|
Shape(partialcircle(z, z + 2π, n+1, radius)[1:end-1])
|
|
end
|
|
|
|
|
|
function makecross(; offset = -0.5, radius = 1.0)
|
|
z2 = offset * π
|
|
z1 = z2 - π/8
|
|
outercircle = partialcircle(z1, z1 + 2π, 9, radius)
|
|
innercircle = partialcircle(z2, z2 + 2π, 5, 0.5radius)
|
|
Shape(weave(outercircle, innercircle,
|
|
ordering=Vector[outercircle,innercircle,outercircle])[1:end-2])
|
|
end
|
|
|
|
|
|
const _shapes = @compat Dict(
|
|
:ellipse => makeshape(20),
|
|
:rect => makeshape(4, offset=-0.25),
|
|
:diamond => makeshape(4),
|
|
:utriangle => makeshape(3),
|
|
:dtriangle => makeshape(3, offset=0.5),
|
|
:pentagon => makeshape(5),
|
|
:hexagon => makeshape(6),
|
|
:heptagon => makeshape(7),
|
|
:octagon => makeshape(8),
|
|
:cross => makecross(offset=-0.25),
|
|
:xcross => makecross(),
|
|
)
|
|
|
|
for n in [4,5,6,7,8]
|
|
_shapes[symbol("star$n")] = makestar(n)
|
|
end
|
|
|
|
# -----------------------------------------------------------------------
|
|
|
|
|
|
immutable Font
|
|
family::AbstractString
|
|
pointsize::Int
|
|
halign::Symbol
|
|
valign::Symbol
|
|
rotation::Float64
|
|
color::Colorant
|
|
end
|
|
|
|
"Create a Font from a list of unordered features"
|
|
function font(args...)
|
|
|
|
# defaults
|
|
family = "Helvetica"
|
|
pointsize = 14
|
|
halign = :hcenter
|
|
valign = :vcenter
|
|
rotation = 0.0
|
|
color = colorant"black"
|
|
|
|
for arg in args
|
|
T = typeof(arg)
|
|
|
|
if arg == :center
|
|
halign = :hcenter
|
|
valign = :vcenter
|
|
elseif arg in (:hcenter, :left, :right)
|
|
halign = arg
|
|
elseif arg in (:vcenter, :top, :bottom)
|
|
valign = arg
|
|
elseif T <: Colorant
|
|
color = arg
|
|
elseif T <: @compat Union{Symbol,AbstractString}
|
|
try
|
|
color = parse(Colorant, string(arg))
|
|
catch
|
|
family = string(arg)
|
|
end
|
|
elseif typeof(arg) <: Integer
|
|
pointsize = arg
|
|
elseif typeof(arg) <: Real
|
|
rotation = convert(Float64, arg)
|
|
else
|
|
warn("Unused font arg: $arg ($(typeof(arg)))")
|
|
end
|
|
end
|
|
|
|
Font(family, pointsize, halign, valign, rotation, color)
|
|
end
|
|
|
|
"Wrap a string with font info"
|
|
immutable PlotText
|
|
str::@compat(AbstractString)
|
|
font::Font
|
|
end
|
|
|
|
function text(str, args...)
|
|
PlotText(string(str), font(args...))
|
|
end
|
|
|
|
|
|
# -----------------------------------------------------------------------
|
|
|
|
type OHLC{T<:Real}
|
|
open::T
|
|
high::T
|
|
low::T
|
|
close::T
|
|
end
|