docs: @Override protected void initGraphics() {
          super.initGraphics();
  
          averagingListener = o -> handleEvents("AVERAGING_PERIOD");
  
          timeFormatter = DateTimeFormatter.ofPattern("HH:mm", tile.getLocale());
  
          state = State.CONSTANT;
  
          if (tile.isAutoScale()) tile.calcAutoScale();
  
          low            = tile.getMaxValue();
          high           = tile.getMinValue();
          movingAverage  = tile.getMovingAverage();
          noOfDatapoints = tile.getAveragingPeriod();
          dataList       = new LinkedList<>();
  
          // To get smooth lines in the chart we need at least 4 values
          if (noOfDatapoints < 4) throw new IllegalArgumentException("Please increase the averaging period to a value larger than 3.");
  
          graphBounds = new Rectangle(PREFERRED_WIDTH * 0.05, PREFERRED_HEIGHT * 0.5, PREFERRED_WIDTH * 0.9, PREFERRED_HEIGHT * 0.45);
  
          titleText = new Text(tile.getTitle());
          titleText.setFill(tile.getTitleColor());
          Helper.enableNode(titleText, !tile.getTitle().isEmpty());
  
          valueText = new Text(String.format(locale, formatString, tile.getValue()));
          valueText.setBoundsType(TextBoundsType.VISUAL);
          valueText.setFill(tile.getValueColor());
          Helper.enableNode(valueText, tile.isValueVisible());
  
          valueUnitFlow = new TextFlow(valueText);
          valueUnitFlow.setTextAlignment(TextAlignment.RIGHT);
  
          highText = new Text();
          highText.setTextOrigin(VPos.BOTTOM);
          highText.setFill(tile.getValueColor());
  
          lowText = new Text();
          lowText.setTextOrigin(VPos.TOP);
          lowText.setFill(tile.getValueColor());
  
          text = new Text(tile.getText());
          text.setTextOrigin(VPos.TOP);
          text.setFill(tile.getTextColor());
  
          timeSpanText = new Text("");
          timeSpanText.setTextOrigin(VPos.TOP);
          timeSpanText.setFill(tile.getTextColor());
          Helper.enableNode(timeSpanText, !tile.isTextVisible());
  
          referenceLine = new Line();
          referenceLine.getStrokeDashArray().addAll(3d, 3d);
          referenceLine.setVisible(false);
  
          pathElements = new ArrayList<>(noOfDatapoints);
          pathElements.add(0, new MoveTo());
          for (int i = 1 ; i < noOfDatapoints ; i++) { pathElements.add(i, new LineTo()); }
  
          sparkLine = new Path();
          sparkLine.getElements().addAll(pathElements);
          sparkLine.setFill(null);
          sparkLine.setStroke(tile.getBarColor());
          sparkLine.setStrokeWidth(PREFERRED_WIDTH * 0.0075);
          sparkLine.setStrokeLineCap(StrokeLineCap.ROUND);
          sparkLine.setStrokeLineJoin(StrokeLineJoin.ROUND);
  
          dot = new Circle();
          dot.setFill(tile.getBarColor());
          dot.setVisible(false);
  
          triangle = new Path();
          triangle.setStroke(null);
          triangle.setFill(state.color);
          indicatorPane = new StackPane(triangle);
  
          changeText = new Label(String.format(locale, "%." + tile.getTickLabelDecimals() + "f", (tile.getCurrentValue() - tile.getReferenceValue())));
          changeText.setTextFill(state.color);
          changeText.setAlignment(Pos.CENTER_RIGHT);
  
          changePercentageText = new Text(new StringBuilder().append(String.format(locale, "%." + tile.getTickLabelDecimals() + "f", (tile.getCurrentValue() / tile.getReferenceValue() * 100.0) - 100.0)).append("\u0025").toString());
          changePercentageText.setFill(state.color);
  
          changePercentageFlow = new TextFlow(indicatorPane, changePercentageText);
          changePercentageFlow.setTextAlignment(TextAlignment.RIGHT);
  
          getPane().getChildren().addAll(titleText, valueUnitFlow, sparkLine, dot, referenceLine, highText, lowText, timeSpanText, text, changeText, changePercentageFlow);
      }