R highcharter柱状图的x轴顺序

xAxis order of R highcharter column plot

具有以下数据框:

dta <- structure(list(sociodemographic_var = structure(c(3L, 6L, 7L, 
8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 18L, 19L, 20L, 21L, 22L, 
23L, 24L, 26L, 18L, 20L, 21L, 26L, 13L, 16L, 21L, 22L, 26L, 26L, 
9L, 13L, 17L, 18L, 20L, 21L, 23L, 26L, 20L, 26L), levels = c("1st grade", 
 "2nd grade", "3rd grade", "4th grade", "5th grade", "6th grade", 
 "7th grade", "8th grade", "9th grade", "10th grade", "11th grade", 
 "12th grade, no diploma", "High school graduate", "GED or equivalent", 
 "Some college, no degree", "Less than 1 year of college credit/post-secondary education (or less than 10 classes)", 
 "One year or more of college credit, no degree", "Associate degree: Occupational, Technical, or Vocational", 
 "Associate degree: Academic Program", "Bachelor's degree (ex. BA, AB, BS, BBS)", 
 "Master's degree (ex. MA, MS, MEng, MEd, MBA)", "Professional School degree (ex. MD, DDS, DVN, JD)", 
 "Doctoral degree (ex. PhD, EdD)", "Refused to answer", "Don't Know", 
 "unknown"), class = "factor"), event = structure(c(1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
3L, 3L, 3L, 3L, 5L, 5L, 5L, 5L, 5L, 7L, 9L, 9L, 9L, 9L, 9L, 9L, 
9L, 9L, 11L, 11L), levels = c("Baseline", "0.5 Year", "1 Year", 
"1.5 Year", "2 Year", "2.5 Year", "3 Year", "3.5 Year", "4 Year", 
"4.5 Year", "5 Year", "5.5 Year", "6 Year", "Screener"), class = "factor"), 
 visit_type = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L), levels = c("on-site", "hybrid", "remote", "unknown"), class = "factor"), 
 n = c(2L, 13L, 5L, 9L, 15L, 18L, 26L, 25L, 192L, 27L, 485L, 
 224L, 183L, 1011L, 666L, 55L, 78L, 3L, 9L, 1L, 1L, 2L, 208L, 
 1L, 1L, 1L, 1L, 126L, 28L, 1L, 1L, 2L, 2L, 3L, 4L, 1L, 543L, 
 1L, 300L)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
 -39L))

我假设生成一个 highcharter 条形图:

library(highcharter)  # v0.9.4

dta |> 
  hchart(type = "column", hcaes(x = "event", y = "n", group = "sociodemographic_var")) |> 
  hc_yAxis(title = list(text = "%"), max = 115, endOnTick = FALSE, stackLabels = list(enabled = TRUE)) |> 
  hc_xAxis(title = "") |> 
  hc_plotOptions(series = list(stacking = "percent"))

xAxis 将按 levels(dta$event):

排序
levels(dta$event)
[1] "Baseline" "0.5 Year" "1 Year"   "1.5 Year" "2 Year"   "2.5 Year" "3 Year"   "3.5 Year" "4 Year"   "4.5 Year" "5 Year"   "5.5 Year"
[13] "6 Year"   "Screener"

但顺序不同,既不是按字母顺序排列,也不是基于值的总数:

我有兴趣了解为什么会这样以及如何正确设置顺序。

您可以将 categories 添加到您的 hc_xAxis 来下订单:

library(highcharter) 

dta |> 
  hchart(type = "column", hcaes(x = "event", y = "n", group = "sociodemographic_var")) |> 
  hc_yAxis(title = list(text = "%"), max = 115, endOnTick = FALSE, stackLabels = list(enabled = TRUE)) |> 
  hc_xAxis(title = "", categories = levels(dta$event)) |> 
  hc_plotOptions(series = list(stacking = "percent"))

输出: