An example of multi-level drill-down introduced in ECharts v5.5.0, see intro. Navigation is implemented as bar clicks and a “Back” button.
Selecting a bar will present more data for the category, with animated transition (morphing). Hit Back button to return to previous level.
This is an R adaptation of the official example, with minimal Javascript code to provide navigation without Shiny.

df <- read.csv(text ="x, y, groupId, childGroupId
Animals,3,things,animals
Fruits,3,things,fruits
Cars,2,things,cars
Dogs,3,animals,dogs
Cats,4,animals,cats
Birds,3,animals,birds
Pomes,3,fruits,pomes
Berries,4,fruits,berries
Citrus,9,fruits,citrus
SUV,5,cars,suv
Sports,3,cars,sports
Corgi,5,dogs,NA
Bulldog,6,dogs,NA
Shiba Inu,7,dogs,NA
American Shorthair,2,cats,NA
British Shorthair,9,cats,NA
Bengal,2,cats,NA
Birman,2,cats,NA
Goose,1,birds,NA
Owl,2,birds,NA
Eagle,8,birds,NA
Apple,9,pomes,NA
Pear,2,pomes,NA
Kiwi,1,pomes,NA
Blackberries,7,berries,NA
Cranberries,2,berries,NA
Strawberries,9,berries,NA
Grapes,4,berries,NA
Oranges,3,citrus,NA
Grapefruits,7,citrus,NA
Tangerines,8,citrus,NA
Lemons,7,citrus,NA
Limes,3,citrus,NA
Kumquats,2,citrus,NA
Citrons,3,citrus,NA
Tengelos,3,citrus,NA
Ugli fruit,1,citrus,NA
Mazda CX-30,7,suv,NA
BMW X2,7,suv,NA
Ford Bronco Sport,2,suv,NA
Toyota RAV4,9,suv,NA
Porsche Macan,4,suv,NA
Porsche 718 Cayman,2,sports,NA
Porsche 911 Turbo,2,sports,NA
Ferrari F8,4,sports,NA
")

jscode <- "
optionStack = []; grBtn = null;
noBtn = {shape:{height:0}, textContent:{style:{text:''}} };
goForward = function (optionId) {
  chart = get_e_charts(echwid);
  if (grBtn==null) grBtn= chart.getOption().button;
  opt = {
    id: optionId, xAxis: {type:'category'}, button:null,
    series: {datasetId: optionId, universalTransition:{enabled:true}},
    graphic: grBtn
  }
  optionStack.push(chart.getOption().id); // save current id in stack
  chart.setOption(opt);
}; "
jsGoBack = "function () {
  chart = get_e_charts(echwid);
  up1 = optionStack.pop();
  opt = { id: up1, xAxis: {type:'category'}, series: {datasetId: up1}  }
  if (optionStack.length === 0) opt.graphic= noBtn;
  chart.setOption(opt);
}"
jsGoFwd = "function(params) {
  childGroupId = params.data[3]; 
  if (childGroupId) goForward(childGroupId);
}"
initGrp <- 'things'

library(dplyr);  library(echarty) # has to be v.1.6.4.1+
p <- df |> group_by(groupId) |> ec.init(
    preset= F, js= jscode,
    id= initGrp,
    xAxis= list(type= 'category'),
    yAxis= list(minInterval= 1),
    animationDurationUpdate= 500,
    series= list(list(
      type='bar', colorBy= 'data',
      datasetId= initGrp,
      encode= list(
        itemGroupId= 'groupId',
        itemChildGroupId= 'childGroupId'
      ),
      universalTransition= list(enabled=T, divideShape= 'clone')
    )),
    button= list(ec.util(cmd='button', text='Back', js=jsGoBack ))
)
p$x$on <- list(list(
    event='click', query='series.bar', handler=ec.clmn(jsGoFwd) 
))
p