From fe87e985ecb04a175fa988a8768050975f58d8b3 Mon Sep 17 00:00:00 2001 From: Thomas Breloff Date: Wed, 9 Sep 2015 00:06:15 -0400 Subject: [PATCH] proper handling of colors --- src/Plots.jl | 1 + src/args.jl | 12 +++++++++++- src/gadfly.jl | 14 ++++++++++---- src/plot.jl | 41 +++++++++++++++++++++++++++++------------ src/qwt.jl | 2 +- 5 files changed, 52 insertions(+), 18 deletions(-) diff --git a/src/Plots.jl b/src/Plots.jl index 1510beba..d4b893a9 100644 --- a/src/Plots.jl +++ b/src/Plots.jl @@ -39,6 +39,7 @@ const IMG_DIR = "$(ENV["HOME"])/.julia/v0.4/Plots/img/" type Plot o # the underlying object plotter::PlottingPackage + n::Int # number of series end diff --git a/src/args.jl b/src/args.jl index aefe8858..a54504c0 100644 --- a/src/args.jl +++ b/src/args.jl @@ -54,7 +54,7 @@ makeplural(s::Symbol) = Symbol(string(s,"s")) autocolor(idx::Integer) = COLORS[mod1(idx,NUMCOLORS)] -function getPlotKeywordArgs(kw, i::Int) +function getPlotKeywordArgs(kw, i::Int, plt = nothing) d = Dict(kw) outd = Dict() @@ -69,6 +69,16 @@ function getPlotKeywordArgs(kw, i::Int) end end + # auto assign a color + if plt != nothing + if outd[:color] == :auto + outd[:color] = autocolor(plt.n) + end + if outd[:markercolor] == :auto + outd[:markercolor] = outd[:color] + end + end + outd end diff --git a/src/gadfly.jl b/src/gadfly.jl index 05b3fa46..841387bb 100644 --- a/src/gadfly.jl +++ b/src/gadfly.jl @@ -11,7 +11,7 @@ function plot(pkg::GadflyPackage; kw...) plt.mapping = Dict() plt.data_source = DataFrames.DataFrame() plt.layers = plt.layers[1:0] - Plot(plt, pkg) + Plot(plt, pkg, 0) end @@ -44,14 +44,20 @@ function plot!(::GadflyPackage, plt::Plot; kw...) # label # color - if d[:color] == :auto - color = convert(RGB{Float32}, autocolor(length(plt.o.layers)+1)) + c = d[:color] + if isa(c, Symbol) + c = string(c) end + if isa(c, String) + c = parse(Colorant, c) + end + @assert isa(c, RGB) + push!(gfargs, Gadfly.Theme(default_color=c)) # legend # guides (x/y labels, title, background, ticks) - append!(plt.o.layers, Gadfly.layer(unique(gfargs)...; x = d[:x], y = d[:y], color = [color])) + append!(plt.o.layers, Gadfly.layer(unique(gfargs)...; x = d[:x], y = d[:y])) plt end diff --git a/src/plot.jl b/src/plot.jl index be812632..775ad5fa 100644 --- a/src/plot.jl +++ b/src/plot.jl @@ -126,6 +126,12 @@ end # this adds to a specific plot... most plot commands will flow through here function plot!(plt::Plot, args...; kw...) + + # increment n if we're going directly to the package's plot method + if length(args) == 0 + plt.n += 1 + end + plot!(plt.plotter, plt, args...; kw...) currentPlot!(plt) @@ -148,18 +154,21 @@ end # These methods are various ways to add to an existing plot function plot!(pkg::PlottingPackage, plt::Plot, y::AVec; kw...) - plot!(pkg, plt; x = 1:length(y), y = y, getPlotKeywordArgs(kw, 1)...) + plt.n += 1 + plot!(pkg, plt; x = 1:length(y), y = y, getPlotKeywordArgs(kw, 1, plt)...) end function plot!(pkg::PlottingPackage, plt::Plot, x::AVec, y::AVec; kw...) # one line (will assert length(x) == length(y)) @assert length(x) == length(y) - plot!(pkg, plt; x=x, y=y, getPlotKeywordArgs(kw, 1)...) + plt.n += 1 + plot!(pkg, plt; x=x, y=y, getPlotKeywordArgs(kw, 1, plt)...) end function plot!(pkg::PlottingPackage, plt::Plot, y::AMat; kw...) # multiple lines (one per column of x), all sharing x = 1:size(y,1) n,m = size(y) for i in 1:m - plot!(pkg, plt; x = 1:n, y = y[:,i], getPlotKeywordArgs(kw, i)...) + plt.n += 1 + plot!(pkg, plt; x = 1:n, y = y[:,i], getPlotKeywordArgs(kw, i, plt)...) end plt end @@ -168,7 +177,8 @@ function plot!(pkg::PlottingPackage, plt::Plot, x::AVec, y::AMat; kw...) n,m = size(y) for i in 1:m @assert length(x) == n - plot!(pkg, plt; x = x, y = y[:,i], getPlotKeywordArgs(kw, i)...) + plt.n += 1 + plot!(pkg, plt; x = x, y = y[:,i], getPlotKeywordArgs(kw, i, plt)...) end plt end @@ -176,33 +186,37 @@ end function plot!(pkg::PlottingPackage, plt::Plot, x::AMat, y::AMat; kw...) # multiple lines (one per column of x/y... will assert size(x) == size(y)) @assert size(x) == size(y) for i in 1:size(x,2) - plot!(pkg, plt; x = x[:,i], y = y[:,i], getPlotKeywordArgs(kw, i)...) + plt.n += 1 + plot!(pkg, plt; x = x[:,i], y = y[:,i], getPlotKeywordArgs(kw, i, plt)...) end plt end function plot!(pkg::PlottingPackage, plt::Plot, x::AVec, f::Function; kw...) # one line, y = f(x) - plot!(pkg, plt; x = x, y = map(f,x), getPlotKeywordArgs(kw, 1)...) + plot!(pkg, plt; x = x, y = map(f,x), getPlotKeywordArgs(kw, 1, plt)...) end function plot!(pkg::PlottingPackage, plt::Plot, x::AMat, f::Function; kw...) # multiple lines, yᵢⱼ = f(xᵢⱼ) for i in 1:size(x,2) xi = x[:,i] - plot!(pkg, plt; x = xi, y = map(f, xi), getPlotKeywordArgs(kw, i)...) + plt.n += 1 + plot!(pkg, plt; x = xi, y = map(f, xi), getPlotKeywordArgs(kw, i, plt)...) end plt end function plot!(pkg::PlottingPackage, plt::Plot, x::AVec, fs::AVec{Function}; kw...) # multiple lines, yᵢⱼ = fⱼ(xᵢ) for i in 1:length(fs) - plot!(pkg, plt; x = x, y = map(fs[i], x), getPlotKeywordArgs(kw, i)...) + plt.n += 1 + plot!(pkg, plt; x = x, y = map(fs[i], x), getPlotKeywordArgs(kw, i, plt)...) end plt end function plot!(pkg::PlottingPackage, plt::Plot, y::AVec{AVec}; kw...) # multiple lines, each with x = 1:length(y[i]) for i in 1:length(y) - plot!(pkg, plt; x = 1:length(y[i]), y = y[i], getPlotKeywordArgs(kw, i)...) + plt.n += 1 + plot!(pkg, plt; x = 1:length(y[i]), y = y[i], getPlotKeywordArgs(kw, i, plt)...) end plt end @@ -210,7 +224,8 @@ end function plot!(pkg::PlottingPackage, plt::Plot, x::AVec, y::AVec{AVec}; kw...) # multiple lines, will assert length(x) == length(y[i]) for i in 1:length(y) @assert length(x) == length(y[i]) - plot!(pkg, plt; x = x, y = y[i], getPlotKeywordArgs(kw, i)...) + plt.n += 1 + plot!(pkg, plt; x = x, y = y[i], getPlotKeywordArgs(kw, i, plt)...) end plt end @@ -219,14 +234,16 @@ function plot!(pkg::PlottingPackage, plt::Plot, x::AVec{AVec}, y::AVec{AVec}; kw @assert length(x) == length(y) for i in 1:length(x) @assert length(x[i]) == length(y[i]) - plot!(pkg, plt; x = x[i], y = y[i], getPlotKeywordArgs(kw, i)...) + plt.n += 1 + plot!(pkg, plt; x = x[i], y = y[i], getPlotKeywordArgs(kw, i, plt)...) end plt end function plot!(pkg::PlottingPackage, plt::Plot, n::Integer; kw...) # n lines, all empty (for updating plots) for i in 1:n - plot(pkg, plt, x = zeros(0), y = zeros(0), getPlotKeywordArgs(kw, i)...) + plt.n += 1 + plot(pkg, plt, x = zeros(0), y = zeros(0), getPlotKeywordArgs(kw, i, plt)...) end end diff --git a/src/qwt.jl b/src/qwt.jl index c6e3c210..a1664f69 100644 --- a/src/qwt.jl +++ b/src/qwt.jl @@ -3,7 +3,7 @@ immutable QwtPackage <: PlottingPackage end -plot(pkg::QwtPackage; kw...) = Plot(Qwt.plot(zeros(0,0); kw...), pkg) +plot(pkg::QwtPackage; kw...) = Plot(Qwt.plot(zeros(0,0); kw...), pkg, 0) function plot!(::QwtPackage, plt::Plot; kw...) Qwt.oplot(plt.o; kw...)