R Highcharter:将 xAxis 类型从日期时间更改为类别

R Highcharter: Changing xAxis Type from datetime to category

我想将 x 轴类型从日期时间更改为类别。例如:Primary Chart 将是按组划分的折线图,而 drilldown chart 将是柱形图。

Highcharts (Highcharts, Can you change the chart type for drilldowns?, ) 中提供了一个解决方案,但我无法将其翻译成 R。

PFB 代码。

library("dplyr")
library("purrr")
library("highcharter")

df <- data_frame(
  car_brand = c("Hyundai","Hyundai","Hyundai", "Benz","Benz","Benz", "Tesla","Tesla","Tesla"),
  units_sold = c(10,15,20,11,8,13,6,5,7),
  date = c("2019-01-01", "2019-02-01","2019-03-01","2019-01-01","2019-02-01","2019-03-01","2019-01-01","2019-02-01","2019-03-01")
)

df$units_sold <- as.numeric(df$units_sold)
df$date <- as.Date(df$date)
df$drilldown <- paste(df$car_brand, ",", df$date)
carBrands<- df %>%
  select(date, car_brand)

getCarDetails<- function(brands){

  carList <- list()
  listofdfs <- list() #Create a list in which you intend to save your df's.

  for(i in 1:nrow(brands)){ #Loop through the numbers of ID's instead of the ID's

    #You are going to use games[i] instead of i to get the ID
    BrandCarData <- data_frame(
      car = c("H1","H2","H3","H4","H5"),
      units = c(1,2,3,4,5)
    )
    BrandCarData$units <- as.numeric(BrandCarData$units)
    dsCar <- list_parse2(BrandCarData)
    listofdfs[[i]] <- dsCar
    carList[[i]] <- list (name = brands[[2]][i],
                          type = "column",
                          id = paste(brands[[2]][i], ",", brands[[1]][i]),
                          data = listofdfs[[i]])
  }

  return(carList) #Return the list of dataframes.
}

listCar <- getCarDetails(brands = carBrands)

dfDates <- NULL
dfDates$Date <- datetime_to_timestamp(as.Date(df$date, format = "%Y-%m-%d"))
hc <- hchart(df,"line", hcaes(x=date, y =
                                units_sold, group
                              = car_brand )) %>%
  hc_xAxis(categories = dfDates$Date, title = list(text = "<b>Date</b>"), type = "datetime") %>%
  hc_plotOptions(column = list(dataLabels = list(enabled = FALSE), enableMouseTracking = TRUE))%>%
  hc_tooltip(borderWidth = 1.5,
             pointFormat = paste('<span style="color:{series.color}">{series.name}</span>: <b>{point.y}</b><br/>')) %>%
  hc_legend(enabled = TRUE) %>%
  hc_title(text = "Brand Units Sold Monthy Trend",
           style = list(fontSize = "12px", fontWeight = "bold")) %>%
  hc_yAxis(title = list(text = "<b>Units <br>(In Thousands)</br></b>"))
hc

hc1 <- hc %>%
  hc_drilldown(allowPointDrilldown = TRUE,
               series = listCar)
hc1

从附图中可以看出,第二个图表的x轴仍然以日期时间格式显示x轴标签。

有什么建议吗?

类似问题:

您还可以在此处的 R (Highcharter) 中找到类似的 Highcharts 向下钻取示例:https://whosebug.com/users/8618934/raf18seb?tab=answers

编辑: 我 copied/pasted 来自上面 link 的代码,只添加了一行 "type: 'column'"。这是一个从行向下钻取到列的工作示例:

library(highcharter)
library(dplyr)
library(purrr)

df <- tibble(x = c(1, 2, 3, 2, 3, 4, 3, 5, 4), y = c(1, 2, 1, 3, 3, 2, 4, 6, 5), key = c(rep("A", 3), rep("B", 3), rep("C", 3)),
             drilldown = c(rep("a", 3), rep("b", 3), rep("c", 3)))

drill1 <- data.frame(
  x = c(1,2,3),
  y = c(3, 3, 1)
)
drill1 <- list_parse2(drill1)

drill2 <- data.frame(
  x = c(1,2,4),
  y = c(1, 5, 1)
)
drill2 <- list_parse2(drill2)

drill3 <- data.frame(
  x = c(1,2,4),
  y = c(4, 3, 1)
)
drill3 <- list_parse2(drill3)


