由于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轴分类,并使用“categories”选项来分配标签,但不知何故,显示20代替0,我不知道为什么或如何修复它。
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)
我真的很感激你的帮助!我也愿意用一种完全不同的方法来制作一个人口金字塔。
1条答案
按热度按时间pgccezyw1#
由于x轴上有数值,Highcharts * 感知到 * y是x,x是y(我花了一分钟才弄明白它为什么不 * 听 * 我说话)。
在R代码中,你会看到对
hc_yAxis()
的调用,formatter
函数会将你的x轴标签调整为它们的绝对值。