63 lines
2.6 KiB
Julia
63 lines
2.6 KiB
Julia
"""
|
|
_process_seriesrecipes!(plt, kw_list)
|
|
|
|
Recursively apply series recipes until the backend supports the seriestype
|
|
"""
|
|
function _process_seriesrecipes!(plt, kw_list)
|
|
for kw in kw_list
|
|
# in series attributes given as vector with one element per series,
|
|
# select the value for current series
|
|
slice_series_attributes!(plt, kw_list, kw)
|
|
|
|
series_attr = DefaultsDict(kw, series_defaults(plt))
|
|
# now we have a fully specified series, with colors chosen. we must recursively
|
|
# handle series recipes, which dispatch on seriestype. If a backend does not
|
|
# natively support a seriestype, we check for a recipe that will convert that
|
|
# series type into one made up of lower-level components.
|
|
# For example, a histogram is just a bar plot with binned data, a bar plot is
|
|
# really a filled step plot, and a step plot is really just a path. So any backend
|
|
# that supports drawing a path will implicitly be able to support step, bar, and
|
|
# histogram plots (and any recipes that use those components).
|
|
_process_seriesrecipe(plt, series_attr)
|
|
end
|
|
end
|
|
|
|
# this method recursively applies series recipes when the seriestype is not supported
|
|
# natively by the backend
|
|
function _process_seriesrecipe(plt, plotattributes)
|
|
# replace seriestype aliases
|
|
st = Symbol(plotattributes[:seriestype])
|
|
st = plotattributes[:seriestype] = type_alias(plt, st)
|
|
|
|
# shapes shouldn't have fillrange set
|
|
if plotattributes[:seriestype] == :shape
|
|
plotattributes[:fillrange] = nothing
|
|
end
|
|
|
|
# if it's natively supported, finalize processing and pass along to the backend,
|
|
# otherwise recurse
|
|
if is_seriestype_supported(plt, st)
|
|
add_series!(plt, plotattributes)
|
|
else
|
|
# get a sub list of series for this seriestype
|
|
x, y, z = plotattributes[:x], plotattributes[:y], plotattributes[:z]
|
|
datalist = RecipesBase.apply_recipe(plotattributes, Val{st}, x, y, z)
|
|
warn_on_recipe_aliases!(plt, datalist, :series, st)
|
|
|
|
# assuming there was no error, recursively apply the series recipes
|
|
for data in datalist
|
|
if isa(data, RecipeData)
|
|
preprocess_attributes!(plt, data.plotattributes)
|
|
if data.plotattributes[:seriestype] == st
|
|
error("The seriestype didn't change in series recipe $st. This will cause a StackOverflow.")
|
|
end
|
|
_process_seriesrecipe(plt, data.plotattributes)
|
|
else
|
|
@warn("Unhandled recipe: $(data)")
|
|
break
|
|
end
|
|
end
|
|
end
|
|
nothing
|
|
end
|