!!更新了来自Jan的信息.他已经清楚地展示了如何使用我下面的第一个数据集df3来实现这一点. 在我的最后一个例子中,我试图将他的方法应用到三个独立的数据集上,除非所有数据都在一个数据框中,否则钻取无法引用更高的级别.这是至关重要的,因为在某些链接中的关键方面方法显示每个钻取只有2列的框架,但它们必须来自一个整体更大的框架,其中所有链接都是隐式的.

在我的最后一个例子中加入了数据库,并使用Jan的方法,我包括了一个工作示例,以了解数据需要如何安排以及它是如何工作的.

我试图做一个多层次的钻取,不确定采取哪种方法或数据应该从哪种方式开始.以下的一些路径jkunst stackoverflow infoworld我try 了两种方法,第一种作品,但是加倍的一切在堆叠:应该有2在堆叠条形图:类型;固定,家庭.第一层是混乱的.

 df3 <- tibble::tribble(
  ~Year,  ~Full_Total,   ~Total,      ~Type,      ~Sub_Type,           ~Count,     
  1990,       40,         35,     "Stationary",   "Pencils",             20,
  1990,       40,         35,     "Stationary",   "Rulers",              15,             
  1990,       40,          5,      "Household",   "Dishes",               5,
  1990,       40,          5,      "Household",   "Cleaning_products",    0,
  1991,       60,         30,     "Stationary",   "Pencils",             30,
  1991,       60,         25,     "Stationary",   "Rulers",              25,             
  1991,       60,          0,      "Household",   "Dishes",               0,
  1991,       60,          5,      "Household",   "Cleaning_products",    5,
  1992,       90,         40,     "Stationary",   "Pencils",             30,
  1992,       90,         40,     "Stationary",   "Rulers",              10,             
  1992,       90,         50,      "Household",   "Dishes",              40,
  1992,       90,         50,      "Household",   "Cleaning_products",   10,
  )

df3 <- df3 %>% 
  group_by(Year) %>% 
  mutate(Year = fct_inorder(as.character(Year)))
# ---- drilldown using df3

drilldown <- df3 %>% 
  group_nest(Year) %>% 
  mutate(id = Year,
         type = "column",
         data = map(data, mutate, name = `Type`, y = `Count`),
         data = map(data, list_parse)
  )



 drilldown2 <- df3 %>% 
  group_nest(Year) %>% 
  mutate(id = Year,
         type = "column",
         data = map(data, mutate, name = "Sub_Type", y = "Count"),
         data = map(data, list_parse)
         )
    
    # ---- data is ready for drilldown charting ----
    
    # ---- chart ----
    
    hchart(
      df3,
      "column",
      hcaes(x = Year, y = `Total`, name = Type, drilldown = Year),
      name = "Full Total",
      colorByPoint = TRUE
    ) |>
      hc_plotOptions(column = list(stacking = "normal")
      )|>
  hc_drilldown(
        allowPointDrilldown = TRUE,
        series = list_parse(drilldown)
      )|>
  hc_drilldown(
        allowPointDrilldown = TRUE,
        series = list_parse(drilldown2)
  )

因此,上面的代码在第一级工作/工作不正确,但是添加一个列表列表到hc_drilldown,例如,进行更多的钻取不起作用.

