docs: private void init() {
          _smoothed                  = true;
          _chartType                 = ChartType.LINE;
          _subDivisions              = 16;
          _snapToTicks               = false;
          _selectorFillColor         = Color.WHITE;
          _selectorStrokeColor       = Color.RED;
          _selectorSize              = 10;
          _decimals                  = 2;
          _interactive               = true;
          _tooltipTimeout            = 2000;
          formatString               = "%.2f";
          strokePaths                = new ArrayList<>();
          clickHandler               = e -> select(e);
          endOfTransformationHandler = e -> selectorTooltip.hide();
          seriesListener             = change -> {
              while (change.next()) {
                  if (change.wasAdded()) {
                      change.getAddedSubList().forEach(addedItem -> {
                          final Series<X, Y> series     = addedItem;
                          final Path         strokePath = (Path) ((Group) series.getNode()).getChildren().get(1);
                          final Path         fillPath   = (Path) ((Group) series.getNode()).getChildren().get(0);
                          fillPath.addEventHandler(MouseEvent.MOUSE_PRESSED, clickHandler);
                          strokePath.addEventHandler(MouseEvent.MOUSE_PRESSED, clickHandler);
                          strokePaths.add(strokePath);
  
                          series.getData().forEach(data -> data.YValueProperty().addListener(o -> layoutPlotChildren()));
                      });
                  } else if (change.wasRemoved()) {
                      change.getRemoved().forEach(removedItem -> {
                          final Series<X, Y> series     = removedItem;
                          final Path         strokePath = (Path) ((Group) series.getNode()).getChildren().get(1);
                          final Path         fillPath   = (Path) ((Group) series.getNode()).getChildren().get(0);
                          fillPath.removeEventHandler(MouseEvent.MOUSE_PRESSED, clickHandler);
                          strokePath.removeEventHandler(MouseEvent.MOUSE_PRESSED, clickHandler);
                          strokePaths.remove(strokePath);
                      });
                  }
              }
          };
  
          // Add selector to chart
          selector = new Circle();
          selector.setFill(_selectorFillColor);
          selector.setStroke(_selectorStrokeColor);
          selector.setOpacity(0);
  
          selectorTooltip = new Tooltip("");
          Tooltip.install(selector, selectorTooltip);
  
          FadeTransition fadeIn = new FadeTransition(Duration.millis(100), selector);
          fadeIn.setFromValue(0);
          fadeIn.setToValue(1);
  
          timeBeforeFadeOut = new PauseTransition(Duration.millis(_tooltipTimeout));
  
          FadeTransition fadeOut = new FadeTransition(Duration.millis(100), selector);
          fadeOut.setFromValue(1);
          fadeOut.setToValue(0);
  
          fadeInFadeOut = new SequentialTransition(fadeIn, timeBeforeFadeOut, fadeOut);
          fadeInFadeOut.setOnFinished(endOfTransformationHandler);
  
          chartPlotBackground = getChartPlotBackground();
          chartPlotBackground.widthProperty().addListener(o -> resizeSelector());
          chartPlotBackground.heightProperty().addListener(o -> resizeSelector());
          chartPlotBackground.layoutYProperty().addListener(o -> resizeSelector());
  
          Path horizontalGridLines = getHorizontalGridLines();
          if (null != horizontalGridLines) { horizontalGridLines.setMouseTransparent(true); }
  
          Path verticalGridLines = getVerticalGridLines();
          if (null != verticalGridLines) { verticalGridLines.setMouseTransparent(true); }
  
          getChartChildren().addAll(selector);
      }