hchart(df, "line", 
       hcaes(x = x, y = y, group = key),
       color = c("#A63A50", "#37123C", "#DDA77B"),
       drilldown = TRUE) %>% 
  hc_chart(events = list(drilldown = JS("function(e) {
            e.preventDefault()
            var chart = this,
              series = [{
                type: 'column',
                data: [5, 5, 5, 3, 2]
              }, {
              type: 'column',
                data: [3, 3, 7, 3, 3]
              }];

            chart.addSingleSeriesAsDrilldown(e.point, series[0]);
            chart.addSingleSeriesAsDrilldown(e.point, series[1]);
            chart.applyDrilldown();
        }"))) %>% 
  hc_plotOptions(line = list(marker = list(enabled = FALSE), legendIndex = 1)) %>% 
  hc_drilldown(
    allowPointDrilldown = TRUE,
    series = list(
      list(
        id = "a",
        data = drill1
      ),
      list(
        id = "b",
        data = drill2
      ),
      list(
        id = "c",
        data = drill3
      )
    )
  )

编辑 2:

这是一个代码,可让您在向下钻取后将 xAxis 的类型更改为类别:

hc_chart(events = list(drilldown = JS("function(){
    this.xAxis[0].update({
      categories: ['aaa', 'bbb', 'ccc']
    });
  }"))) %>%

API参考:https://api.highcharts.com/highcharts/chart.events.drilldown https://api.highcharts.com/class-reference/Highcharts.Axis#update https://api.highcharts.com/highcharts/xAxis.categories

根据 raf18seb 的输入,我找到了在向下钻取中自定义 x-Axis 标签的解决方案。除此之外,我还将分享如何更改图表和坐标轴的标题。

在我之前的代码中,我在 hc_xAxis 中指定了 x-Axis 类型,如下面的代码所示:

hc_xAxis(categories = dfDates$Date, title = list(text = "<b>Date</b>"), type = "datetime") 

这是问题的主要原因。您不应在主要级别指定类别,而应在向下钻取级别指定类别类型。请在下面找到修改后的代码:

getCarDetails<- function(brands){
  //This function can also be used to dynamically populate the data for drilldown //chart instead of specifiying it inside a JS code.
  carList <- list()
  listofdfs <- list() 
  for(i in 1:nrow(brands)){ 
    BrandCarData <- data_frame(
      car = c("H1","H2","H3","H4","H5"),
      units = c(1,2,3,4,5)
    )
    BrandCarData$units <- as.numeric(BrandCarData$units)
    dsCar <- list_parse2(BrandCarData)
    listofdfs[[i]] <- dsCar
    carList[[i]] <- list (name = brands[[2]][i],
                          type = "column", //Specify the xAxis category type
                          id = paste(brands[[2]][i], ",", brands[[1]][i]),
                          data = listofdfs[[i]])
  }

  return(carList) #Return the list of dataframes.
}

现在,在下面的代码中,我还添加了更改下钻和上钻时图表和轴标题的代码。

hchart(df,"line", hcaes(x=format(as.Date(date), "%b,%Y"), y =
                                 units_sold, group
                               = car_brand )
) %>%
  hc_drilldown(allowPointDrilldown = TRUE,
               series = listCar)%>%
  hc_chart(events=list(drilldown=JS('function(e) 
                                      {
                                       this.setTitle({text: "Units Distribution Across Cars"});
                                       this.yAxis[0].axisTitle.attr({ text: "Units (in Thousands)"});
                                       this.xAxis[0].axisTitle.attr({ text: "Car Types" });
                                    }'),
                       drillup = JS("function() {this.update({title: {text: 'Brand-wise Units Sold Monthy Trend' }});
                                                 this.xAxis[0].setTitle({ text: 'Date' });
            this.yAxis[0].setTitle({ text: 'Units Sold (in Thousands)' });}")
  ))%>%
  hc_xAxis(title = list(text = "<b>Date</b>")) %>%
  hc_plotOptions(column = list(dataLabels = list(enabled = FALSE), enableMouseTracking = TRUE))%>%
  hc_tooltip(borderWidth = 1.5,
             pointFormat = paste('<span style="color:{series.color}">{series.name}</span>: <b>{point.y}</b><br/>')) %>%
  hc_legend(enabled = TRUE) %>%
  hc_title(text = "Brand-wise Units Sold Monthy Trend",
           style = list(fontSize = "12px", fontWeight = "bold"))%>%
  hc_yAxis(title = list(text = "<b>Units <br>(In Thousands)</br></b>"))

希望以后遇到此问题的任何人都会觉得这很有用。