multiple series in Highcharter R stacked barchart

2019-02-17 06:30发布

问题:

After going through the highcharter package documentation, visiting JBKunst his website, and looking into list.parse2(), I still can not solve the problem. Problem is as follows: Looking to chart multiple series from a data.frame into a stacked barchart, series can be anywhere from 10 - 30 series. For now the series have been defined as below, but clearly there has to be an easier way, for example passing a list or melted data.frame to the function hc_series similar as what can be done with ggplot2.

Below the code with dummy data

mydata <- data.frame(A=runif(1:10),
               B=runif(1:10),
               C=runif(1:10))

highchart() %>% 
hc_chart(type = "column") %>% 
hc_title(text = "MyGraph") %>% 
hc_yAxis(title = list(text = "Weights")) %>% 
hc_plotOptions(column = list(
   dataLabels = list(enabled = FALSE),
   stacking = "normal",
   enableMouseTracking = FALSE)
   ) %>% 
hc_series(list(name="A",data=mydata$A),
        list(name="B",data=mydata$B),
        list(name="C",data=mydata$C))

Which produces this chart:

回答1:

a good approach to add multiples series in my opinion is use hc_add_series_list (oc you can use a for loop) which need a list of series (a series is for example list(name="A",data=mydata$A).

As you said, you need to melt/gather the data, you can use tidyr package:

mynewdata <- gather(mydata)

Then you'll need to group the data by key argument to create the data for each key/series. Here you can use dplyr package:

mynewdata2 <- mynewdata %>%
  # we change the key to name to have the label in the legend
  group_by(name = key) %>%  
  # the data in this case is simple, is just .$value column
  do(data = .$value) 

This data frame will contain two columns and the 2nd colum will contain the ten values for each row.

Now you need this information in a list. So we need to parse using list.parse3 instad of list.parse2 beacuse preserve names like name or data.

series <- list.parse3(mynewdata2)

So finally change:

hc_series(list(name="A",data=mydata$A),
    list(name="B",data=mydata$B),
    list(name="C",data=mydata$C))

by:

hc_add_series_list(series)

Hope this is clear.



标签: r highcharts