highcharts Highcharter中的手动轴标签

iq0todco  于 2023-01-13  发布在  Highcharts
关注(0)|答案(1)|浏览(210)

由于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)

我真的很感激你的帮助!我也愿意用一种完全不同的方法来制作一个人口金字塔。

pgccezyw

pgccezyw1#

由于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"))

相关问题