From 899afd625a41bc93dfdc22bc4e45635a927dfcd0 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Mon, 4 Dec 2017 09:16:00 +0100 Subject: [PATCH 1/7] add new heme() function --- src/themes.jl | 78 +++++++++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 34 deletions(-) diff --git a/src/themes.jl b/src/themes.jl index 840078dd..0f09246f 100644 --- a/src/themes.jl +++ b/src/themes.jl @@ -4,43 +4,53 @@ Specify the colour theme for plots. """ function theme(s::Symbol; kw...) - # reset? - if s == :none || s == :default - PlotUtils.clibrary(:Plots) - PlotUtils.default_cgrad(default = :sequential, sequential = :inferno) - default(; - bg = :white, - bglegend = :match, - bginside = :match, - bgoutside = :match, - fg = :auto, - fglegend = :match, - fggrid = :match, - fgaxis = :match, - fgtext = :match, - fgborder = :match, - fgguide = :match, - palette = :auto - ) - return - end - - # update the default gradient and other defaults - thm = PlotThemes._themes[s] - if thm.gradient != nothing + defaults = merge(_initial_defaults..., s.defaults, kw) + if haskey(s.defaults, :gradient) PlotUtils.clibrary(:misc) PlotUtils.default_cgrad(default = :sequential, sequential = PlotThemes.gradient_name(s)) end - default(; - bg = thm.bg_secondary, - bginside = thm.bg_primary, - fg = thm.lines, - fgtext = thm.text, - fgguide = thm.text, - fglegend = thm.text, - palette = thm.palette, - kw... - ) + default(; defaults...) + return end +# function theme(s::Symbol; kw...) +# # reset? +# if s == :none || s == :default +# PlotUtils.clibrary(:Plots) +# PlotUtils.default_cgrad(default = :sequential, sequential = :inferno) +# default(; +# bg = :white, +# bglegend = :match, +# bginside = :match, +# bgoutside = :match, +# fg = :auto, +# fglegend = :match, +# fggrid = :match, +# fgaxis = :match, +# fgtext = :match, +# fgborder = :match, +# fgguide = :match, +# palette = :auto +# ) +# return +# end +# +# # update the default gradient and other defaults +# thm = PlotThemes._themes[s] +# if thm.gradient != nothing +# PlotUtils.clibrary(:misc) +# PlotUtils.default_cgrad(default = :sequential, sequential = PlotThemes.gradient_name(s)) +# end +# default(; +# bg = thm.bg_secondary, +# bginside = thm.bg_primary, +# fg = thm.lines, +# fgtext = thm.text, +# fgguide = thm.text, +# fglegend = thm.text, +# palette = thm.palette, +# kw... +# ) +# end + @deprecate set_theme(s) theme(s) From b987331b4fc5793fb6bb0794f645779528d989ad Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Mon, 4 Dec 2017 14:54:35 +0100 Subject: [PATCH 2/7] update new heme() function --- src/args.jl | 6 ++++- src/themes.jl | 68 +++++++++++++++++++-------------------------------- 2 files changed, 30 insertions(+), 44 deletions(-) diff --git a/src/args.jl b/src/args.jl index 70fa458c..b9c8f2a0 100644 --- a/src/args.jl +++ b/src/args.jl @@ -417,6 +417,7 @@ const _all_defaults = KW[ ] const _initial_defaults = deepcopy(_all_defaults) +const _initial_axis_defaults = deepcopy(_axis_defaults) # to be able to reset font sizes to initial values const _initial_fontsizes = Dict(:titlefont => _subplot_defaults[:titlefontsize], @@ -614,7 +615,10 @@ function default(d::KW, k::Symbol) get(d, k, default(k)) end -reset_defaults() = foreach(merge!, _all_defaults, _initial_defaults) +function reset_defaults() + foreach(merge!, _all_defaults, _initial_defaults) + merge!(_axis_defaults, _initial_axis_defaults) +end # ----------------------------------------------------------------------------- diff --git a/src/themes.jl b/src/themes.jl index 0f09246f..b570836f 100644 --- a/src/themes.jl +++ b/src/themes.jl @@ -4,53 +4,35 @@ Specify the colour theme for plots. """ function theme(s::Symbol; kw...) - defaults = merge(_initial_defaults..., s.defaults, kw) - if haskey(s.defaults, :gradient) + # Reset to defaults to overwrite active team + reset_defaults() + thm = PlotThemes._themes[s] + + # Set the theme's gradient as default + if haskey(thm.defaults, :gradient) PlotUtils.clibrary(:misc) PlotUtils.default_cgrad(default = :sequential, sequential = PlotThemes.gradient_name(s)) + else + PlotUtils.clibrary(:Plots) + PlotUtils.default_cgrad(default = :sequential, sequential = :inferno) end - default(; defaults...) + + # maybe overwrite the theme's gradient + kw = KW(kw) + if haskey(kw, :gradient) + kwgrad = pop!(kw, :gradient) + for clib in clibraries() + if kwgrad in cgradients(clib) + PlotUtils.clibrary(clib) + PlotUtils.default_cgrad(default = :sequential, sequential = kwgrad) + break + end + end + end + + # Set the theme's defaults + default(; thm.defaults..., kw...) return end -# function theme(s::Symbol; kw...) -# # reset? -# if s == :none || s == :default -# PlotUtils.clibrary(:Plots) -# PlotUtils.default_cgrad(default = :sequential, sequential = :inferno) -# default(; -# bg = :white, -# bglegend = :match, -# bginside = :match, -# bgoutside = :match, -# fg = :auto, -# fglegend = :match, -# fggrid = :match, -# fgaxis = :match, -# fgtext = :match, -# fgborder = :match, -# fgguide = :match, -# palette = :auto -# ) -# return -# end -# -# # update the default gradient and other defaults -# thm = PlotThemes._themes[s] -# if thm.gradient != nothing -# PlotUtils.clibrary(:misc) -# PlotUtils.default_cgrad(default = :sequential, sequential = PlotThemes.gradient_name(s)) -# end -# default(; -# bg = thm.bg_secondary, -# bginside = thm.bg_primary, -# fg = thm.lines, -# fgtext = thm.text, -# fgguide = thm.text, -# fglegend = thm.text, -# palette = thm.palette, -# kw... -# ) -# end - @deprecate set_theme(s) theme(s) From 22d8ecffe5268e0d645bf11be8f4a8fc782292aa Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Mon, 4 Dec 2017 15:53:45 +0100 Subject: [PATCH 3/7] fix typo --- src/themes.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/themes.jl b/src/themes.jl index b570836f..40a9e1f8 100644 --- a/src/themes.jl +++ b/src/themes.jl @@ -4,7 +4,7 @@ Specify the colour theme for plots. """ function theme(s::Symbol; kw...) - # Reset to defaults to overwrite active team + # Reset to defaults to overwrite active theme reset_defaults() thm = PlotThemes._themes[s] From 70bead1eb1347312f0a929567b5d58ff6d5f823d Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Tue, 5 Dec 2017 22:09:18 +0100 Subject: [PATCH 4/7] support old PlotTheme type --- src/themes.jl | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/themes.jl b/src/themes.jl index 40a9e1f8..5107bcde 100644 --- a/src/themes.jl +++ b/src/themes.jl @@ -3,13 +3,35 @@ Specify the colour theme for plots. """ -function theme(s::Symbol; kw...) +function theme(s::Symbol, kw...) + thm = PlotThemes._themes[s] + defaults = if :defaults in fieldnames(thm) + thm.defaults + else # old PlotTheme type + defs = KW( + :bg => thm.bg_secondary, + :bginside => thm.bg_primary, + :fg => thm.lines, + :fgtext => thm.text, + :fgguide => thm.text, + :fglegend => thm.text, + :palette => thm.palette, + ) + if thm.gradient != nothing + push!(defs, :gradient => thm.gradient) + end + defs + end + _theme(s, defaults, kw...) +end + + +function _theme(s::Symbol, defaults::KW; kw...) # Reset to defaults to overwrite active theme reset_defaults() - thm = PlotThemes._themes[s] # Set the theme's gradient as default - if haskey(thm.defaults, :gradient) + if haskey(defaults, :gradient) PlotUtils.clibrary(:misc) PlotUtils.default_cgrad(default = :sequential, sequential = PlotThemes.gradient_name(s)) else @@ -31,7 +53,7 @@ function theme(s::Symbol; kw...) end # Set the theme's defaults - default(; thm.defaults..., kw...) + default(; defaults..., kw...) return end From a8380334df087868989b5dbb8a48fe68c24ecd26 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Tue, 5 Dec 2017 22:28:22 +0100 Subject: [PATCH 5/7] fix kw support --- src/themes.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/themes.jl b/src/themes.jl index 5107bcde..52420381 100644 --- a/src/themes.jl +++ b/src/themes.jl @@ -3,7 +3,7 @@ Specify the colour theme for plots. """ -function theme(s::Symbol, kw...) +function theme(s::Symbol; kw...) thm = PlotThemes._themes[s] defaults = if :defaults in fieldnames(thm) thm.defaults From 0f3928ec9ac6f9ecf366a112b771e1efd9d221aa Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Tue, 5 Dec 2017 22:29:56 +0100 Subject: [PATCH 6/7] fix kw support --- src/themes.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/themes.jl b/src/themes.jl index 52420381..8fc47c8f 100644 --- a/src/themes.jl +++ b/src/themes.jl @@ -22,7 +22,7 @@ function theme(s::Symbol; kw...) end defs end - _theme(s, defaults, kw...) + _theme(s, defaults; kw...) end From c76ca2dd6e35e924f33c291dd4755bfcb0facf07 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Mon, 11 Dec 2017 09:27:02 +0100 Subject: [PATCH 7/7] add showtheme recipe --- src/themes.jl | 123 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 116 insertions(+), 7 deletions(-) diff --git a/src/themes.jl b/src/themes.jl index 8fc47c8f..adf9df24 100644 --- a/src/themes.jl +++ b/src/themes.jl @@ -4,11 +4,16 @@ Specify the colour theme for plots. """ function theme(s::Symbol; kw...) + defaults = _get_defaults(s) + _theme(s, defaults; kw...) +end + +function _get_defaults(s::Symbol) thm = PlotThemes._themes[s] - defaults = if :defaults in fieldnames(thm) - thm.defaults + if :defaults in fieldnames(thm) + return thm.defaults else # old PlotTheme type - defs = KW( + defaults = KW( :bg => thm.bg_secondary, :bginside => thm.bg_primary, :fg => thm.lines, @@ -18,14 +23,12 @@ function theme(s::Symbol; kw...) :palette => thm.palette, ) if thm.gradient != nothing - push!(defs, :gradient => thm.gradient) + push!(defaults, :gradient => thm.gradient) end - defs + return defaults end - _theme(s, defaults; kw...) end - function _theme(s::Symbol, defaults::KW; kw...) # Reset to defaults to overwrite active theme reset_defaults() @@ -58,3 +61,109 @@ function _theme(s::Symbol, defaults::KW; kw...) end @deprecate set_theme(s) theme(s) + +@userplot ShowTheme + +_color_functions = KW( + :protanopic => protanopic, + :deuteranopic => deuteranopic, + :tritanopic => tritanopic, +) +_get_showtheme_args(thm::Symbol) = thm, identity +_get_showtheme_args(thm::Symbol, func::Symbol) = thm, get(_color_functions, func, identity) + +@recipe function showtheme(st::ShowTheme) + thm, cfunc = _get_showtheme_args(st.args...) + defaults = _get_defaults(thm) + + # get the gradient + gradient_colors = pop!(defaults, :gradient, cgrad(:inferno).colors) + gradient = cgrad(cfunc.(RGB.(gradient_colors))) + + # get the palette + palette = pop!(defaults, :palette, get_color_palette(:auto, plot_color(:white), 17)) + palette = cfunc.(RGB.(palette)) + + # apply the theme + for k in keys(defaults) + def = defaults[k] + arg = get(_keyAliases, k, k) + plotattributes[arg] = if typeof(def) <: Colorant + cfunc(RGB(def)) + elseif eltype(def) <: Colorant + cfunc.(RGB.(def)) + elseif contains(string(arg), "color") + cfunc.(RGB.(plot_color.(def))) + else + def + end + end + + srand(1) + + label := "" + colorbar := false + layout := (2, 3) + + for j in 1:4 + @series begin + subplot := 1 + palette := palette + seriestype := :path + linewidth := 2 + cumsum(randn(50)) + end + + @series begin + subplot := 2 + seriestype := :scatter + palette := palette + markersize := 5 + markerstrokewidth := 0 + marker := (:circle, :diamond, :star5, :square)[j] + randn(10), randn(10) + end + end + + @series begin + subplot := 3 + seriestype := :histogram + palette := palette + randn(1000) .+ (0:2:4)' + end + + f(r) = sin(r) / r + _norm(x, y) = norm([x, y]) + x = y = linspace(-3π, 3π, 30) + z = f.(_norm.(x, y')) + wi = 2:3:30 + + @series begin + subplot := 4 + seriestype := :heatmap + seriescolor := gradient + x, y, z + end + + @series begin + subplot := 5 + seriestype := :surface + seriescolor := gradient + x, y, z + end + + n = 100 + ts = linspace(0, 10π, n) + x = ts .* cos.(ts) + y = (0.1ts) .* sin.(ts) + z = 1:n + + @series begin + subplot := 6 + seriescolor := gradient + linewidth := 3 + line_z := z + x, y, z + end + +end