JFreeChart饼图中的百分比精度问题

时间:2018-09-13 12:49:18

标签: java jfreechart

我需要使用JFreeChart库的饼图。
我想在饼图中显示百分比与总价值。所以,我搜索了谷歌。我发现this solution由@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 :(得分:2)

标签生成器的抽象父级执行的百分比计算(见here)和格式化程序的默认舍入(如here所述)都是正确的。如果需要,可以在构造StandardPieSectionLabelGenerator时通过指定其他percentFormat来更改显示的百分比的精度:

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

image

请注意,45.5% + 54.5% = 100%