use add_attributes macro with modification

This commit is contained in:
Simon Christ 2020-11-20 15:48:53 +01:00 committed by Simon Christ
parent 4ab9dc17f5
commit 62a2cebd1c
16 changed files with 340 additions and 307 deletions

View File

@ -54,6 +54,7 @@ StatsBase = "0.32, 0.33"
julia = "1.5" julia = "1.5"
[extras] [extras]
Colors = "5ae59095-9a9b-59fe-a467-6f913c188581"
Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f"
FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549"
Gtk = "4c0ca9eb-093a-5379-98c5-f87ac0bbbf44" Gtk = "4c0ca9eb-093a-5379-98c5-f87ac0bbbf44"

View File

@ -197,6 +197,7 @@ include("colorbars.jl")
include("axes.jl") include("axes.jl")
include("args.jl") include("args.jl")
include("components.jl") include("components.jl")
include("consts.jl")
include("themes.jl") include("themes.jl")
include("plot.jl") include("plot.jl")
include("pipeline.jl") include("pipeline.jl")

View File

@ -84,44 +84,31 @@ const _arg_desc = KW(
:titlefontrotation => "Real. Font rotation of subplot title", :titlefontrotation => "Real. Font rotation of subplot title",
:titlefontcolor => "Color Type. Font color of subplot title", :titlefontcolor => "Color Type. Font color of subplot title",
:background_color_subplot => "Color Type or `:match` (matches `:background_color`). Base background color of the subplot.", :background_color_subplot => "Color Type or `:match` (matches `:background_color`). Base background color of the subplot.",
:background_color_legend => "Color Type or `:match` (matches `:background_color_subplot`). Background color of the legend.", :legend_background_color => "Color Type or `:match` (matches `:background_color_subplot`). Background color of the legend.",
:background_color_inside => "Color Type or `:match` (matches `:background_color_subplot`). Background color inside the plot area (under the grid).", :background_color_inside => "Color Type or `:match` (matches `:background_color_subplot`). Background color inside the plot area (under the grid).",
:foreground_color_subplot => "Color Type or `:match` (matches `:foreground_color`). Base foreground color of the subplot.", :foreground_color_subplot => "Color Type or `:match` (matches `:foreground_color`). Base foreground color of the subplot.",
:foreground_color_legend => "Color Type or `:match` (matches `:foreground_color_subplot`). Foreground color of the legend.", :legend_foreground_color => "Color Type or `:match` (matches `:foreground_color_subplot`). Foreground color of the legend.",
:foreground_color_title => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of subplot title.", :foreground_color_title => "Color Type or `:match` (matches `:foreground_color_subplot`). Color of subplot title.",
:color_palette => "Vector of colors (cycle through) or color gradient (generate list from gradient) or `:auto` (generate a color list using `Colors.distiguishable_colors` and custom seed colors chosen to contrast with the background). The color palette is a color list from which series colors are automatically chosen.", :color_palette => "Vector of colors (cycle through) or color gradient (generate list from gradient) or `:auto` (generate a color list using `Colors.distiguishable_colors` and custom seed colors chosen to contrast with the background). The color palette is a color list from which series colors are automatically chosen.",
:legend => "Bool (show the legend?) or (x,y) tuple or Symbol (legend position) or angle or (angle,inout) tuple. Bottom left corner of legend is placed at (x,y). Symbol values: `:none`; `:best`; `:inline`; `:inside`; `:legend`; any valid combination of `:(outer ?)(top/bottom ?)(right/left ?)`, i.e.: `:top`, `:topright`, `:outerleft`, `:outerbottomright` ... (note: only some may be supported in each backend). Legend is positioned at (angle degrees) (so (90,:outer) is roughly equivalent to :outertop), close to the inside of the axes or the outside if inout=:outer.", :legend => "Bool (show the legend?) or (x,y) tuple or Symbol (legend position). Bottom left corner of legend is placed at (x,y). Symbol values: `:none`; `:best`; `:inline`; `:inside`; `:legend`; any valid combination of `:(outer ?)(top/bottom ?)(right/left ?)`, i.e.: `:top`, `:topright`, `:outerleft`, `:outerbottomright` ... (note: only some may be supported in each backend)",
:legendfontfamily => "String or Symbol. Font family of legend entries.", :legend_font_family => "String or Symbol. Font family of legend entries.",
:legendfontsize => "Integer. Font pointsize of legend entries.", :legend_font_pointsize => "Integer. Font pointsize of legend entries.",
:legendfonthalign => "Symbol. Font horizontal alignment of legend entries: :hcenter, :left, :right or :center", :legend_font_halign => "Symbol. Font horizontal alignment of legend entries: :hcenter, :left, :right or :center",
:legendfontvalign => "Symbol. Font vertical alignment of legend entries: :vcenter, :top, :bottom or :center", :legend_font_valign => "Symbol. Font vertical alignment of legend entries: :vcenter, :top, :bottom or :center",
:legendfontrotation => "Real. Font rotation of legend entries", :legend_font_rotation => "Real. Font rotation of legend entries",
:legendfontcolor => "Color Type. Font color of legend entries", :legend_font_color => "Color Type. Font color of legend entries",
:legendtitle => "String. Legend title.", :legend_title => "String. Legend title.",
:legendtitlefontfamily => "String or Symbol. Font family of the legend title.", :legend_title_font_family => "String or Symbol. Font family of the legend title.",
:legendtitlefontsize => "Integer. Font pointsize the legend title.", :legend_title_font_pointsize => "Integer. Font pointsize the legend title.",
:legendtitlefonthalign => "Symbol. Font horizontal alignment of the legend title: :hcenter, :left, :right or :center", :legend_title_font_halign => "Symbol. Font horizontal alignment of the legend title: :hcenter, :left, :right or :center",
:legendtitlefontvalign => "Symbol. Font vertical alignment of the legend title: :vcenter, :top, :bottom or :center", :legend_title_font_valign => "Symbol. Font vertical alignment of the legend title: :vcenter, :top, :bottom or :center",
:legendtitlefontrotation => "Real. Font rotation of the legend title", :legend_title_font_rotation => "Real. Font rotation of the legend title",
:legendtitlefontcolor => "Color Type. Font color of the legend title", :legend_title_font_color => "Color Type. Font color of the legend title",
:colorbar => "Bool (show the colorbar?) or Symbol (colorbar position). Symbol values: `:none`, `:best`, `:right`, `:left`, `:top`, `:bottom`, `:legend` (matches legend value) (note: only some may be supported in each backend)", :colorbar => "Bool (show the colorbar?) or Symbol (colorbar position). Symbol values: `:none`, `:best`, `:right`, `:left`, `:top`, `:bottom`, `:legend` (matches legend value) (note: only some may be supported in each backend)",
:clims => "`:auto`, NTuple{2,Number}, or a function that takes series data in and returns NTuple{2,Number}. Fixes the limits of the colorbar.", :clims => "`:auto`, NTuple{2,Number}, or a function that takes series data in and returns NTuple{2,Number}. Fixes the limits of the colorbar.",
:colorbar_fontfamily => "String or Symbol. Font family of colobar entries.",
:colorbar_ticks => "Vector of numbers (set the tick values), Tuple of (tickvalues, ticklabels), or `:auto`",
:colorbar_tickfontfamily => "String or Symbol. Font family of colorbar tick labels.",
:colorbar_tickfontsize => "Integer. Font pointsize of colorbar tick entries.",
:colorbar_tickfontcolor => "Color Type. Font color of colorbar tick entries",
:colorbar_scale => "Symbol. Scale of the colorbar axis: `:none`, `:ln`, `:log2`, `:log10`",
:colorbar_formatter => "Function, :scientific, :plain or :auto. A method which converts a number to a string for tick labeling.",
:legendfont => "Font. Font of legend items.", :legendfont => "Font. Font of legend items.",
:legendtitlefont => "Font. Font of the legend title.", :legend_titlefont => "Font. Font of the legend title.",
:annotations => "(x,y,text) tuple(s). Can be a single tuple or a list of them. Text can be String or PlotText (created with `text(args...)`) Add one-off text annotations at the x,y coordinates.", :annotations => "(x,y,text) tuple(s). Can be a single tuple or a list of them. Text can be String or PlotText (created with `text(args...)`) Add one-off text annotations at the x,y coordinates.",
:annotationfontfamily => "String or Symbol. Font family of annotations.",
:annotationfontsize => "Integer. Font pointsize of annotations.",
:annotationhalign => "Symbol. horizontal alignment of annotations, :hcenter, :left, :right or :center.",
:annotationvalign => "Symbol. Vertical alignment of annotations, :vcenter, :top, :bottom or :center.",
:annotationrotation => "Float. Rotation of annotations in degrees.",
:annotationcolor => "Colorant or :match. Color of annotations.",
:projection => "Symbol or String. '3d' or 'polar'", :projection => "Symbol or String. '3d' or 'polar'",
:aspect_ratio => "Symbol (:equal or :none) or Number. Plot area is resized so that 1 y-unit is the same size as `aspect_ratio` x-units. With `:none`, images inherit aspect ratio of the plot area.", :aspect_ratio => "Symbol (:equal or :none) or Number. Plot area is resized so that 1 y-unit is the same size as `aspect_ratio` x-units. With `:none`, images inherit aspect ratio of the plot area.",
:margin => "Measure (multiply by `mm`, `px`, etc). Base for individual margins... not directly used. Specifies the extra padding around subplots.", :margin => "Measure (multiply by `mm`, `px`, etc). Base for individual margins... not directly used. Specifies the extra padding around subplots.",

View File

@ -373,47 +373,13 @@ const _subplot_defaults = KW(
:titlefontrotation => 0.0, :titlefontrotation => 0.0,
:titlefontcolor => :match, :titlefontcolor => :match,
:background_color_subplot => :match, # default for other bg colors... match takes plot default :background_color_subplot => :match, # default for other bg colors... match takes plot default
:background_color_legend => :match, # background of legend
:background_color_inside => :match, # background inside grid :background_color_inside => :match, # background inside grid
:foreground_color_subplot => :match, # default for other fg colors... match takes plot default :foreground_color_subplot => :match, # default for other fg colors... match takes plot default
:foreground_color_legend => :match, # foreground of legend
:foreground_color_title => :match, # title color :foreground_color_title => :match, # title color
:color_palette => :auto, :color_palette => :auto,
:legend => :best,
:legendtitle => nothing,
:colorbar => :legend, :colorbar => :legend,
:clims => :auto, :clims => :auto,
:colorbar_fontfamily => :match,
:colorbar_ticks => :auto,
:colorbar_tickfontfamily => :match,
:colorbar_tickfontsize => 8,
:colorbar_tickfonthalign => :hcenter,
:colorbar_tickfontvalign => :vcenter,
:colorbar_tickfontrotation => 0.0,
:colorbar_tickfontcolor => :match,
:colorbar_scale => :identity,
:colorbar_formatter => :auto,
:colorbar_discrete_values => [],
:colorbar_continuous_values => zeros(0),
:legendfontfamily => :match,
:legendfontsize => 8,
:legendfonthalign => :hcenter,
:legendfontvalign => :vcenter,
:legendfontrotation => 0.0,
:legendfontcolor => :match,
:legendtitlefontfamily => :match,
:legendtitlefontsize => 11,
:legendtitlefonthalign => :hcenter,
:legendtitlefontvalign => :vcenter,
:legendtitlefontrotation => 0.0,
:legendtitlefontcolor => :match,
:annotations => [], # annotation tuples... list of (x,y,annotation) :annotations => [], # annotation tuples... list of (x,y,annotation)
:annotationfontfamily => :match,
:annotationfontsize => 14,
:annotationhalign => :hcenter,
:annotationvalign => :vcenter,
:annotationrotation => 0.0,
:annotationcolor => :match,
:projection => :none, # can also be :polar or :3d :projection => :none, # can also be :polar or :3d
:aspect_ratio => :auto, # choose from :none or :equal :aspect_ratio => :auto, # choose from :none or :equal
:margin => 1mm, :margin => 1mm,
@ -425,6 +391,7 @@ const _subplot_defaults = KW(
:colorbar_title => "", :colorbar_title => "",
:colorbar_titlefontsize => 10, :colorbar_titlefontsize => 10,
:colorbar_title_location => :center, # also :left or :right :colorbar_title_location => :center, # also :left or :right
:colorbar_fontfamily => :match,
:colorbar_titlefontfamily => :match, :colorbar_titlefontfamily => :match,
:colorbar_titlefonthalign => :hcenter, :colorbar_titlefonthalign => :hcenter,
:colorbar_titlefontvalign => :vcenter, :colorbar_titlefontvalign => :vcenter,
@ -512,42 +479,6 @@ for letter in (:x,:y,:z), k in keys(_axis_defaults)
add_aliases(Symbol(letter, k), Symbol(letter, "_", k)) add_aliases(Symbol(letter, k), Symbol(letter, "_", k))
end end
const _all_defaults = KW[
_series_defaults,
_plot_defaults,
_subplot_defaults
]
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(:titlefontsize => _subplot_defaults[:titlefontsize],
:legendfontsize => _subplot_defaults[:legendfontsize],
:legendtitlefontsize => _subplot_defaults[:legendtitlefontsize],
:annotationfontsize => _subplot_defaults[:annotationfontsize],
:tickfontsize => _axis_defaults[:tickfontsize],
:guidefontsize => _axis_defaults[:guidefontsize])
const _internal_args =
[:plot_object, :series_plotindex, :markershape_to_add, :letter, :idxfilter]
const _axis_args = sort(union(collect(keys(_axis_defaults))))
const _series_args = sort(union(collect(keys(_series_defaults))))
const _subplot_args = sort(union(collect(keys(_subplot_defaults))))
const _plot_args = sort(union(collect(keys(_plot_defaults))))
const _magic_axis_args = [:axis, :tickfont, :guidefont, :grid, :minorgrid]
const _magic_subplot_args = [:titlefont, :legendfont, :legendtitlefont, :plot_titlefont, :colorbar_titlefont]
const _magic_series_args = [:line, :marker, :fill]
const _all_axis_args = sort(union([_axis_args; _magic_axis_args]))
const _all_subplot_args = sort(union([_subplot_args; _magic_subplot_args]))
const _all_series_args = sort(union([_series_args; _magic_series_args]))
const _all_plot_args = _plot_args
const _all_args =
sort(union([_all_axis_args; _all_subplot_args; _all_series_args; _all_plot_args]))
is_subplot_attr(k) = k in _all_subplot_args is_subplot_attr(k) = k in _all_subplot_args
is_series_attr(k) = k in _all_series_args is_series_attr(k) = k in _all_series_args
@ -574,7 +505,11 @@ function aliases(aliasMap::Dict{Symbol,Symbol}, val)
end end
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# legend
add_aliases(:legend_postion, :legend)
add_aliases(:legend_background_color, :background_color_legend)
add_aliases(:legend_foreground_color, :foreground_color_legend)
add_aliases(:legend_font_pointsize, :legendfontsize)
# margin # margin
add_aliases(:left_margin , :leftmargin ) add_aliases(:left_margin , :leftmargin )
@ -593,7 +528,7 @@ add_aliases(:fillcolor, :fc, :fcolor, :fcolour, :fillcolour)
add_aliases(:background_color, :bg, :bgcolor, :bg_color, :background, add_aliases(:background_color, :bg, :bgcolor, :bg_color, :background,
:background_colour, :bgcolour, :bg_colour) :background_colour, :bgcolour, :bg_colour)
add_aliases(:background_color_legend, :bg_legend, :bglegend, :bgcolor_legend, :bg_color_legend, :background_legend, add_aliases(:legend_background_color, :bg_legend, :bglegend, :bgcolor_legend, :bg_color_legend, :background_legend,
:background_colour_legend, :bgcolour_legend, :bg_colour_legend) :background_colour_legend, :bgcolour_legend, :bg_colour_legend)
add_aliases(:background_color_subplot, :bg_subplot, :bgsubplot, :bgcolor_subplot, :bg_color_subplot, :background_subplot, add_aliases(:background_color_subplot, :bg_subplot, :bgsubplot, :bgcolor_subplot, :bg_color_subplot, :background_subplot,
:background_colour_subplot, :bgcolour_subplot, :bg_colour_subplot) :background_colour_subplot, :bgcolour_subplot, :bg_colour_subplot)
@ -603,7 +538,7 @@ add_aliases(:background_color_outside, :bg_outside, :bgoutside, :bgcolor_outside
:background_colour_outside, :bgcolour_outside, :bg_colour_outside) :background_colour_outside, :bgcolour_outside, :bg_colour_outside)
add_aliases(:foreground_color, :fg, :fgcolor, :fg_color, :foreground, add_aliases(:foreground_color, :fg, :fgcolor, :fg_color, :foreground,
:foreground_colour, :fgcolour, :fg_colour) :foreground_colour, :fgcolour, :fg_colour)
add_aliases(:foreground_color_legend, :fg_legend, :fglegend, :fgcolor_legend, :fg_color_legend, :foreground_legend, add_aliases(:legend_foreground_color, :fg_legend, :fglegend, :fgcolor_legend, :fg_color_legend, :foreground_legend,
:foreground_colour_legend, :fgcolour_legend, :fg_colour_legend) :foreground_colour_legend, :fgcolour_legend, :fg_colour_legend)
add_aliases(:foreground_color_subplot, :fg_subplot, :fgsubplot, :fgcolor_subplot, :fg_color_subplot, :foreground_subplot, add_aliases(:foreground_color_subplot, :fg_subplot, :fgsubplot, :fgcolor_subplot, :fg_color_subplot, :foreground_subplot,
:foreground_colour_subplot, :fgcolour_subplot, :fg_colour_subplot) :foreground_colour_subplot, :fgcolour_subplot, :fg_colour_subplot)
@ -698,13 +633,6 @@ add_aliases(:camera, :cam, :viewangle, :view_angle)
add_aliases(:contour_labels, :contourlabels, :clabels, :clabs) add_aliases(:contour_labels, :contourlabels, :clabels, :clabs)
add_aliases(:warn_on_unsupported, :warn) add_aliases(:warn_on_unsupported, :warn)
# add all pluralized forms to the _keyAliases dict
for arg in _all_args
add_aliases(arg, makeplural(arg))
end
# add all non_underscored forms to the _keyAliases
add_non_underscore_aliases!(_keyAliases)
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
function parse_axis_kw(s::Symbol) function parse_axis_kw(s::Symbol)
@ -1178,8 +1106,8 @@ function RecipesPipeline.preprocess_attributes!(plotattributes::AKW)
# end # end
# legends # legends
if haskey(plotattributes, :legend) if haskey(plotattributes, :legend_position)
plotattributes[:legend] = convertLegendValue(plotattributes[:legend]) plotattributes[:legend_position] = convertLegendValue(plotattributes[:legend_position])
end end
if haskey(plotattributes, :colorbar) if haskey(plotattributes, :colorbar)
plotattributes[:colorbar] = convertLegendValue(plotattributes[:colorbar]) plotattributes[:colorbar] = convertLegendValue(plotattributes[:colorbar])
@ -1347,9 +1275,9 @@ end
# when a value can be `:match`, this is the key that should be used instead for value retrieval # when a value can be `:match`, this is the key that should be used instead for value retrieval
const _match_map = KW( const _match_map = KW(
:background_color_outside => :background_color, :background_color_outside => :background_color,
:background_color_legend => :background_color_subplot, :legend_background_color => :background_color_subplot,
:background_color_inside => :background_color_subplot, :background_color_inside => :background_color_subplot,
:foreground_color_legend => :foreground_color_subplot, :legend_foreground_color => :foreground_color_subplot,
:foreground_color_title => :foreground_color_subplot, :foreground_color_title => :foreground_color_subplot,
:left_margin => :margin, :left_margin => :margin,
:top_margin => :margin, :top_margin => :margin,
@ -1498,10 +1426,10 @@ function _update_subplot_periphery(sp::Subplot, anns::AVec)
sp.attr[:annotations] = newanns sp.attr[:annotations] = newanns
# handle legend/colorbar # handle legend/colorbar
sp.attr[:legend] = convertLegendValue(sp.attr[:legend]) sp.attr[:legend_position] = convertLegendValue(sp.attr[:legend_position])
sp.attr[:colorbar] = convertLegendValue(sp.attr[:colorbar]) sp.attr[:colorbar] = convertLegendValue(sp.attr[:colorbar])
if sp.attr[:colorbar] == :legend if sp.attr[:colorbar] == :legend
sp.attr[:colorbar] = sp.attr[:legend] sp.attr[:colorbar] = sp.attr[:legend_position]
end end
return return
end end
@ -1510,12 +1438,12 @@ function _update_subplot_colors(sp::Subplot)
# background colors # background colors
color_or_nothing!(sp.attr, :background_color_subplot) color_or_nothing!(sp.attr, :background_color_subplot)
sp.attr[:color_palette] = get_color_palette(sp.attr[:color_palette], 30) sp.attr[:color_palette] = get_color_palette(sp.attr[:color_palette], 30)
color_or_nothing!(sp.attr, :background_color_legend) color_or_nothing!(sp.attr, :legend_background_color)
color_or_nothing!(sp.attr, :background_color_inside) color_or_nothing!(sp.attr, :background_color_inside)
# foreground colors # foreground colors
color_or_nothing!(sp.attr, :foreground_color_subplot) color_or_nothing!(sp.attr, :foreground_color_subplot)
color_or_nothing!(sp.attr, :foreground_color_legend) color_or_nothing!(sp.attr, :legend_foreground_color)
color_or_nothing!(sp.attr, :foreground_color_title) color_or_nothing!(sp.attr, :foreground_color_title)
return return
end end
@ -1772,13 +1700,12 @@ macro add_attributes( level, expr )
T = T.args[1] T = T.args[1]
end end
key_args = Any[] key_dict = KW()
value_args = Any[]
_splitdef!(expr.args[3], value_args, key_args) _splitdef!(expr.args[3], key_dict)
insert_block = Expr(:block) insert_block = Expr(:block)
for (key, value) in zip(key_args, value_args) for (key, value) in key_dict
# e.g. _series_defualts[key] = value # e.g. _series_defualts[key] = value
exp_key = Symbol(lowercase(string(T)), "_", key) exp_key = Symbol(lowercase(string(T)), "_", key)
pl_key = makeplural(exp_key) pl_key = makeplural(exp_key)
@ -1801,7 +1728,7 @@ macro add_attributes( level, expr )
end |> esc end |> esc
end end
function _splitdef!(blk, value_args, key_args) function _splitdef!(blk, key_dict)
for i in eachindex(blk.args) for i in eachindex(blk.args)
ei = blk.args[i] ei = blk.args[i]
if ei isa Symbol if ei isa Symbol
@ -1816,20 +1743,24 @@ function _splitdef!(blk, value_args, key_args)
elseif lhs isa Expr && lhs.head === :(::) && lhs.args[1] isa Symbol elseif lhs isa Expr && lhs.head === :(::) && lhs.args[1] isa Symbol
# var::T = defexpr # var::T = defexpr
var = lhs.args[1] var = lhs.args[1]
type = lhs.args[2]
if @isdefined type
for field in fieldnames(getproperty(Plots, type))
key_dict[Symbol(var, "_", field)] = :(getfield($(ei.args[2]), $(QuoteNode(field))))
end
end
else else
# something else, e.g. inline inner constructor # something else, e.g. inline inner constructor
# F(...) = ... # F(...) = ...
continue continue
end end
defexpr = ei.args[2] # defexpr defexpr = ei.args[2] # defexpr
push!(value_args, defexpr) key_dict[var] = defexpr
push!(key_args, var)
blk.args[i] = lhs blk.args[i] = lhs
elseif ei.head === :(::) && ei.args[1] isa Symbol elseif ei.head === :(::) && ei.args[1] isa Symbol
# var::Typ # var::Typ
var = ei.args[1] var = ei.args[1]
push!(value_args, var) key_dict[var] = defexpr
push!(key_args, var)
elseif ei.head === :block elseif ei.head === :block
# can arise with use of @static inside type decl # can arise with use of @static inside type decl
_kwdef!(ei, value_args, key_args) _kwdef!(ei, value_args, key_args)

View File

@ -303,8 +303,8 @@ _initialize_backend(pkg::GRBackend) = nothing
const _gr_attr = merge_with_base_supported([ const _gr_attr = merge_with_base_supported([
:annotations, :annotations,
:background_color_legend, :background_color_inside, :background_color_outside, :legend_background_color, :background_color_inside, :background_color_outside,
:foreground_color_legend, :foreground_color_grid, :foreground_color_axis, :legend_foreground_color, :foreground_color_grid, :foreground_color_axis,
:foreground_color_text, :foreground_color_border, :foreground_color_text, :foreground_color_border,
:label, :label,
:seriescolor, :seriesalpha, :seriescolor, :seriesalpha,
@ -318,14 +318,14 @@ const _gr_attr = merge_with_base_supported([
:guide, :lims, :ticks, :scale, :flip, :guide, :lims, :ticks, :scale, :flip,
:titlefontfamily, :titlefontsize, :titlefonthalign, :titlefontvalign, :titlefontfamily, :titlefontsize, :titlefonthalign, :titlefontvalign,
:titlefontrotation, :titlefontcolor, :titlefontrotation, :titlefontcolor,
:legendfontfamily, :legendfontsize, :legendfonthalign, :legendfontvalign, :legend_font_family, :legend_font_pointsize, :legend_font_halign, :legend_font_valign,
:legendfontrotation, :legendfontcolor, :legend_font_rotation, :legend_font_color,
:tickfontfamily, :tickfontsize, :tickfonthalign, :tickfontvalign, :tickfontfamily, :tickfontsize, :tickfonthalign, :tickfontvalign,
:tickfontrotation, :tickfontcolor, :tickfontrotation, :tickfontcolor,
:guidefontfamily, :guidefontsize, :guidefonthalign, :guidefontvalign, :guidefontfamily, :guidefontsize, :guidefonthalign, :guidefontvalign,
:guidefontrotation, :guidefontcolor, :guidefontrotation, :guidefontcolor,
:grid, :gridalpha, :gridstyle, :gridlinewidth, :grid, :gridalpha, :gridstyle, :gridlinewidth,
:legend, :legendtitle, :colorbar, :colorbar_title, :colorbar_entry, :legend, :legend_title, :colorbar, :colorbar_title, :colorbar_entry,
:fill_z, :line_z, :marker_z, :levels, :fill_z, :line_z, :marker_z, :levels,
:ribbon, :quiver, :ribbon, :quiver,
:orientation, :orientation,
@ -375,8 +375,8 @@ end
const _plotly_attr = merge_with_base_supported([ const _plotly_attr = merge_with_base_supported([
:annotations, :annotations,
:background_color_legend, :background_color_inside, :background_color_outside, :legend_background_color, :background_color_inside, :background_color_outside,
:foreground_color_legend, :foreground_color_guide, :legend_foreground_color, :foreground_color_guide,
:foreground_color_grid, :foreground_color_axis, :foreground_color_grid, :foreground_color_axis,
:foreground_color_text, :foreground_color_border, :foreground_color_text, :foreground_color_border,
:foreground_color_title, :foreground_color_title,
@ -390,7 +390,7 @@ const _plotly_attr = merge_with_base_supported([
:title, :titlelocation, :title, :titlelocation,
:titlefontfamily, :titlefontsize, :titlefonthalign, :titlefontvalign, :titlefontfamily, :titlefontsize, :titlefonthalign, :titlefontvalign,
:titlefontcolor, :titlefontcolor,
:legendfontfamily, :legendfontsize, :legendfontcolor, :legend_font_family, :legend_font_pointsize, :legend_font_color,
:tickfontfamily, :tickfontsize, :tickfontcolor, :tickfontfamily, :tickfontsize, :tickfontcolor,
:guidefontfamily, :guidefontsize, :guidefontcolor, :guidefontfamily, :guidefontsize, :guidefontcolor,
:window_title, :window_title,
@ -444,10 +444,10 @@ defaultOutputFormat(plt::Plot{Plots.PlotlyBackend}) = "html"
const _pgfplots_attr = merge_with_base_supported([ const _pgfplots_attr = merge_with_base_supported([
:annotations, :annotations,
:background_color_legend, :legend_background_color,
:background_color_inside, :background_color_inside,
# :background_color_outside, # :background_color_outside,
# :foreground_color_legend, # :legend_foreground_color,
:foreground_color_grid, :foreground_color_axis, :foreground_color_grid, :foreground_color_axis,
:foreground_color_text, :foreground_color_border, :foreground_color_text, :foreground_color_border,
:label, :label,
@ -513,8 +513,8 @@ end
const _pyplot_attr = merge_with_base_supported([ const _pyplot_attr = merge_with_base_supported([
:annotations, :annotations,
:background_color_legend, :background_color_inside, :background_color_outside, :legend_background_color, :background_color_inside, :background_color_outside,
:foreground_color_grid, :foreground_color_legend, :foreground_color_title, :foreground_color_grid, :legend_foreground_color, :foreground_color_title,
:foreground_color_axis, :foreground_color_border, :foreground_color_guide, :foreground_color_text, :foreground_color_axis, :foreground_color_border, :foreground_color_guide, :foreground_color_text,
:label, :label,
:linecolor, :linestyle, :linewidth, :linealpha, :linecolor, :linestyle, :linewidth, :linealpha,
@ -526,11 +526,11 @@ const _pyplot_attr = merge_with_base_supported([
:window_title, :window_title,
:guide, :guide_position, :lims, :ticks, :scale, :flip, :rotation, :guide, :guide_position, :lims, :ticks, :scale, :flip, :rotation,
:titlefontfamily, :titlefontsize, :titlefontcolor, :titlefontfamily, :titlefontsize, :titlefontcolor,
:legendfontfamily, :legendfontsize, :legendfontcolor, :legend_font_family, :legend_font_pointsize, :legend_font_color,
:tickfontfamily, :tickfontsize, :tickfontcolor, :tickfontfamily, :tickfontsize, :tickfontcolor,
:guidefontfamily, :guidefontsize, :guidefontcolor, :guidefontfamily, :guidefontsize, :guidefontcolor,
:grid, :gridalpha, :gridstyle, :gridlinewidth, :grid, :gridalpha, :gridstyle, :gridlinewidth,
:legend, :legendtitle, :colorbar, :colorbar_title, :colorbar_entry, :legend, :legend_title, :colorbar, :colorbar_title, :colorbar_entry,
:colorbar_ticks, :colorbar_tickfontfamily, :colorbar_tickfontsize, :colorbar_ticks, :colorbar_tickfontfamily, :colorbar_tickfontsize,
:colorbar_tickfonthalign, :colorbar_tickfontvalign, :colorbar_tickfonthalign, :colorbar_tickfontvalign,
:colorbar_tickfontrotation, :colorbar_tickfontcolor, :colorbar_tickfontrotation, :colorbar_tickfontcolor,
@ -607,8 +607,8 @@ const _canvas_type = Ref(:auto)
const _hdf5_attr = merge_with_base_supported([ const _hdf5_attr = merge_with_base_supported([
:annotations, :annotations,
:background_color_legend, :background_color_inside, :background_color_outside, :legend_background_color, :background_color_inside, :background_color_outside,
:foreground_color_grid, :foreground_color_legend, :foreground_color_title, :foreground_color_grid, :legend_foreground_color, :foreground_color_title,
:foreground_color_axis, :foreground_color_border, :foreground_color_guide, :foreground_color_text, :foreground_color_axis, :foreground_color_border, :foreground_color_guide, :foreground_color_text,
:label, :label,
:linecolor, :linestyle, :linewidth, :linealpha, :linecolor, :linestyle, :linewidth, :linealpha,
@ -673,9 +673,9 @@ const HDF5PLOT_PLOTREF = HDF5Plot_PlotRef(nothing)
const _inspectdr_attr = merge_with_base_supported([ const _inspectdr_attr = merge_with_base_supported([
:annotations, :annotations,
:background_color_legend, :background_color_inside, :background_color_outside, :legend_background_color, :background_color_inside, :background_color_outside,
# :foreground_color_grid, # :foreground_color_grid,
:foreground_color_legend, :foreground_color_title, :legend_foreground_color, :foreground_color_title,
:foreground_color_axis, :foreground_color_border, :foreground_color_guide, :foreground_color_text, :foreground_color_axis, :foreground_color_border, :foreground_color_guide, :foreground_color_text,
:label, :label,
:seriescolor, :seriesalpha, :seriescolor, :seriesalpha,
@ -689,7 +689,7 @@ const _inspectdr_attr = merge_with_base_supported([
:window_title, :window_title,
:guide, :lims, :scale, #:ticks, :flip, :rotation, :guide, :lims, :scale, #:ticks, :flip, :rotation,
:titlefontfamily, :titlefontsize, :titlefontcolor, :titlefontfamily, :titlefontsize, :titlefontcolor,
:legendfontfamily, :legendfontsize, :legendfontcolor, :legend_font_family, :legend_font_pointsize, :legend_font_color,
:tickfontfamily, :tickfontsize, :tickfontcolor, :tickfontfamily, :tickfontsize, :tickfontcolor,
:guidefontfamily, :guidefontsize, :guidefontcolor, :guidefontfamily, :guidefontsize, :guidefontcolor,
:grid, :legend, #:colorbar, :grid, :legend, #:colorbar,
@ -728,10 +728,10 @@ const _inspectdr_scale = [:identity, :ln, :log2, :log10]
const _pgfplotsx_attr = merge_with_base_supported([ const _pgfplotsx_attr = merge_with_base_supported([
:annotations, :annotations,
:background_color_legend, :legend_background_color,
:background_color_inside, :background_color_inside,
:background_color_outside, :background_color_outside,
:foreground_color_legend, :legend_foreground_color,
:foreground_color_grid, :foreground_color_grid,
:foreground_color_axis, :foreground_color_axis,
:foreground_color_text, :foreground_color_text,
@ -768,12 +768,12 @@ const _pgfplotsx_attr = merge_with_base_supported([
:titlefontvalign, :titlefontvalign,
:titlefontrotation, :titlefontrotation,
:titlefontcolor, :titlefontcolor,
:legendfontfamily, :legend_font_family,
:legendfontsize, :legend_font_pointsize,
:legendfonthalign, :legend_font_halign,
:legendfontvalign, :legend_font_valign,
:legendfontrotation, :legend_font_rotation,
:legendfontcolor, :legend_font_color,
:tickfontfamily, :tickfontfamily,
:tickfontsize, :tickfontsize,
:tickfonthalign, :tickfonthalign,
@ -791,7 +791,7 @@ const _pgfplotsx_attr = merge_with_base_supported([
:gridstyle, :gridstyle,
:gridlinewidth, :gridlinewidth,
:legend, :legend,
:legendtitle, :legend_title,
:colorbar, :colorbar,
:colorbar_title, :colorbar_title,
:colorbar_entry, :colorbar_entry,

View File

@ -217,7 +217,7 @@ function pgf_series(sp::Subplot, series::Series)
end end
# add to legend? # add to legend?
if i == 1 && sp[:legend] != :none && should_add_to_legend(series) if i == 1 && sp[:legend_position] != :none && should_add_to_legend(series)
if plotattributes[:fillrange] !== nothing if plotattributes[:fillrange] !== nothing
push!(style, "forget plot") push!(style, "forget plot")
push!(series_collection, pgf_fill_legend_hack(plotattributes, args)) push!(series_collection, pgf_fill_legend_hack(plotattributes, args))
@ -474,20 +474,20 @@ function _update_plot_object(plt::Plot{PGFPlotsBackend})
kw[:axisEqual] = "true" kw[:axisEqual] = "true"
end end
legpos = sp[:legend] legpos = sp[:legend_position]
if haskey(_pgfplots_legend_pos, legpos) if haskey(_pgfplots_legend_pos, legpos)
kw[:legendPos] = _pgfplots_legend_pos[legpos] kw[:legendPos] = _pgfplots_legend_pos[legpos]
end end
cstr, bg_alpha = pgf_color(plot_color(sp[:background_color_legend])) cstr, bg_alpha = pgf_color(plot_color(sp[:legend_background_color]))
fg_alpha = alpha(plot_color(sp[:foreground_color_legend])) fg_alpha = alpha(plot_color(sp[:legend_foreground_color]))
push!(style, string( push!(style, string(
"legend style = {", "legend style = {",
pgf_linestyle(pgf_thickness_scaling(sp), sp[:foreground_color_legend], fg_alpha, "solid", ), ",", pgf_linestyle(pgf_thickness_scaling(sp), sp[:legend_foreground_color], fg_alpha, "solid", ), ",",
"fill = $cstr,", "fill = $cstr,",
"fill opacity = $bg_alpha,", "fill opacity = $bg_alpha,",
"text opacity = $(alpha(plot_color(sp[:legendfontcolor]))),", "text opacity = $(alpha(plot_color(sp[:legend_font_color]))),",
"font = ", pgf_font(sp[:legendfontsize], pgf_thickness_scaling(sp)), "font = ", pgf_font(sp[:legend_font_pointsize], pgf_thickness_scaling(sp)),
"}", "}",
)) ))

View File

@ -979,7 +979,7 @@ end
## Legend ## Legend
function gr_add_legend(sp, leg, viewport_plotarea) function gr_add_legend(sp, leg, viewport_plotarea)
if !(sp[:legend] in(:none, :inline)) if !(sp[:legend_position] in(:none, :inline))
GR.savestate() GR.savestate()
GR.selntran(0) GR.selntran(0)
GR.setscale(0) GR.setscale(0)
@ -987,21 +987,21 @@ function gr_add_legend(sp, leg, viewport_plotarea)
if leg.w > 0 if leg.w > 0
xpos, ypos = gr_legend_pos(sp, leg, viewport_plotarea) xpos, ypos = gr_legend_pos(sp, leg, viewport_plotarea)
GR.setfillintstyle(GR.INTSTYLE_SOLID) GR.setfillintstyle(GR.INTSTYLE_SOLID)
gr_set_fillcolor(sp[:background_color_legend]) gr_set_fillcolor(sp[:legend_background_color])
GR.fillrect( GR.fillrect(
xpos - leg.leftw, xpos + leg.textw + leg.rightw, xpos - leg.leftw, xpos + leg.textw + leg.rightw,
ypos + leg.dy, ypos - leg.h ypos + leg.dy, ypos - leg.h
) # Allocating white space for actual legend width here ) # Allocating white space for actual legend width here
gr_set_line(1, :solid, sp[:foreground_color_legend], sp) gr_set_line(1, :solid, sp[:legend_foreground_color], sp)
GR.drawrect( GR.drawrect(
xpos - leg.leftw, xpos + leg.textw + leg.rightw, xpos - leg.leftw, xpos + leg.textw + leg.rightw,
ypos + leg.dy, ypos - leg.h ypos + leg.dy, ypos - leg.h
) # Drawing actual legend width here ) # Drawing actual legend width here
i = 0 i = 0
if sp[:legendtitle] !== nothing if sp[:legend_title] !== nothing
GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_HALF) GR.settextalign(GR.TEXT_HALIGN_CENTER, GR.TEXT_VALIGN_HALF)
gr_set_font(legendtitlefont(sp), sp) gr_set_font(legendtitlefont(sp), sp)
gr_text(xpos - 0.03 + 0.5 * leg.w, ypos, string(sp[:legendtitle])) gr_text(xpos - 0.03 + 0.5 * leg.w, ypos, string(sp[:legend_title]))
ypos -= leg.dy ypos -= leg.dy
gr_set_font(legendfont(sp), sp) gr_set_font(legendfont(sp), sp)
end end
@ -1010,7 +1010,7 @@ function gr_add_legend(sp, leg, viewport_plotarea)
should_add_to_legend(series) || continue should_add_to_legend(series) || continue
st = series[:seriestype] st = series[:seriestype]
lc = get_linecolor(series, clims) lc = get_linecolor(series, clims)
gr_set_line(sp[:legendfontsize] / 8, get_linestyle(series), lc, sp) gr_set_line(sp[:legend_font_pointsize] / 8, get_linestyle(series), lc, sp)
if (st == :shape || series[:fillrange] !== nothing) && series[:ribbon] === nothing if (st == :shape || series[:fillrange] !== nothing) && series[:ribbon] === nothing
fc = get_fillcolor(series, clims) fc = get_fillcolor(series, clims)
@ -1046,16 +1046,16 @@ function gr_add_legend(sp, leg, viewport_plotarea)
ms = first(series[:markersize]) ms = first(series[:markersize])
msw = first(series[:markerstrokewidth]) msw = first(series[:markerstrokewidth])
s, sw = if ms > 0 s, sw = if ms > 0
0.8 * sp[:legendfontsize], 0.8 * sp[:legendfontsize] * msw / ms 0.8 * sp[:legend_font_pointsize], 0.8 * sp[:legend_font_pointsize] * msw / ms
else else
0, 0.8 * sp[:legendfontsize] * msw / 8 0, 0.8 * sp[:legend_font_pointsize] * msw / 8
end end
gr_draw_markers(series, xpos - leg.width_factor * 2, ypos, clims, s, sw) gr_draw_markers(series, xpos - leg.width_factor * 2, ypos, clims, s, sw)
end end
lab = series[:label] lab = series[:label]
GR.settextalign(GR.TEXT_HALIGN_LEFT, GR.TEXT_VALIGN_HALF) GR.settextalign(GR.TEXT_HALIGN_LEFT, GR.TEXT_VALIGN_HALF)
gr_set_textcolor(plot_color(sp[:legendfontcolor])) gr_set_textcolor(plot_color(sp[:legend_font_color]))
gr_text(xpos, ypos, string(lab)) gr_text(xpos, ypos, string(lab))
ypos -= leg.dy ypos -= leg.dy
end end
@ -1066,7 +1066,7 @@ function gr_add_legend(sp, leg, viewport_plotarea)
end end
function gr_legend_pos(sp::Subplot, leg, viewport_plotarea) function gr_legend_pos(sp::Subplot, leg, viewport_plotarea)
s = sp[:legend] s = sp[:legend_position]
s isa Real && return gr_legend_pos(s, leg, viewport_plotarea) s isa Real && return gr_legend_pos(s, leg, viewport_plotarea)
if s isa Tuple{<:Real,Symbol} if s isa Tuple{<:Real,Symbol}
if s[2] !== :outer if s[2] !== :outer
@ -1159,13 +1159,13 @@ end
function gr_get_legend_geometry(viewport_plotarea, sp) function gr_get_legend_geometry(viewport_plotarea, sp)
legendn = 0 legendn = 0
legendw = 0 legendw = 0
if sp[:legend] != :none if sp[:legend_position] != :none
GR.savestate() GR.savestate()
GR.selntran(0) GR.selntran(0)
GR.setscale(0) GR.setscale(0)
if sp[:legendtitle] !== nothing if sp[:legend_title] !== nothing
gr_set_font(legendtitlefont(sp), sp) gr_set_font(legendtitlefont(sp), sp)
tbx, tby = gr_inqtext(0, 0, string(sp[:legendtitle])) tbx, tby = gr_inqtext(0, 0, string(sp[:legend_title]))
legendw = tbx[3] - tbx[1] legendw = tbx[3] - tbx[1]
legendn += 1 legendn += 1
end end
@ -1192,7 +1192,7 @@ function gr_get_legend_geometry(viewport_plotarea, sp)
x_legend_offset = (viewport_plotarea[2] - viewport_plotarea[1]) / 30 x_legend_offset = (viewport_plotarea[2] - viewport_plotarea[1]) / 30
y_legend_offset = (viewport_plotarea[4] - viewport_plotarea[3]) / 30 y_legend_offset = (viewport_plotarea[4] - viewport_plotarea[3]) / 30
dy = gr_point_mult(sp) * sp[:legendfontsize] * 1.75 dy = gr_point_mult(sp) * sp[:legend_font_pointsize] * 1.75
legendh = dy * legendn legendh = dy * legendn
return ( return (
@ -1212,7 +1212,7 @@ end
## Viewport, window and scale ## Viewport, window and scale
function gr_update_viewport_legend!(viewport_plotarea, sp, leg) function gr_update_viewport_legend!(viewport_plotarea, sp, leg)
s = sp[:legend] leg_str = string(sp[:legend_position])
xaxis, yaxis = sp[:xaxis], sp[:yaxis] xaxis, yaxis = sp[:xaxis], sp[:yaxis]
xmirror = xaxis[:guide_position] == :top || (xaxis[:guide_position] == :auto && xaxis[:mirror] == true) xmirror = xaxis[:guide_position] == :top || (xaxis[:guide_position] == :auto && xaxis[:mirror] == true)
@ -1245,7 +1245,7 @@ function gr_update_viewport_legend!(viewport_plotarea, sp, leg)
viewport_plotarea[3] += leg.h + leg.dy + leg.yoffset + !xmirror * gr_axis_height(sp, sp[:xaxis]) viewport_plotarea[3] += leg.h + leg.dy + leg.yoffset + !xmirror * gr_axis_height(sp, sp[:xaxis])
end end
end end
if s === :inline if sp[:legend_position] == :inline
if sp[:yaxis][:mirror] if sp[:yaxis][:mirror]
viewport_plotarea[1] += leg.w viewport_plotarea[1] += leg.w
else else
@ -1652,7 +1652,7 @@ function gr_add_series(sp, series)
elseif st in (:surface, :wireframe) elseif st in (:surface, :wireframe)
gr_draw_surface(series, x, y, z, clims) gr_draw_surface(series, x, y, z, clims)
elseif st === :volume elseif st === :volume
sp[:legend] = :none sp[:legend_position] = :none
GR.gr3.clear() GR.gr3.clear()
dmin, dmax = GR.gr3.volume(y.v, 0) dmin, dmax = GR.gr3.volume(y.v, 0)
elseif st === :heatmap elseif st === :heatmap
@ -1670,9 +1670,9 @@ function gr_add_series(sp, series)
gr_text(GR.wctondc(xi, yi)..., str) gr_text(GR.wctondc(xi, yi)..., str)
end end
if sp[:legend] == :inline && should_add_to_legend(series) if sp[:legend_position] == :inline && should_add_to_legend(series)
gr_set_font(legendfont(sp), sp) gr_set_font(legendfont(sp), sp)
gr_set_textcolor(plot_color(sp[:legendfontcolor])) gr_set_textcolor(plot_color(sp[:legend_font_color]))
if sp[:yaxis][:mirror] if sp[:yaxis][:mirror]
(_,i) = sp[:xaxis][:flip] ? findmax(x) : findmin(x) (_,i) = sp[:xaxis][:flip] ? findmax(x) : findmin(x)
GR.settextalign(GR.TEXT_HALIGN_RIGHT, GR.TEXT_VALIGN_HALF) GR.settextalign(GR.TEXT_HALIGN_RIGHT, GR.TEXT_VALIGN_HALF)

View File

@ -383,14 +383,13 @@ function _inspectdr_setupsubplot(sp::Subplot{InspectDRBackend})
_inspectdr_mapptsize(xaxis[:tickfontsize]), _inspectdr_mapptsize(xaxis[:tickfontsize]),
color = _inspectdr_mapcolor(xaxis[:tickfontcolor]) color = _inspectdr_mapcolor(xaxis[:tickfontcolor])
) )
l.enable_legend = (sp[:legend] != :none) l[:enable_legend] = (sp[:legend_position] != :none)
#l.halloc_legend = 150 #TODO: compute??? #l[:halloc_legend] = 150 #TODO: compute???
l.font_legend = InspectDR.Font(sp[:legendfontfamily], l[:font_legend] = InspectDR.Font(sp[:legend_font_family],
_inspectdr_mapptsize(sp[:legendfontsize]), _inspectdr_mapptsize(sp[:legend_font_pointsize]),
color = _inspectdr_mapcolor(sp[:legendfontcolor]) color = _inspectdr_mapcolor(sp[:legend_font_color])
) )
l.frame_legend.fillcolor = _inspectdr_mapcolor(sp[:background_color_legend]) l[:frame_legend].fillcolor = _inspectdr_mapcolor(sp[:legend_background_color])
#_round!() ensures values use integer spacings (looks better on screen): #_round!() ensures values use integer spacings (looks better on screen):
InspectDR._round!(InspectDR.autofit2font!(l, legend_width=10.0)) #10 "em"s wide InspectDR._round!(InspectDR.autofit2font!(l, legend_width=10.0)) #10 "em"s wide
return return

View File

@ -141,7 +141,7 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend})
"point meta max" => get_clims(sp)[2], "point meta max" => get_clims(sp)[2],
"point meta min" => get_clims(sp)[1], "point meta min" => get_clims(sp)[1],
"legend cell align" => "left", "legend cell align" => "left",
"legend columns" => pgfx_legend_col(sp[:legend]), "legend columns" => pgfx_legend_col(sp[:legend_position]),
"title" => sp[:title], "title" => sp[:title],
"title style" => PGFPlotsX.Options( "title style" => PGFPlotsX.Options(
pgfx_get_title_pos(title_loc)..., pgfx_get_title_pos(title_loc)...,
@ -168,7 +168,8 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend})
sp_height > 0 * mm ? push!(axis_opt, "height" => string(axis_height)) : sp_height > 0 * mm ? push!(axis_opt, "height" => string(axis_height)) :
nothing nothing
for letter in (:x, :y, :z) for letter in (:x, :y, :z)
if letter != :z || RecipesPipeline.is3d(sp) if letter != :z ||
RecipesPipeline.is3d(sp)
pgfx_axis!(axis_opt, sp, letter) pgfx_axis!(axis_opt, sp, letter)
end end
end end
@ -250,12 +251,12 @@ function (pgfx_plot::PGFPlotsXPlot)(plt::Plot{PGFPlotsXBackend})
extra_sp = wraptuple(extra_sp) extra_sp = wraptuple(extra_sp)
push!(axis, extra_sp...) push!(axis, extra_sp...)
end end
if sp[:legendtitle] !== nothing if sp[:legend_title] !== nothing
push!(axis, PGFPlotsX.Options("\\addlegendimage{empty legend}" => nothing)) push!(axis, PGFPlotsX.Options("\\addlegendimage{empty legend}" => nothing))
push!( push!(
axis, axis,
PGFPlotsX.LegendEntry( PGFPlotsX.LegendEntry(
string("\\hspace{-.6cm}{\\textbf{", sp[:legendtitle], "}}"), string("\\hspace{-.6cm}{\\textbf{", sp[:legend_title], "}}"),
false, false,
), ),
) )
@ -387,8 +388,8 @@ function pgfx_add_series!(::Val{:path}, axis, series_opt, series, series_func, o
) )
end end
end end
if k == 1 && if i == 1 &&
series[:subplot][:legend] != :none && pgfx_should_add_to_legend(series) series[:subplot][:legend_position] != :none && pgfx_should_add_to_legend(series)
pgfx_filllegend!(series_opt, opt) pgfx_filllegend!(series_opt, opt)
end end
end end
@ -639,7 +640,7 @@ function pgfx_add_series!(::Val{:xsticks}, axis, series_opt, series, series_func
end end
function pgfx_add_legend!(axis, series, opt, i = 1) function pgfx_add_legend!(axis, series, opt, i = 1)
if series[:subplot][:legend] != :none if series[:subplot][:legend_position] != :none
leg_entry = if opt[:label] isa AVec leg_entry = if opt[:label] isa AVec
get(opt[:label], i, "") get(opt[:label], i, "")
elseif opt[:label] isa AbstractString elseif opt[:label] isa AbstractString
@ -1402,7 +1403,7 @@ end
# Set the (left, top, right, bottom) minimum padding around the plot area # Set the (left, top, right, bottom) minimum padding around the plot area
# to fit ticks, tick labels, guides, colorbars, etc. # to fit ticks, tick labels, guides, colorbars, etc.
function _update_min_padding!(sp::Subplot{PGFPlotsXBackend}) function _update_min_padding!(sp::Subplot{PGFPlotsXBackend})
leg = sp[:legend] leg = sp[:legend_position]
if leg in (:best, :outertopright, :outerright, :outerbottomright) || (leg isa Tuple && leg[1] >= 1) if leg in (:best, :outertopright, :outerright, :outerbottomright) || (leg isa Tuple && leg[1] >= 1)
sp.minpad = (0mm, 0mm, 5mm, 0mm) sp.minpad = (0mm, 0mm, 5mm, 0mm)
else else

View File

@ -327,12 +327,12 @@ end
function plotly_add_legend!(plotattributes_out::KW, sp::Subplot) function plotly_add_legend!(plotattributes_out::KW, sp::Subplot)
plotattributes_out[:showlegend] = sp[:legend] != :none plotattributes_out[:showlegend] = sp[:legend_position] != :none
legend_position = plotly_legend_pos(sp[:legend]) legend_position = plotly_legend_pos(sp[:legend_position])
if sp[:legend] != :none if sp[:legend_position] != :none
plotattributes_out[:legend] = KW( plotattributes_out[:legend_position] = KW(
:bgcolor => rgba_string(sp[:background_color_legend]), :bgcolor => rgba_string(sp[:legend_background_color]),
:bordercolor => rgba_string(sp[:foreground_color_legend]), :bordercolor => rgba_string(sp[:legend_foreground_color]),
:borderwidth => 1, :borderwidth => 1,
:traceorder => "normal", :traceorder => "normal",
:xanchor => legend_position.xanchor, :xanchor => legend_position.xanchor,
@ -342,7 +342,7 @@ function plotly_add_legend!(plotattributes_out::KW, sp::Subplot)
:x => legend_position.coords[1], :x => legend_position.coords[1],
:y => legend_position.coords[2], :y => legend_position.coords[2],
:title => KW( :title => KW(
:text => sp[:legendtitle] === nothing ? "" : string(sp[:legendtitle]), :text => sp[:legend_title] === nothing ? "" : string(sp[:legend_title]),
:font => plotly_font(legendtitlefont(sp)), :font => plotly_font(legendtitlefont(sp)),
), ),
) )

View File

@ -1365,7 +1365,7 @@ end
py_legend_bbox(pos) = pos py_legend_bbox(pos) = pos
function py_add_legend(plt::Plot, sp::Subplot, ax) function py_add_legend(plt::Plot, sp::Subplot, ax)
leg = sp[:legend] leg = sp[:legend_position]
if leg != :none if leg != :none
# gotta do this to ensure both axes are included # gotta do this to ensure both axes are included
labels = [] labels = []
@ -1387,15 +1387,15 @@ function py_add_legend(plt::Plot, sp::Subplot, ax)
hasline = get_linewidth(series) > 0 hasline = get_linewidth(series) > 0
PyPlot.plt."Line2D"((0, 1),(0,0), PyPlot.plt."Line2D"((0, 1),(0,0),
color = py_color(single_color(get_linecolor(series, clims)), get_linealpha(series)), color = py_color(single_color(get_linecolor(series, clims)), get_linealpha(series)),
linewidth = py_thickness_scale(plt, hasline * sp[:legendfontsize] / 8), linewidth = py_thickness_scale(plt, hasline * sp[:legend_font_pointsize] / 8),
linestyle = py_linestyle(:path, get_linestyle(series)), linestyle = py_linestyle(:path, get_linestyle(series)),
solid_capstyle = "butt", solid_joinstyle = "miter", solid_capstyle = "butt", solid_joinstyle = "miter",
dash_capstyle = "butt", dash_joinstyle = "miter", dash_capstyle = "butt", dash_joinstyle = "miter",
marker = py_marker(_cycle(series[:markershape], 1)), marker = py_marker(_cycle(series[:markershape], 1)),
markersize = py_thickness_scale(plt, 0.8 * sp[:legendfontsize]), markersize = py_thickness_scale(plt, 0.8 * sp[:legend_font_pointsize]),
markeredgecolor = py_color(single_color(get_markerstrokecolor(series)), get_markerstrokealpha(series)), markeredgecolor = py_color(single_color(get_markerstrokecolor(series)), get_markerstrokealpha(series)),
markerfacecolor = py_color(single_color(get_markercolor(series, clims)), get_markeralpha(series)), markerfacecolor = py_color(single_color(get_markercolor(series, clims)), get_markeralpha(series)),
markeredgewidth = py_thickness_scale(plt, 0.8 * get_markerstrokewidth(series) * sp[:legendfontsize] / first(series[:markersize])) # retain the markersize/markerstroke ratio from the markers on the plot markeredgewidth = py_thickness_scale(plt, 0.8 * get_markerstrokewidth(series) * sp[:legend_font_pointsize] / first(series[:markersize])) # retain the markersize/markerstroke ratio from the markers on the plot
) )
else else
series[:serieshandle][1] series[:serieshandle][1]
@ -1413,23 +1413,23 @@ function py_add_legend(plt::Plot, sp::Subplot, ax)
loc = py_legend_pos(leg), loc = py_legend_pos(leg),
bbox_to_anchor = py_legend_bbox(leg), bbox_to_anchor = py_legend_bbox(leg),
scatterpoints = 1, scatterpoints = 1,
fontsize = py_thickness_scale(plt, sp[:legendfontsize]), fontsize = py_thickness_scale(plt, sp[:legend_font_pointsize]),
facecolor = py_color(sp[:background_color_legend]), facecolor = py_color(sp[:legend_background_color]),
edgecolor = py_color(sp[:foreground_color_legend]), edgecolor = py_color(sp[:legend_foreground_color]),
framealpha = alpha(plot_color(sp[:background_color_legend])), framealpha = alpha(plot_color(sp[:legend_background_color])),
fancybox = false, # makes the legend box square fancybox = false, # makes the legend box square
borderpad = 0.8 # to match GR legendbox borderpad = 0.8 # to match GR legendbox
) )
frame = leg."get_frame"() frame = leg."get_frame"()
frame."set_linewidth"(py_thickness_scale(plt, 1)) frame."set_linewidth"(py_thickness_scale(plt, 1))
leg."set_zorder"(1000) leg."set_zorder"(1000)
if sp[:legendtitle] !== nothing if sp[:legend_title] !== nothing
leg."set_title"(sp[:legendtitle]) leg."set_title"(sp[:legend_title])
PyPlot.plt."setp"(leg."get_title"(), color = py_color(sp[:legendtitlefontcolor]), family = sp[:legendtitlefontfamily], fontsize = py_thickness_scale(plt, sp[:legendtitlefontsize])) PyPlot.plt."setp"(leg."get_title"(), color = py_color(sp[:legend_title_font_color]), family = sp[:legend_title_font_family], fontsize = py_thickness_scale(plt, sp[:legend_title_font_pointsize]))
end end
for txt in leg."get_texts"() for txt in leg."get_texts"()
PyPlot.plt."setp"(txt, color = py_color(sp[:legendfontcolor]), family = sp[:legendfontfamily], fontsize = py_thickness_scale(plt, sp[:legendfontsize])) PyPlot.plt."setp"(txt, color = py_color(sp[:legend_font_color]), family = sp[:legend_font_family], fontsize = py_thickness_scale(plt, sp[:legend_font_pointsize]))
end end
end end
end end

View File

@ -80,7 +80,7 @@ function rebuildUnicodePlot!(plt::Plot, width, height)
# now use the ! functions to add to the plot # now use the ! functions to add to the plot
for series in series_list(sp) for series in series_list(sp)
addUnicodeSeries!(o, series.plotattributes, sp[:legend] != :none, xlim, ylim) addUnicodeSeries!(o, series.plotattributes, sp[:legend_position] != :none, xlim, ylim)
end end
# save the object # save the object

View File

@ -327,7 +327,7 @@ end
Scales all **current** font sizes by `factor`. For example `scalefontsizes(1.1)` increases all current font sizes by 10%. To reset to initial sizes, use `scalefontsizes()` Scales all **current** font sizes by `factor`. For example `scalefontsizes(1.1)` increases all current font sizes by 10%. To reset to initial sizes, use `scalefontsizes()`
""" """
function scalefontsizes(factor::Number) function scalefontsizes(factor::Number)
for k in (:titlefontsize, :legendfontsize, :legendtitlefontsize) for k in (:titlefontsize, :legend_font_pointsize, :legend_title_font_pointsize)
scalefontsize(k, factor) scalefontsize(k, factor)
end end
@ -344,7 +344,7 @@ end
Resets font sizes to initial default values. Resets font sizes to initial default values.
""" """
function scalefontsizes() function scalefontsizes()
for k in (:titlefontsize, :legendfontsize, :legendtitlefontsize) for k in (:titlefontsize, :legend_font_pointsize, :legend_title_font_pointsize)
f = default(k) f = default(k)
if k in keys(_initial_fontsizes) if k in keys(_initial_fontsizes)
factor = f / _initial_fontsizes[k] factor = f / _initial_fontsizes[k]
@ -780,12 +780,13 @@ end
### Legend ### Legend
@add_annotations subplot struct Legend # TODO: what about :match for the fonts?
background_color @add_attributes subplot struct Legend
foreground_color background_color = :match
position foreground_color = :match
title position = :best
font::Font # TODO: check if macro is recursive enough title = nothing
title_font font::Font = font(8)
column title_font::Font = font(11)
column = 1
end end

51
src/consts.jl Normal file
View File

@ -0,0 +1,51 @@
const _all_defaults = KW[_series_defaults, _plot_defaults, _subplot_defaults]
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(
:titlefontsize => _subplot_defaults[:titlefontsize],
:legend_font_pointsize => _subplot_defaults[:legend_font_pointsize],
:legend_title_font_pointsize => _subplot_defaults[:legend_title_font_pointsize],
:tickfontsize => _axis_defaults[:tickfontsize],
:guidefontsize => _axis_defaults[:guidefontsize],
)
const _internal_args =
[:plot_object, :series_plotindex, :markershape_to_add, :letter, :idxfilter]
const _axis_args = sort(union(collect(keys(_axis_defaults))))
const _series_args = sort(union(collect(keys(_series_defaults))))
const _subplot_args = sort(union(collect(keys(_subplot_defaults))))
const _plot_args = sort(union(collect(keys(_plot_defaults))))
const _magic_axis_args = [:axis, :tickfont, :guidefont, :grid, :minorgrid]
const _magic_subplot_args = [
:titlefont,
:legendfont,
:legend_titlefont,
:plot_titlefont,
:colorbar_titlefont,
]
const _magic_series_args = [:line, :marker, :fill]
const _all_axis_args = sort(union([_axis_args; _magic_axis_args]))
const _all_subplot_args = sort(union([_subplot_args; _magic_subplot_args]))
const _all_series_args = sort(union([_series_args; _magic_series_args]))
const _all_plot_args = _plot_args
const _all_args = sort(union([
_all_axis_args
_all_subplot_args
_all_series_args
_all_plot_args
]))
# add all pluralized forms to the _keyAliases dict
for arg in _all_args
add_aliases(arg, makeplural(arg))
end
# add all non_underscored forms to the _keyAliases
add_non_underscore_aliases!(_keyAliases)

View File

@ -621,7 +621,7 @@ function with(f::Function, args...; kw...)
newdefs[:xticks] = nothing newdefs[:xticks] = nothing
newdefs[:yticks] = nothing newdefs[:yticks] = nothing
newdefs[:grid] = false newdefs[:grid] = false
newdefs[:legend] = false newdefs[:legend_position] = false
end end
# dict to store old and new keyword args for anything that changes # dict to store old and new keyword args for anything that changes
@ -967,21 +967,21 @@ titlefont(sp::Subplot) = font(
) )
legendfont(sp::Subplot) = font( legendfont(sp::Subplot) = font(
sp[:legendfontfamily], sp[:legend_font_family],
sp[:legendfontsize], sp[:legend_font_pointsize],
sp[:legendfontvalign], sp[:legend_font_valign],
sp[:legendfonthalign], sp[:legend_font_halign],
sp[:legendfontrotation], sp[:legend_font_rotation],
sp[:legendfontcolor], sp[:legend_font_color],
) )
legendtitlefont(sp::Subplot) = font( legendtitlefont(sp::Subplot) = font(
sp[:legendtitlefontfamily], sp[:legend_title_font_family],
sp[:legendtitlefontsize], sp[:legend_title_font_pointsize],
sp[:legendtitlefontvalign], sp[:legend_title_font_valign],
sp[:legendtitlefonthalign], sp[:legend_title_font_halign],
sp[:legendtitlefontrotation], sp[:legend_title_font_rotation],
sp[:legendtitlefontcolor], sp[:legend_title_font_color],
) )
tickfont(ax::Axis) = font( tickfont(ax::Axis) = font(

View File

@ -1,4 +1,4 @@
using Plots, Test using Plots, Test, Colors
const PLOTS_DEFAULTS = Dict(:theme => :wong2) const PLOTS_DEFAULTS = Dict(:theme => :wong2)
Plots.__init__() Plots.__init__()
@ -9,3 +9,64 @@ end
empty!(PLOTS_DEFAULTS) empty!(PLOTS_DEFAULTS)
Plots.__init__() Plots.__init__()
@testset "Legend defaults" begin
p = plot()
@test p[1][:legend_font_family] == "sans-serif"
@test p[1][:legend_font_pointsize] == 8
@test p[1][:legend_font_halign] == :hcenter
@test p[1][:legend_font_valign] == :vcenter
@test p[1][:legend_font_rotation] == 0.0
@test p[1][:legend_font_color] == RGB{Colors.N0f8}(0.0,0.0,0.0)
@test p[1][:legend_position] == :best
@test p[1][:legend_title] == nothing
@test p[1][:legend_title_font_family] == "sans-serif"
@test p[1][:legend_title_font_pointsize] == 11
@test p[1][:legend_title_font_halign] == :hcenter
@test p[1][:legend_title_font_valign] == :vcenter
@test p[1][:legend_title_font_rotation] == 0.0
@test p[1][:legend_title_font_color] == RGB{Colors.N0f8}(0.0,0.0,0.0)
@test p[1][:legend_background_color] == RGBA{Float64}(1.0,1.0,1.0,1.0)
@test p[1][:legend_foreground_color] == RGB{Colors.N0f8}(0.0,0.0,0.0)
end # testset
@testset "Legend API" begin
p = plot(;
legendfontfamily = "serif",
legendfontsize = 12,
legendfonthalign = :left,
legendfontvalign = :top,
legendfontrotation = 1,
legendfontcolor = :red,
legend = :outertopleft,
legendtitle = "The legend",
legendtitlefontfamily = "helvetica",
legendtitlefontsize = 3,
legendtitlefonthalign = :right,
legendtitlefontvalign = :bottom,
legendtitlefontrotation = -5.2,
legendtitlefontcolor = :blue,
background_color_legend = :cyan,
foreground_color_legend = :green,
)
@test p[1][:legend_font_family] == "serif"
@test p[1][:legend_font_pointsize] == 12
@test p[1][:legend_font_halign] == :left
@test p[1][:legend_font_valign] == :top
@test p[1][:legend_font_rotation] == 1.0
@test_broken p[1][:legend_font_color] == RGB{Colors.N0f8}(1.0,0.0,0.0)
# FIXME: this doesn't get set
@test_broken p[1][:legend_position] == :outertopleft
# FIXME: this doesn't get set
@test_broken p[1][:legend_title] == "The legend"
@test p[1][:legend_title_font_family] == "helvetica"
# FIXME: this doesn't get set
@test_broken p[1][:legend_title_font_pointsize] == 3
@test p[1][:legend_title_font_halign] == :right
@test p[1][:legend_title_font_valign] == :bottom
@test p[1][:legend_title_font_rotation] == -5.2
# This currently propagates "blue"
@test_broken p[1][:legend_title_font_color] == RGB{Colors.N0f8}(0.0,0.0,1.0)
@test p[1][:legend_background_color] == RGBA{Float64}(0.0,1.0,1.0,1.0)
@test p[1][:legend_foreground_color] == RGBA{Float64}(0.0,0.5019607843137255,0.0,1.0)
end # testset