-
Notifications
You must be signed in to change notification settings - Fork 119
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
- Loading branch information
Showing
14 changed files
with
324 additions
and
24 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
#' Scales: composition | ||
#' | ||
#' Scales in tmap are configured by the family of functions with prefix `tm_scale`. | ||
#' Such function should be used for the input of the `.scale` arguments in the | ||
#' layer functions (e.g. `fill.scale` in [tm_polygons()]). | ||
#' The function `tm_scale_composition()` is used for the creation of composition glyphs, such as pie charts and donut charts. | ||
#' | ||
#' @param values (generic scale argument) The visual values. For colors (e.g. `fill` or `col` for `tm_polygons()`) this is a palette name from the `cols4all` package (see [cols4all::c4a()]) or vector of colors, for size (e.g. `size` for `tm_symbols()`) these are a set of sizes (if two values are specified they are interpret as range), for symbol shapes (e.g. `shape` for [tm_symbols()]) these are a set of symbols, etc. The tmap option `values.var` contains the default values per visual variable and in some cases also per data type. | ||
#' @param values.repeat (generic scale argument) Should the values be repeated in case there are more categories? | ||
#' @param values.range (generic scale argument) Range of the values. Vector of two numbers (both between 0 and 1) where the first determines the minimum and the second the maximum. Full range, which means that all values are used, is encoded as `c(0, 1)`. For instance, when a grey scale is used for color (from black to white), `c(0,1)` means that all colors are used, `0.25, 0.75` means that only colors from dark grey to light grey are used (more precisely `"grey25"` to `"grey75"`), and `0, 0.5` means that only colors are used from black to middle grey (`"grey50"`). When only one number is specified, this is interpreted as the second number (where the first is set to 0). Default values can be set via the tmap option `values.range`. | ||
#' @param values.scale (generic scale argument) Scaling of the values. Only useful for size-related visual variables, such as `size` of [tm_symbols()] and `lwd` of [tm_lines()]. | ||
#' @param value.na (generic scale argument) Value used for missing values. See tmap option `"value.na"` for defaults per visual variable. | ||
#' @param value.null (generic scale argument) Value used for NULL values. See tmap option `"value.null"` for defaults per visual variable. Null data values occur when out-of-scope features are shown (e.g. for a map of Europe showing a data variable per country, the null values are applied to countries outside Europe). | ||
#' @param value.neutral (generic scale argument) Value that can be considered neutral. This is used for legends of other visual variables of the same map layer. E.g. when both `fill` and `size` are used for [tm_symbols()] (using filled circles), the size legend items are filled with the `value.neutral` color from the `fill.scale` scale, and fill legend items are bubbles of size `value.neutral` from the `size.scale` scale. | ||
#' @param labels (generic scale argument) Labels | ||
#' @param label.na (generic scale argument) Label for missing values | ||
#' @param label.null (generic scale argument) Label for null (out-of-scope) values | ||
#' @export | ||
#' @name tm_scale_glyph_composition | ||
#' @rdname tm_scale_glyph_composition | ||
tm_scale_composition = function( | ||
values = NA, | ||
values.repeat = FALSE, | ||
values.range = NA, | ||
values.scale = 1, | ||
value.na = NA, | ||
value.null = NA, | ||
value.neutral = NA, | ||
labels = NULL, | ||
label.na = NA, | ||
label.null = NA) { | ||
structure(c(list(FUN = "tmapScaleComposition"), as.list(environment())), class = c("tm_scale_composition", "tm_scale", "list")) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
tmapScaleComposition = function(..., scale, legend, chart, o, aes, layer, layer_args, sortRev, bypass_ord, submit_legend = TRUE) { | ||
args = list(...) | ||
|
||
ct = NULL # what is it again? | ||
cls = c("fact", "unord") | ||
|
||
scale = get_scale_defaults(scale, o, aes, layer, cls, ct) | ||
|
||
show.messages <- o$show.messages | ||
show.warnings <- o$show.warnings | ||
|
||
n = length(args) | ||
|
||
with(scale, { | ||
fun_getCVV = paste0("tmapValuesCVV_", aes) | ||
VV = do.call(fun_getCVV, list(x = values, value.na = value.na, n = n, range = values.range, scale = values.scale, rep = values.repeat, o = o)) | ||
|
||
values = VV$vvalues | ||
value.na = VV$value.na | ||
|
||
sfun = paste0("tmapValuesScale_", aes) | ||
cfun = paste0("tmapValuesColorize_", aes) | ||
if (is.na(value.neutral)) value.neutral = VV$value.neutral else value.neutral = do.call(sfun, list(x = do.call(cfun, list(x = value.neutral, pc = o$pc)), scale = values.scale)) | ||
|
||
mfun = paste0("tmapValuesSubmit_", aes) | ||
values = do.call(mfun, list(x = values, args = layer_args)) | ||
value.na = do.call(mfun, list(x = value.na, args = layer_args)) | ||
value.neutral = do.call(mfun, list(x = value.neutral, args = layer_args)) | ||
|
||
totals = Reduce("+", args) | ||
mx = max(totals) | ||
val_list = lapply(args, function(a) a / mx) | ||
|
||
vals = do.call(encode_mv, c(val_list, list(digits = 4))) | ||
labs = paste0("label", 1:n) | ||
|
||
value.neutral = vals[1] | ||
|
||
icon_scale = if (getOption("tmap.mode") == "plot") layer_args$icon.scale else 1 | ||
|
||
legend = within(legend, { | ||
nitems = length(labs) | ||
labels = labs | ||
dvalues = values | ||
vvalues = values | ||
vneutral = value.neutral | ||
icon_scale = icon_scale | ||
na.show = FALSE | ||
scale = "composition" | ||
}) | ||
|
||
|
||
chartFun = paste0("tmapChart", toTitleCase(chart$summary)) | ||
chart = do.call(chartFun, list(chart)) | ||
|
||
if (submit_legend) { | ||
if (bypass_ord) { | ||
format_aes_results(vals, legend = legend, chart = chart) | ||
} else { | ||
format_aes_results(vals, ord = 1L, legend = legend, chart = chart) | ||
} | ||
} else { | ||
list(vals = vals, ids = 1L, legend = legend, chart = chart, bypass_ord = bypass_ord) | ||
} | ||
}) | ||
|
||
|
||
|
||
|
||
} | ||
|
||
encode_mv = function(..., digits = 4) { | ||
args = list(...) | ||
|
||
k = length(args) | ||
m = seq(0, by = digits, length.out = k) | ||
|
||
lst = mapply(function(v, mi) { | ||
v * 10^(digits-1+mi) | ||
}, args, m, SIMPLIFY = FALSE) | ||
Reduce("+", lst) | ||
} | ||
|
||
decode_mv = function(x, digits = 4) { | ||
m_temp = seq(0, by = digits, length.out = 20) | ||
k = which(vapply(m_temp, function(mi) all(x < 10^mi), FUN.VALUE = logical(1)))[1] - 1L | ||
m = seq(0, by = digits, length.out = k) | ||
lst = lapply(m, function(mi) { | ||
(floor(x / 10^mi) %% 10^digits) / 10^(digits-1L) | ||
}) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.