protected JFreeChart createDialChart() throws JRException {

    JRMeterPlot jrPlot = (JRMeterPlot) getPlot();

    // get data for diagrams
    DialPlot dialPlot = new DialPlot();
    if (getDataset() != null) {
      dialPlot.setDataset((ValueDataset) getDataset());
    }
    StandardDialFrame dialFrame = new StandardDialFrame();
    dialFrame.setForegroundPaint(Color.BLACK);
    dialFrame.setBackgroundPaint(Color.BLACK);
    dialFrame.setStroke(new BasicStroke(1f));
    dialPlot.setDialFrame(dialFrame);

    DialBackground db = new DialBackground(ChartThemesConstants.TRANSPARENT_PAINT);
    dialPlot.setBackground(db);
    ScaledDialScale scale = null;
    int dialUnitScale = 1;
    Range range = convertRange(jrPlot.getDataRange());
    if (range != null) {
      double bound = Math.max(Math.abs(range.getUpperBound()), Math.abs(range.getLowerBound()));
      dialUnitScale = ChartThemesUtilities.getScale(bound);

      double lowerBound =
          ChartThemesUtilities.getTruncatedValue(range.getLowerBound(), dialUnitScale);
      double upperBound =
          ChartThemesUtilities.getTruncatedValue(range.getUpperBound(), dialUnitScale);

      scale =
          new ScaledDialScale(lowerBound, upperBound, 210, -240, (upperBound - lowerBound) / 6, 1);
      if ((lowerBound == (int) lowerBound
              && upperBound == (int) upperBound
              && scale.getMajorTickIncrement() == (int) scale.getMajorTickIncrement())
          || dialUnitScale > 1) {
        scale.setTickLabelFormatter(new DecimalFormat("#,##0"));
      } else if (dialUnitScale == 1) {

        scale.setTickLabelFormatter(new DecimalFormat("#,##0.0"));
      } else if (dialUnitScale <= 0) {
        scale.setTickLabelFormatter(new DecimalFormat("#,##0.00"));
      }
    } else {
      scale = new ScaledDialScale();
    }
    scale.setTickRadius(0.9);
    scale.setTickLabelOffset(0.16);
    JRFont tickLabelFont = jrPlot.getTickLabelFont();
    Integer defaultBaseFontSize =
        (Integer) getDefaultValue(defaultChartPropertiesMap, ChartThemesConstants.BASEFONT_SIZE);
    Font themeTickLabelFont =
        getFont(
            (JRFont)
                getDefaultValue(
                    defaultPlotPropertiesMap, ChartThemesConstants.PLOT_TICK_LABEL_FONT),
            tickLabelFont,
            defaultBaseFontSize);
    scale.setTickLabelFont(themeTickLabelFont);
    scale.setMajorTickStroke(new BasicStroke(1f));
    scale.setMinorTickStroke(new BasicStroke(0.7f));
    scale.setMajorTickPaint(Color.BLACK);
    scale.setMinorTickPaint(Color.BLACK);
    scale.setTickLabelsVisible(true);
    scale.setFirstTickLabelVisible(true);
    dialPlot.addScale(0, scale);

    List intervals = jrPlot.getIntervals();
    if (intervals != null && intervals.size() > 0) {
      int size = Math.min(3, intervals.size());

      int colorStep = 0;
      if (size > 3) colorStep = 255 / (size - 3);

      for (int i = 0; i < size; i++) {
        JRMeterInterval interval = (JRMeterInterval) intervals.get(i);
        Range intervalRange = convertRange(interval.getDataRange());
        double intervalLowerBound =
            ChartThemesUtilities.getTruncatedValue(intervalRange.getLowerBound(), dialUnitScale);
        double intervalUpperBound =
            ChartThemesUtilities.getTruncatedValue(intervalRange.getUpperBound(), dialUnitScale);

        Color color =
            i < 3
                ? (Color) ChartThemesConstants.AEGEAN_INTERVAL_COLORS.get(i)
                : new Color(255 - colorStep * (i - 3), 0 + colorStep * (i - 3), 0);
        ScaledDialRange dialRange =
            new ScaledDialRange(
                intervalLowerBound,
                intervalUpperBound,
                interval.getBackgroundColor() == null ? color : interval.getBackgroundColor(),
                15f);
        dialRange.setInnerRadius(0.5);
        dialRange.setOuterRadius(0.5);
        dialPlot.addLayer(dialRange);
      }
    }
    JRValueDisplay display = jrPlot.getValueDisplay();

    String displayVisibility =
        display != null && getChart().hasProperties()
            ? getChart()
                .getPropertiesMap()
                .getProperty(DefaultChartTheme.PROPERTY_DIAL_VALUE_DISPLAY_VISIBLE)
            : "false";

    if (Boolean.valueOf(displayVisibility).booleanValue()) {
      ScaledDialValueIndicator dvi = new ScaledDialValueIndicator(0, dialUnitScale);
      dvi.setBackgroundPaint(ChartThemesConstants.TRANSPARENT_PAINT);
      //			dvi.setFont(JRFontUtil.getAwtFont(jrFont).deriveFont(10f).deriveFont(Font.BOLD));
      dvi.setOutlinePaint(ChartThemesConstants.TRANSPARENT_PAINT);
      dvi.setPaint(Color.WHITE);

      String pattern = display.getMask() != null ? display.getMask() : "#,##0.####";
      if (pattern != null) dvi.setNumberFormat(new DecimalFormat(pattern));
      dvi.setRadius(0.15);
      dvi.setValueAnchor(RectangleAnchor.CENTER);
      dvi.setTextAnchor(TextAnchor.CENTER);
      // dvi.setTemplateValue(Double.valueOf(getDialTickValue(dialPlot.getValue(0),dialUnitScale)));
      dialPlot.addLayer(dvi);
    }

    String label =
        getChart().hasProperties()
            ? getChart().getPropertiesMap().getProperty(DefaultChartTheme.PROPERTY_DIAL_LABEL)
            : null;

    if (label != null) {
      if (dialUnitScale < 0)
        label =
            new MessageFormat(label)
                .format(new Object[] {String.valueOf(Math.pow(10, dialUnitScale))});
      else if (dialUnitScale < 3) label = new MessageFormat(label).format(new Object[] {"1"});
      else
        label =
            new MessageFormat(label)
                .format(new Object[] {String.valueOf((int) Math.pow(10, dialUnitScale - 2))});

      JRFont displayFont = jrPlot.getValueDisplay().getFont();
      Font themeDisplayFont =
          getFont(
              (JRFont)
                  getDefaultValue(defaultPlotPropertiesMap, ChartThemesConstants.PLOT_DISPLAY_FONT),
              displayFont,
              defaultBaseFontSize);

      String[] textLines = label.split("\\n");
      for (int i = 0; i < textLines.length; i++) {
        DialTextAnnotation dialAnnotation = new DialTextAnnotation(textLines[i]);
        dialAnnotation.setFont(themeDisplayFont);
        dialAnnotation.setPaint(Color.BLACK);
        dialAnnotation.setRadius(Math.sin(Math.PI / 6.0) + i / 10.0);
        dialAnnotation.setAnchor(TextAnchor.CENTER);
        dialPlot.addLayer(dialAnnotation);
      }
    }

    DialPointer needle = new ScaledDialPointer(dialUnitScale, 0.047);

    needle.setVisible(true);
    needle.setRadius(0.7);
    dialPlot.addLayer(needle);

    DialCap cap = new DialCap();
    cap.setRadius(0.05);
    cap.setFillPaint(Color.BLACK);
    cap.setOutlinePaint(ChartThemesConstants.TRANSPARENT_PAINT);
    dialPlot.setCap(cap);

    JFreeChart jfreeChart =
        new JFreeChart(
            (String) evaluateExpression(getChart().getTitleExpression()),
            null,
            dialPlot,
            getChart().getShowLegend() == null ? false : getChart().getShowLegend().booleanValue());

    // Set all the generic options
    configureChart(jfreeChart, getPlot());

    jfreeChart.setBackgroundPaint(ChartThemesConstants.TRANSPARENT_PAINT);
    jfreeChart.setBorderVisible(false);

    return jfreeChart;
  }