0
votes

I have a column & line chart, using primary and secondary y-axis. I am wondering how I can format each axis separately.

I want to be able to do 2 things:

  • Have the primary axis maximum be set at 100
  • Be able to use colorByPoint for the column series. Currently when I use the parameter, the line series does not appear.

Below is my dataset:

> dput(SiteOTD)
structure(list(SBU = c("LS", "LS", "LS", "INT", "LS", "APS", 
"LS", "CS", "INT", "CS", "SIS", "CS", "APS", "ES", "ASG", "CS", 
"INT", "ASG", "ES", "ES", "APS", "CS", "SIS", "CS", "CS", "SIS", 
"APS", "CS", "CS", "ASG", "ASG", "CS", "ES", "CS", "SIS", "ASG", 
"APS", "ASG", "CS", "SIS", "CS", "SIS", "APS", "CS", "ES", "LS"
), Region = c("IATA III", "IATA I", "IATA I", "IATA I", "IATA III", 
"IATA I", "IATA II", "IATA III", "IATA I", "IATA I", "IATA I", 
"IATA II", "IATA II", "IATA I", "IATA II", "IATA I", "IATA I", 
"IATA I", "IATA I", "IATA II", "IATA II", "IATA I", "IATA II", 
"IATA I", "IATA II", "IATA I", "IATA II", "IATA I", "IATA III", 
"IATA II", "IATA II", "IATA III", "IATA I", "IATA I", "IATA II", 
"IATA I", "IATA II", "IATA III", "IATA III", "IATA I", "IATA II", 
"IATA I", "IATA II", "IATA II", "IATA II", "IATA I"), Plant.Name = c("Witherhill Park", 
"Louisville", "Los Angeles", "Jamestown", "Hong Kong", "Oakville", 
"London", "Xiamen", "Phoenix", "Phoenix", "Wilson", "Dubai", 
"Wolverhampton", "Rome", "Prestwick", "Miramar", "Colorado", 
"Chula Vista", "Windsor Locks", "Marston", "Torino", "Puerto Rico", 
"LHotellier", "Monroe", "Maastricht", "Burnsville", "Vernon", 
"Rockford", "Singapore", "Turkey", "Toulouse", "FAST", "Peabody", 
"NURS", "Plymouth", "Foley", "Brugherio.Luserna", "Singapore", 
"Malaysia", "Vergennes", "Paris", "Brea", "St Ouen", "Dijon", 
"Marston Green", "Wichita"), OTD = c(0.988165680473373, 0.918974782968169, 
0.907429245283019, 0.84375, 0.822389666307858, 0.782608695652174, 
0.776832460732984, 0.765151515151515, 0.734375, 0.718238993710692, 
0.707799767171129, 0.690721649484536, 0.687732342007435, 0.675, 
0.663829787234043, 0.641509433962264, 0.636363636363636, 0.629955947136564, 
0.60202260559191, 0.601351351351351, 0.6, 0.59, 0.586206896551724, 
0.566975568660489, 0.558333333333333, 0.548062015503876, 0.534743202416918, 
0.521978021978022, 0.51063829787234, 0.5, 0.496240601503759, 
0.488888888888889, 0.485294117647059, 0.484848484848485, 0.470588235294118, 
0.448818897637795, 0.440677966101695, 0.436619718309859, 0.435672514619883, 
0.397752808988764, 0.396648044692737, 0.367647058823529, 0.322147651006711, 
0.304568527918782, 0.232876712328767, 0.07981220657277), Shipments = c(169, 
2419, 1696, 32, 929, 69, 1528, 132, 128, 795, 859, 97, 269, 40, 
236, 530, 22, 227, 1681, 149, 276, 100, 29, 1187, 600, 1290, 
331, 182, 611, 6, 133, 90, 272, 338, 51, 128, 118, 142, 344, 
445, 179, 68, 149, 197, 292, 213)), row.names = c(NA, -46L), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"), vars = c("SBU", "Region"), drop = TRUE, .Names = c("SBU", 
"Region", "Plant.Name", "OTD", "Shipments"), indices = list(5L, 
    c(12L, 20L, 26L, 36L, 42L), c(17L, 35L), c(14L, 29L, 30L), 
    37L, c(9L, 15L, 21L, 23L, 27L, 33L), c(11L, 24L, 40L, 43L
    ), c(7L, 28L, 31L, 38L), c(13L, 18L, 32L), c(19L, 44L), c(3L, 
    8L, 16L), c(1L, 2L, 45L), 6L, c(0L, 4L), c(10L, 25L, 39L, 
    41L), c(22L, 34L)), group_sizes = c(1L, 5L, 2L, 3L, 1L, 6L, 
4L, 4L, 3L, 2L, 3L, 3L, 1L, 2L, 4L, 2L), biggest_group_size = 6L, labels = structure(list(
    SBU = c("APS", "APS", "ASG", "ASG", "ASG", "CS", "CS", "CS", 
    "ES", "ES", "INT", "LS", "LS", "LS", "SIS", "SIS"), Region = c("IATA I", 
    "IATA II", "IATA I", "IATA II", "IATA III", "IATA I", "IATA II", 
    "IATA III", "IATA I", "IATA II", "IATA I", "IATA I", "IATA II", 
    "IATA III", "IATA I", "IATA II")), row.names = c(NA, -16L
), class = "data.frame", vars = c("SBU", "Region"), drop = TRUE, .Names = c("SBU", 
"Region")))

