Точность процентного значения в круговой диаграмме JFreeChart - PullRequest
0 голосов
/ 13 сентября 2018

Я использую круговую диаграмму библиотеки JFreeChart для своих нужд.И я хочу отобразить процент с суммарными значениями в круговой диаграмме.Итак, я искал через Google.И я нашел это решение , на которое ответил @ trashgod.

Теперь, согласно его ответу, я создал класс, который выглядит следующим образом:

import java.awt.Color;
import java.awt.Dimension;
import java.text.DecimalFormat;

import javax.swing.JFrame;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.PieSectionLabelGenerator;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.PiePlot;
import org.jfree.data.general.DefaultPieDataset;

public class TestPieChart {
    private static final String KEY1 = "Datum 1";
    public static final String KEY2 = "Datum 2";

    public static void main(String[] args) {
        DefaultPieDataset dataset = new DefaultPieDataset();
        dataset.setValue(KEY1, 45045); //49
        dataset.setValue(KEY2, 53955); //151

        JFreeChart someChart = ChartFactory.createPieChart(
            "Header", dataset, true, true, false);
        PiePlot plot = (PiePlot) someChart.getPlot();
        plot.setSectionPaint(KEY1, Color.green);
        plot.setSectionPaint(KEY2, Color.red);
        plot.setExplodePercent(KEY1, 0.10);
        plot.setSimpleLabels(true);

        PieSectionLabelGenerator gen = new StandardPieSectionLabelGenerator(
            "{0}: {1} ({2})", new DecimalFormat("0"), new DecimalFormat("0%"));
        plot.setLabelGenerator(gen);

        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new ChartPanel(someChart) {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(400, 300);
            }
        });
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);

    }
}

Что дает вывод следующим образом:

enter image description here

В каком процентном соотношении было 55% и 46%, всего 101% (Поскольку он принимает верхний предел для обоих значений, таких как 54,5, а затем 55)

Но в то же время, если я беру значение для KEY1 как 49 и KEY2 как 151то это дает точный результат следующим образом:(Сумма обоих в этом случае составляет 100%)enter image description here

Итак, мой вопрос: почему JFreeChart выполняет разные для разных значений?и есть ли решение, чтобы это исправить (общий процент не будет пересекать 100)?

1 Ответ

0 голосов
/ 13 сентября 2018

Процентное вычисление, выполненное абстрактным родителем генератора меток, видимое здесь , и округление по умолчанию для форматера, обсуждаемое здесь , являются правильными.При желании вы можете изменить точность отображаемого процента , указав другой percentFormat при построении StandardPieSectionLabelGenerator:

PieSectionLabelGenerator gen = new StandardPieSectionLabelGenerator(
    "{0}: {1} ({2})", new DecimalFormat("0"), new DecimalFormat("0.0%"));

image

Обратите внимание, что 45.5% + 54.5% = 100%.

...