Search code examples
rggplot2data-visualizationechartsecharts4r

geom_label() equivalent in {echarts4r}


Issue

I'm trying to produce a visualisation using {echarts4r} that involves plotting points with labels displayed on the chart itself, where the labels are unrelated to the position of the points. This sounds like it should be simple, but so far I haven't found any viable method of doing this and I'm beginning to wonder if it's even possible.

Desired output

Here is a minimal example. I will use {ggplot2} to demonstrate what I'd (roughly) like to reproduce:

data <- data.frame(
  date_eaten = as.Date(c("2020-01-01", "2020-01-02", "2020-01-03")),
  tastiness = c(5, 7, 10),
  fruit = c("apple", "orange", "mango")
)
data
#>   date_eaten tastiness  fruit
#> 1 2020-01-01         5  apple
#> 2 2020-01-02         7 orange
#> 3 2020-01-03        10  mango

library(ggplot2)

ggplot(data, aes(x = date_eaten, y = tastiness, label = fruit)) +
  geom_point() +
  geom_text(nudge_y = 0.2)

ggplot2 example

Attempt using e_labels()

This method is visually exactly what I want, however, it seems that there is no option to specify which columns to take the labels from.

library(echarts4r)

data %>% 
  e_chart(date_eaten) %>% 
  e_scatter(tastiness, symbol_size = 10) %>% 
  e_labels()

echarts4r try #1

Attempt using e_mark_point()

This option allows for more customisation, however this is not really a viable solution as it is very clunky and doesn't strictly 'link back' to the original data:

data %>% 
  e_chart(date_eaten) %>% 
  e_scatter(tastiness, symbol_size = 10) %>% 
  e_mark_point(data = list(
    xAxis = as.Date("2020-01-01"),
    yAxis = 5,
    value = "apple"
  )) %>% 
  e_mark_point(data = list(
    xAxis = as.Date("2020-01-02"),
    yAxis = 7,
    value = "orange"
  )) %>% 
  e_mark_point(data = list(
    xAxis = as.Date("2020-01-03"),
    yAxis = 10,
    value = "mango"
  ))

echarts4r try #2


Solution

  • I think this is the solution. Currently I'm not sure exactly how it works as documentation is a bit limited, but it seems to work:

    data %>% 
      e_chart(date_eaten) %>% 
      e_scatter(tastiness, symbol_size = 10, bind = fruit) %>% 
      e_labels(formatter = htmlwidgets::JS("
        function(params) {
          return(params.name)
        }
      "))
    

    echarts solution