11
22"""
3- update_grid(data, value_ranges , categorical_vars, continuous_vars , mapping_obs)
3+ update_grid(data, formula_values , categorical_vars, continuous_terms , mapping_obs)
44Plotting and updating an interactive dashboard.
55
66 Arguments:\\
77- `data::DataFrame` - the result of `effects(Dict(...), model) ` with columns: yhat, channel, dummy, time, eventname and unique columns for each formula term.\\
8- - `value_ranges ::Vector{Pair{Symbol}}` - value range for continuous variables, levels for categorical.\\
8+ - `formula_values ::Vector{Pair{Symbol}}` - value range for continuous variables, levels for categorical.\\
99- `categorical_vars::Vector{Symbol}` - categorical terms.\\
10- - `continuous_vars ::Vector{Symbol}` - continuous terms.\\
10+ - `continuous_terms ::Vector{Symbol}` - continuous terms.\\
1111- `mapping::Dict{Symbol, Symbol}` - dictionary with dropdown menus and their default values.\\
1212
1313Action:\\
@@ -19,33 +19,33 @@ Action:\\
1919
2020**Return Value:** `Makie.GridLayoutSpec`.
2121"""
22- function update_grid (data, value_ranges , cat_terms, continuous_vars , mapping_obs)
22+ function update_grid (data, formula_values , cat_terms, continuous_terms , mapping_obs)
2323 # Convert observable mapping to values
2424 mapping = to_value (mapping_obs)
2525
26- # Identify activated categorical and continuous variables
26+ # Identify is categorical term activated
2727 cat_active = Dict (cat => data[1 , cat] != " typical_value" for cat in cat_terms)
28- cont_active = Dict (cont => data[ 1 , cont] != " typical_value " for cont in continuous_vars)
29- # @debug cat_active
30- # Retrieve unique categorical levels
31- cat_levels = [unique (data[! , cat]) for cat in cat_terms]
28+ # Identify is continuous term activated
29+ cont_active = Dict (cont => data[ 1 , cont] != " typical_value " for cont in continuous_terms)
30+ # Retrieve levels for selected and unselected categorical terms
31+ cat_levels = [unique (data[! , cat]) for cat in cat_terms] # empty unless selected
3232
3333 # Prepare styles for categorical and continuous variables
3434 scatter_styles, line_styles = prepare_styles (
3535 data,
3636 cat_terms,
37- continuous_vars ,
37+ continuous_terms ,
3838 mapping,
3939 cat_active,
4040 cont_active,
4141 cat_levels,
4242 )
4343
44- col_term = mapping[:col ]
45- row_term = mapping[:row ]
44+ col_term = mapping[:col ] # not used yet
45+ row_term = mapping[:row ] # not used yet
4646
4747 legend_entries =
48- [n => v for (n, v) in value_ranges if merge (cat_active, cont_active)[n]]
48+ [n => v for (n, v) in formula_values if merge (cat_active, cont_active)[n]]
4949
5050 row_levels =
5151 row_term == :none ? [" " ] :
@@ -75,45 +75,45 @@ function update_grid(data, value_ranges, cat_terms, continuous_vars, mapping_obs
7575 if col_term != :none
7676 active_cat_vars[col_term] = [col_level]
7777 end
78+
7879 # Iterate over categorical levels to define styles
7980 for level_grid in Iterators. product (collect (values (active_cat_vars))... )
8081 if ! isempty (level_grid) && level_grid[1 ] .== " typical_value"
8182 continue
8283 end
83- # create a new term => values (e.g. animal => [fish,cow] ) Dict
84+ dict_grid = Dict ( collect ( keys (active_cat_vars)) . => level_grid)
8485 define_scatter_line_style! (
8586 plots,
8687 subdata,
87- Dict ( collect ( keys (active_cat_vars)) .=> level_grid) ,
88+ dict_grid ,
8889 scatter_styles,
8990 line_styles,
90- continuous_vars ,
91+ continuous_terms ,
9192 )
9293 end
93- axes[r_ix, c_ix] = S. Axis (; plots = plots)
94+ axes[r_ix, c_ix] = S. Axis (; plots = plots)
9495 end
9596 end
9697 palettes = merge (line_styles, scatter_styles)
9798
98- legends = Union{Nothing,Makie. BlockSpec}[]
99+ legends = Union{Nothing, Makie. BlockSpec}[]
99100 for (term, levels) in legend_entries
100101 if haskey (palettes, term)
101102 push! (legends, variable_legend (term, levels, Dict (palettes[term])))
102103 end
103104 end
104-
105- if isempty (legends)
106- return S. GridLayout (axes)
107- else
108- return S. GridLayout ([(1 , 1 ) => S. GridLayout (axes), (:, 2 ) => S. GridLayout (legends)])
109- end
105+ res = S. GridLayout ([
106+ (1 , 1 ) => S. GridLayout (axes),
107+ (:, 2 ) => S. GridLayout (legends)
108+ ])
109+ return res
110110end
111111
112112
113113function prepare_styles (
114114 data,
115115 cat_terms,
116- continuous_vars ,
116+ continuous_terms ,
117117 mapping,
118118 cat_active,
119119 cont_active,
@@ -127,30 +127,28 @@ function prepare_styles(
127127
128128 # Assign styles to categorical variables
129129 scatter_styles = Dict ()
130-
131130 for (vals, cat) in zip (cat_levels, cat_terms)
132131 if ! cat_active[cat]
133132 continue
134133 end
135-
136134 for (target, pal) in
137135 zip ([:color , :marker , :linestyle ], (cpalette, mpalette, lpalette))
138- if mapping[target] == cat
136+ if mapping[target] == cat
139137 p = cat => (target => Dict (zip (vals, pal)))
140138 push! (scatter_styles, p)
141139 end
142140 end
143141 end
144142 # Assign styles to continuous variables
145- continuous_values = [extrema (data[! , con]) for con in continuous_vars ]
146- if isempty (continuous_vars )
143+ continuous_values = [extrema (data[! , con]) for con in continuous_terms ]
144+ if isempty (continuous_terms )
147145 # if no continuous variable, use the scatter-color for plotting
148146 line_styles = Dict ()
149147
150148 else
151149 line_styles = Dict (
152150 cont => (:colormap => (val, style)) for (style, val, cont) in
153- zip (continuous_styles, continuous_values, continuous_vars ) if
151+ zip (continuous_styles, continuous_values, continuous_terms ) if
154152 cont_active[cont]
155153 )
156154 end
0 commit comments