docs: @Override protected void initGraphics() {
          super.initGraphics();
  
          chartEventListener = e -> redraw();
          tile.getChartData().forEach(chartData -> chartData.addChartDataEventListener(chartEventListener));
  
          chartDataListener  = c -> {
              while (c.next()) {
                  if (c.wasAdded()) {
                      c.getAddedSubList().forEach(addedItem -> addedItem.addChartDataEventListener(chartEventListener));
                  } else if (c.wasRemoved()) {
                      c.getRemoved().forEach(removedItem -> removedItem.removeChartDataEventListener(chartEventListener));
                  }
              }
              drawChart();
              drawLegend();
          };
  
          clickHandler = e -> {
              double          x          = e.getX();
              double          y          = e.getY();
              double          startAngle = 90;
              double          angle      = 0;
              List<ChartData> dataList   = tile.isSortedData() ? tile.getChartData().stream().sorted(Comparator.comparingDouble(ChartData::getValue)).collect(Collectors.toList()) : tile.getChartData();
              int             noOfItems  = dataList.size();
              double          sum        = dataList.stream().mapToDouble(ChartData::getValue).sum();
              double          stepSize   = 360.0 / sum;
              double          barWidth   = chartCanvas.getWidth() * 0.1;
              double          ri         = outerRadius - barWidth * 0.5;
              double          ro         = outerRadius + barWidth * 0.5;
  
              for (int i = 0 ; i < noOfItems ; i++) {
                  ChartData data  = dataList.get(i);
                  double    value = data.getValue();
                  startAngle -= angle;
                  angle = value * stepSize;
                  boolean hit = Helper.isInRingSegment(x, y, centerX, centerY, ro, ri, startAngle, angle);
                  if (hit) {
                      String tooltipText = new StringBuilder(data.getName()).append("\n").append(String.format(locale, formatString, value)).toString();
  
                      Point2D popupLocation = new Point2D(e.getScreenX() - selectionTooltip.getWidth() * 0.5, e.getScreenY() - size * 0.025 - selectionTooltip.getHeight());
                      selectionTooltip.setText(tooltipText);
                      selectionTooltip.setX(popupLocation.getX());
                      selectionTooltip.setY(popupLocation.getY());
                      selectionTooltip.show(tile.getScene().getWindow());
  
                      tile.fireTileEvent(new TileEvent(EventType.SELECTED_CHART_DATA, data)); break;
                  }
              }
          };
          moveHandler  = e -> selectionTooltip.hide();
  
          titleText = new Text();
          titleText.setFill(tile.getTitleColor());
          Helper.enableNode(titleText, !tile.getTitle().isEmpty());
  
          text = new Text(tile.getText());
          text.setFill(tile.getTextColor());
          Helper.enableNode(text, tile.isTextVisible());
  
          chartCanvas = new Canvas(size * 0.9, tile.isTextVisible() ? height - size * 0.28 : height - size * 0.205);
          chartCtx    = chartCanvas.getGraphicsContext2D();
  
          legendCanvas = new Canvas(size * 0.225, tile.isTextVisible() ? height - size * 0.28 : height - size * 0.205);
          legendCtx    = legendCanvas.getGraphicsContext2D();
  
          selectionTooltip = new Tooltip("");
          selectionTooltip.setWidth(60);
          selectionTooltip.setHeight(48);
          Tooltip.install(chartCanvas, selectionTooltip);
  
          getPane().getChildren().addAll(titleText, legendCanvas,text, chartCanvas);
      }