hc_drilldown(
    allowPointDrilldown = TRUE,
    series = list(
      list_parse(drilldown),
      list_parse(drilldown2)
    )

另一种方法如下,应该工作,并将有助于进一步的钻削,但我不能得到它的工作.

    df1 <- tibble::tribble(
  ~Year, ~Total,~Type,
  1990,    450,  "Stationary",
  1990,    450,  "Food",
  1990,    450,  "Household", 
  1991,    600,  "Stationary",
  1991,    600,  "Food", 
  1991,    600,  "Household",
  1992,    170,  "Stationary", 
  1992,    170,  "Food", 
  1992,    170,  "Household", 
  1993,    253,  "Stationary", 
  1993,    253,  "Food", 
  1993,    253,  "Household")

df1 <- df1 %>% group_by(Year) %>% mutate(Year = as.character(Year)) %>% mutate(Year = fct(Year))

df2 <- tibble::tribble(
  ~Year, ~Sub_Total,~Sub_Type,
  1990,     100,  "pencils",
  1990,     200,  "bread",
  1990,     150,  "bulbs", 
  1991,     200,  "pens",
  1991,     200,  "milk", 
  1991,     200,  "dishes",
  1992,      50,  "ruler", 
  1992,     100,  "meat", 
  1992,      20,  "cleaning", 
  1993,     150,  "rubber", 
  1993,     100,  "fruit", 
  1993,       3,  "containers")

df2 <- df2 %>% select(!Year)

# ---- drilldown using df1 and df2

hc <- highchart() %>% 
  hc_title(text = "Basic Drilldown") %>% 
  hc_xAxis(type = "category") %>% 
  hc_legend(enabled = FALSE) %>% 
  hc_plotOptions(
    series = list(
      borderWidth = 0,
      dataLabels = list(enabled = FALSE)
    ),
    column = list(stacking = "normal")
  ) %>% 
  hc_add_series(
    data = df1, 
    type = "column",
    hcaes(name = "Year", y = Total/3),
    name = "Type", 
    colorByPoint=TRUE
  )

drilldown1 <- df2[c(1,4,7,10),]


drilldown2 <- df2[c(2,5,8,11),]
  
drilldown3 <- df2[c(3,6,9,12),]
  

drilldown1 <- list_parse2(drilldown1)
drilldown2 <- list_parse2(drilldown2)
drilldown3 <- list_parse2(drilldown3)

hc <- hc %>% 
  hc_drilldown(
    allowPointDrilldown = TRUE,
    series = list(
      list(
        id = "Stationary",
        data = drilldown1),
      list(
        id = "Food",
        data = drilldown2
      ),
      list(
        id = "Household",
        data = drilldown3
      )
  )
)

最后,试图确保关键方面是正确的,并遵循这个例子make_3_level_drilldown_highcharter,但没有得到钻取工作.

  main_df <- tibble::tribble(
  ~Year,   ~Type,    ~Total,
  1990,  "Primary",    100,
  1991,  "Primary",    200,
  1992,  "Primary",    300,
  1993,  "Primary",    400
)

sub_type_df <- tibble::tribble(
  ~Year,  ~Sub_Type,   ~Sub_Count,
  1990,      "A",            25,
  1990,      "B",            15,
  1990,      "C",            15,
  1990,      "D",            20,
  1990,      "E",            30,
  1991,      "A",            50,
  1991,      "B",            50,
  1991,      "C",            25,
  1991,      "D",            25,
  1991,      "E",            50,
  1992,      "A",            20,
  1992,      "B",            70,
  1992,      "C",            60,
  1992,      "D",           100,
  1992,      "E",            50,
  1993,      "A",            75,
  1993,      "B",            25,
  1993,      "C",           150,
  1993,      "D",           100,
  1993,      "E",            50,
)

parts_df <- tibble::tribble(
  ~Year,   ~Sub_Type,  ~Part,  ~Part_Count,
  1990,       "A",     "part-a",     5,
  1990,       "A",     "part-b",     5,
  1990,       "A",     "part-c",    10,
  1990,       "A",     "part-d",     5,
  1990,       "B",     "part-a",     0, 
  1990,       "B",     "part-b",     5,
  1990,       "B",     "part-c",     5,
  1990,       "B",     "part-d",     5,
  1990,       "C",     "part-a",     5,
  1990,       "C",     "part-b",     0,
  1990,       "C",     "part-c",     5,
  1990,       "C",     "part-d",     5,
  1990,       "D",     "part-a",    10,
  1990,       "D",     "part-b",     0,
  1990,       "D",     "part-c",     5,
  1990,       "D",     "part-d",     5,
  1990,       "E",     "part-a",    15,
  1990,       "E",     "part-b",     0, 
  1990,       "E",     "part-c",    10,
  1990,       "E",     "part-d",     5,
  1991,       "A",     "part-a",    20,
  1991,       "A",     "part-b",    15,
  1991,       "A",     "part-c",    10,
  1991,       "A",     "part-d",     5,
  1991,       "B",     "part-a",    15, 
  1991,       "B",     "part-b",    20,
  1991,       "B",     "part-c",     5,
  1991,       "B",     "part-d",    10,
  1991,       "C",     "part-a",     5,
  1991,       "C",     "part-b",     0,
  1991,       "C",     "part-c",    15,
  1991,       "C",     "part-d",     5,
  1991,       "D",     "part-a",    10,
  1991,       "D",     "part-b",     0,
  1991,       "D",     "part-c",    10,
  1991,       "D",     "part-d",     5,
  1991,       "E",     "part-a",    15,
  1991,       "E",     "part-b",    10, 
  1991,       "E",     "part-c",    10,
  1991,       "E",     "part-d",    15,
  1992,       "A",     "part-a",     5,
  1992,       "A",     "part-b",     5,
  1992,       "A",     "part-c",    10,
  1992,       "A",     "part-d",     0,
  1992,       "B",     "part-a",    20, 
  1992,       "B",     "part-b",    15,
  1992,       "B",     "part-c",     5,
  1992,       "B",     "part-d",    30,
  1992,       "C",     "part-a",    20,
  1992,       "C",     "part-b",    20,
  1992,       "C",     "part-c",    15,
  1992,       "C",     "part-d",     5,
  1992,       "D",     "part-a",    10,
  1992,       "D",     "part-b",    60,
  1992,       "D",     "part-c",    15,
  1992,       "D",     "part-d",    15,
  1992,       "E",     "part-a",    15,
  1992,       "E",     "part-b",    20, 
  1992,       "E",     "part-c",    10,
  1992,       "E",     "part-d",     5,
  1993,       "A",     "part-a",    25,
  1993,       "A",     "part-b",    25,
  1993,       "A",     "part-c",    10,
  1993,       "A",     "part-d",    15,
  1993,       "B",     "part-a",    10, 
  1993,       "B",     "part-b",     5,
  1993,       "B",     "part-c",     5,
  1993,       "B",     "part-d",     5,
  1993,       "C",     "part-a",    80,
  1993,       "C",     "part-b",    20,
  1993,       "C",     "part-c",    15,
  1993,       "C",     "part-d",    35,
  1993,       "D",     "part-a",    10,
  1993,       "D",     "part-b",    40,
  1993,       "D",     "part-c",    25,
  1993,       "D",     "part-d",    25,
  1993,       "E",     "part-a",    15,
  1993,       "E",     "part-b",    20, 
  1993,       "E",     "part-c",    10,
  1993,       "E",     "part-d",     5,
  
)

full_df <- left_join(main_df, parts_df)

datSum <- full_df |>
  summarize(Quantity = sum(Total), .by = Year)
Lvl1dfStatus <-
  tibble(
    name = datSum$Year,
    y = datSum$Quantity,
    drilldown = tolower(name)
  )


drilldownLvl2 <- lapply(unique(full_df$Year), function(year_level) {
  datSum2 <- full_df |> 
    filter(Year == year_level) |> 
    summarise(Quantity = sum(Part_Count), .by = Sub_Type) 
  Lvl2dfStatus <-
    tibble(
      name = datSum2$Sub_Type,
      y = datSum2$Quantity,
      drilldown = tolower(paste(year_level, name, sep = "_"))
    )
  list(
    id = tolower(year_level),
    name = "Type",
    type = "column",
    data = list_parse(Lvl2dfStatus)
  )
})

drilldownLvl3 <- lapply(unique(full_df$Year), function(year_level) {
  datSum2 <- full_df |> 
    filter(Year == year_level)
  lapply(unique(datSum2$Sub_Type), function(type_level) {
    datSum3 <- datSum2 %>% 
      filter(Sub_Type == type_level) %>% 
      summarise(Quantity = sum(Part_Count), .by = Part)
    Lvl3dfStatus <-
      tibble(name = datSum3$Part, y = datSum3$Quantity)
    list(
      id = tolower(paste(year_level, type_level, sep = "_")),
      name = "Part",
      type = "column",
      data = list_parse2(Lvl3dfStatus)
    )
  })
}) |> unlist(recursive = FALSE)

highchart() |>
  hc_title(text = "Basic multi-level drilldown") |> 
  hc_xAxis(type = "category") |>
  hc_yAxis(title = list(text = "Count")) |> 
  hc_add_series(Lvl1dfStatus,
                "column",
                hcaes(
                  x = name,
                  y = y,
                  name = name,
                  drilldown = drilldown
                ),
                name = "Year") |>
  hc_plotOptions(column = list(stacking = "normal")) |> 
  hc_drilldown(allowPointDrilldown = TRUE,
               series = c(drilldownLvl2, drilldownLvl3))

推荐答案

多层次的钻取会更复杂一些.下面是一个基于你的第一个代码的示例,你可以如何处理你的数据以获得合适的列表.

但是,请注意,这里并不真正需要三级钻取,因为您的数据只有两种类型.我包括了它,因为你的问题中的代码试图使用多个钻取级别.

enter image description here

library(dplyr)
library(highcharter)

df3 <- tibble::tribble(
  ~Year,  ~Full_Total,   ~Total,      ~Type,      ~Sub_Type,           ~Count,     
  1990,       40,         35,     "Stationary",   "Pencils",             20,
  1990,       40,         35,     "Stationary",   "Rulers",              15,             
  1990,       40,          5,      "Household",   "Dishes",               5,
  1990,       40,          5,      "Household",   "Cleaning_products",    0,
  1991,       60,         30,     "Stationary",   "Pencils",             30,
  1991,       60,         25,     "Stationary",   "Rulers",              25,             
  1991,       60,          0,      "Household",   "Dishes",               0,
  1991,       60,          5,      "Household",   "Cleaning_products",    5,
  1992,       90,         40,     "Stationary",   "Pencils",             30,
  1992,       90,         40,     "Stationary",   "Rulers",              10,             
  1992,       90,         50,      "Household",   "Dishes",              40,
  1992,       90,         50,      "Household",   "Cleaning_products",   10,
)


datSum <- df3 |>
  summarize(Quantity = sum(Count), .by = Year)
Lvl1dfStatus <-
  tibble(
    name = datSum$Year,
    y = datSum$Quantity,
    drilldown = tolower(name)
  )


drilldownLvl2 <- lapply(unique(df3$Year), function(year_level) {
  datSum2 <- df3 |> 
    filter(Year == year_level) |> 
    summarise(Quantity = sum(Count), .by = Type) |> 
    arrange(desc(Quantity))
  Lvl2dfStatus <-
    tibble(
      name = datSum2$Type,
      y = datSum2$Quantity,
      drilldown = tolower(paste(year_level, name, sep = "_"))
    )
  list(
    id = tolower(year_level),
    name = "Type",
    type = "column",
    data = list_parse(Lvl2dfStatus)
  )
})


drilldownLvl3 <- lapply(unique(df3$Year), function(year_level) {
  datSum2 <- df3 |> filter(Year == year_level)
  lapply(unique(datSum2$Type), function(type_level) {
    datSum3 <- datSum2 |> 
      filter(Type == type_level) |> 
      summarise(Quantity = sum(Count), .by = Sub_Type) |> 
      arrange(desc(Quantity))
    Lvl3dfStatus <-
      tibble(name = datSum3$Sub_Type, y = datSum3$Quantity)
    list(
      id = tolower(paste(year_level, type_level, sep = "_")),
      name = "Sub_Type",
      type = "column",
      data = list_parse2(Lvl3dfStatus)
    )
  })
}) |> unlist(recursive = FALSE)

highchart() |>
  hc_title(text = "Basic multi-level drilldown") |> 
  hc_xAxis(type = "category") |>
  hc_yAxis(title = list(text = "Count")) |> 
  hc_add_series(Lvl1dfStatus,
                "column",
                hcaes(
                  x = name,
                  y = y,
                  name = name,
                  drilldown = drilldown
                ),
                name = "Year") |>
  hc_plotOptions(column = list(stacking = "normal")) |>
  hc_drilldown(allowPointDrilldown = TRUE,
               series = c(drilldownLvl2, drilldownLvl3))

R相关问答推荐

geom_raster不适用于x比例中超过2,15的值

是否有任何解决方案可以优化VSCode中RScript的图形绘制?

给定R中另一行中的值,如何插补缺失值

ggplot 2中的地块底图(basemaps_gglayer()不起作用)

在发布到PowerBI Service时,是否可以使用R脚本作为PowerBI的数据源?

然后根据不同的列值有条件地执行函数

单个轮廓重叠条的单独图例

在R函数中使用加号

在多页PDF中以特定布局排列的绘图列表不起作用

为什么函数toTitleCase不能处理english(1),而toupper可以?

R-使用stri_trans_General()将其音译为德语字母

R:使用ApexCharge更改标签在饼图中的位置

GOGPLATE geom_boxploy色彩疯狂

如何在shiny 的应用程序 map 视图宣传单中可视化单点

隐藏基于 case 总数的值

conditionPanel不考虑以下条件

重写时间间隔模糊连接以减少内存消耗

将R中对象的CSV数组转换为JSON数组

在R中,有没有什么方法可以根据一列中的多个值来过滤行?

汇总数据:在跨越()all_of()Dynamic_list_of_vars=>;所选内容不能有缺失值的汇总()中出错