Поскольку highcharts не предоставляет функции для пирамид населения, я вручную сфальсифицировал ее, используя столбчатый тип графика, присвоив отрицательные значения данным для одной стороны пирамиды. Единственная проблема, с которой я столкнулся, заключается в том, что я не могу понять, как перезаписать метки оси x, чтобы я мог отображать эти значения как положительные.
Я также манипулировал функциями заголовков и подзаголовков, чтобы создавать заголовки для обеих сторон пирамиды.
Вот пример кода:
data <- data.frame(x=as.factor(c(seq(1,10,1), seq(1,10,1))),
y=sample(10:20, size=20, replace=T),
group=c(rep(1,10), rep(2,10)))
data <- data %>%
mutate(y = ifelse(group == 1, (-1)*y, y))
highchart() %>%
hc_add_series(
data,
type = "bar",
hcaes(
x = x,
y = y,
group = group
), showInLegend = F) %>%
hc_plotOptions(bar = list(stacking = "normal")) %>%
hc_title(text = "Group 1", align= "center", x = -115, y=20, margin=0,
style = list(fontSize = "12px", color = "#0d233a")) %>%
hc_subtitle(text = "Group 2", align= "center", y=20, margin=0,
x = 130, style = list(fontSize = "12px", color = "#2f7ed8"))
Мой главный вопрос заключается в том, как вручную перезаписать ось x, чтобы левой стороне пирамиды можно было присвоить положительные метки оси. Кроме того, если у кого-то есть идея о том, как центрировать заголовок и подзаголовок программно, чтобы они находились в центре каждой стороны пирамиды, это было бы замечательно.
Я попытался сделать ось x категоричной и использовать опцию «категории» для назначения меток, но почему-то вместо 0 отображается 20, и я не могу понять, почему и как это исправить.
ylim <- plyr::round_any(max(abs(data$y), na.rm=T), 5)
highchart() %>%
hc_add_series(
data,
type = "bar",
hcaes(
x = x,
y = y,
group = group
), showInLegend = F) %>%
hc_plotOptions(bar = list(stacking = "normal")) %>%
hc_title(text = "Group 1", align= "center", x = -115, y=20, margin=0,
style = list(fontSize = "12px", color = "#0d233a")) %>%
hc_subtitle(text = "Group 2", align= "center", y=20, margin=0,
x = 130, style = list(fontSize = "12px", color = "#2f7ed8")) %>%
hc_yAxis(type = "category", categories = as.factor(c(rev(seq(0,ylim,5)),
seq(5,ylim,5))), tickInterval=5)
Я был бы очень признателен за вашу помощь! Я также открыт для совершенно другого подхода к построению пирамиды населения с использованием пакета highcharter.
Поскольку у вас есть значения по оси X, Highcharts воспринимает y как x, а x как y. (Мне потребовалась минута, чтобы понять, почему он меня не слушает.)
В коде R вы увидите вызов hc_yAxis(). Функция formatter изменит ваши метки по оси X на их абсолютные значения.
highchart() %>%
hc_add_series(data, type = "bar", hcaes(x = x, y = y, group = group),
showInLegend = F) %>%
hc_plotOptions(bar = list(stacking = "normal")) %>%
# format the labels on the x-axis (y-axis per HC)
hc_yAxis(labels = list(formatter = htmlwidgets::JS(
"function() {
return Math.abs(this.value); /* all labels to absolute values */
}"
))) %>%
hc_title(text = "Group 1", align = "center", x = -115, y = 20, margin = 0,
style = list(fontSize = "12px", color = "#0d233a")) %>%
hc_subtitle(text = "Group 2", align = "center", y = 20, margin = 0,
x = 130, style = list(fontSize = "12px", color = "#2f7ed8"))