Below is my code:

input1 <- "APS"
input2 <- NULL
input3 <- NULL

if (is.null(input1) & is.null(input2) & is.null(input3)) {SiteOTD$Colors <- "#003395"
} else if (!is.null(input1) & is.null(input2) & is.null(input3)) {SiteOTD$Colors <- ifelse(SiteOTD$SBU == input1,"#000000","#003395")}

highchart() %>%
  hc_yAxis_multiples(list(title = list(text = "%, OTD"),lineWidth = 0), list(title = list(text = "Qty, Volume"), opposite = TRUE)) %>% 
  hc_add_series(SiteOTD, "column", hcaes(x = Plant.Name, y = round(OTD,2)*100), name = "On Time Delivery", yAxis = 0, dataLabels = list(enabled = TRUE, fontSize = "0.5vh")) %>%
  hc_add_series(SiteOTD, "line", hcaes(x = Plant.Name, y = Shipments), name = "Volume", marker = "diamond", color = "#FF7900", yAxis = 1) %>%
  hc_xAxis(title = "Sites", categories = paste0(SiteOTD$Plant.Name,"-",SiteOTD$SBU), labels = list(step = 1, rotation = -60, style = list(fontSize = "1.0vh"))) %>%
  hc_tooltip(crosshairs = TRUE, shared = TRUE, headerFormat = "<b>{point.x}</b><br>") %>%
  hc_legend(enabled = FALSE) %>%
  hc_plotOptions(series = list(colorByPoint = TRUE, type = "column", colors = SiteOTD$Colors))

If you remove hc_plotOptions, the line series shows. If you keep it, colorByPoint works but the line series disappears.

1
I don't know much about R but maybe this demo in pure Highcharts (JS only) will help: jsfiddle.net/BlackLabel/u9qpdw03 - Kamil Kulig
It looks like they use {},{} to denote the two different series. I'm not sure how this converts to R though :/ - Kevin

1 Answers

1
votes

Figured it out! I can put the max in the hc_yAxis_multiples and in hc_plotOptions, instead of using series, I use column.

highchart() %>%
            hc_yAxis_multiples(list(title = list(text = "%, OTD"),lineWidth = 0, labels = list(format = "{value}%"), max = 100), list(title = list(text = "Qty, Volume"), opposite = TRUE)) %>%
            hc_xAxis(title = "Sites", categories = paste0(SiteOTD$Plant.Name,"-",SiteOTD$SBU), labels = list(step = 1, rotation = -60, style = list(fontSize = "1.0vh"))) %>%
            hc_add_series(SiteOTD, "column", hcaes(x = Plant.Name, y = round(OTD,2)*100), name = "On Time Delivery", yAxis = 0) %>%
            hc_add_series(SiteOTD, "line", hcaes(x = Plant.Name, y = Shipments), name = "Volume", marker = "diamond", color = "#FF7900", yAxis = 1) %>%
            hc_tooltip(crosshairs = TRUE, headerFormat = "<b>{point.x}</b><br>") %>%
            hc_legend(enabled = FALSE) %>%
            hc_plotOptions(column = list(colorByPoint = TRUE, colors = SiteOTD$Colors))

This removed the functionality of shared = TRUE in hc_tooltip which is slightly annoying though.