docs: @Override protected void initGraphics() {
          super.initGraphics();
  
          matrix = PixelMatrixBuilder.create()
                                     .pixelShape(PixelShape.SQUARE)
                                     .useSpacer(true)
                                     .squarePixels(false)
                                     .colsAndRows(tile.getMatrixSize())
                                     .pixelOnColor(tile.getBarColor())
                                     .pixelOffColor(Helper.isDark(tile.getBackgroundColor()) ? tile.getBackgroundColor().brighter() : tile.getBackgroundColor().darker())
                                     .build();
  
          if (!tile.getChartData().isEmpty() && tile.getChartData().size() > 2) {
              matrix.setColsAndRows(tile.getChartData().size(), matrix.getRows());
          }
  
          chartEventListener = e -> updateMatrixWithChartData();
          tile.getChartData().forEach(chartData -> chartData.addChartDataEventListener(chartEventListener));
  
          chartDataListener = c -> {
              while (c.next()) {
                  if (c.wasAdded()) {
                      c.getAddedSubList().forEach(addedItem -> addedItem.addChartDataEventListener(chartEventListener));
                      if (!tile.getChartData().isEmpty() && tile.getChartData().size() > 2) {
                          matrix.setColsAndRows(tile.getChartData().size(), matrix.getRows());
                      }
                  } else if (c.wasRemoved()) {
                      c.getRemoved().forEach(removedItem -> removedItem.removeChartDataEventListener(chartEventListener));
                      if (!tile.getChartData().isEmpty() && tile.getChartData().size() > 2) {
                          matrix.setColsAndRows(tile.getChartData().size(), matrix.getRows());
                      }
                  }
              }
              updateMatrixWithChartData();
          };
          matrixListener    = e -> {
              if (tile.getChartData().isEmpty()) { return; }
              int       column      = e.getX();
              ChartData data        = tile.getChartData().get(column);
              String    tooltipText = new StringBuilder(data.getName()).append("\n").append(String.format(locale, formatString, data.getValue())).toString();
              Point2D popupLocation = new Point2D(e.getMouseScreenX() - selectionTooltip.getWidth() * 0.5, e.getMouseScreenY() - 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));
          };
          mouseHandler = e -> {
              final javafx.event.EventType<? extends MouseEvent> TYPE = e.getEventType();
              if (MouseEvent.MOUSE_CLICKED.equals(TYPE)) {
                  matrix.checkForClick(e);
              } else if (MouseEvent.MOUSE_MOVED.equals(TYPE)) {
                  selectionTooltip.hide();
              } else if (MouseEvent.MOUSE_EXITED.equals(TYPE)) {
                  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());
  
          selectionTooltip = new Tooltip("");
          selectionTooltip.setWidth(60);
          selectionTooltip.setHeight(48);
          Tooltip.install(matrix, selectionTooltip);
  
          getPane().getChildren().addAll(titleText, matrix, text);
      }