Как установить количество меток, отображаемых на круговой диаграмме? - PullRequest
0 голосов
/ 27 февраля 2019

Я получил 78 меток на круговой диаграмме, как эта картинка.

too_many_labels_in_pie_chart

И я хочу показывать только верхние 3 метки в порядке убывания.

Как я могу это сделать?

1 Ответ

0 голосов
/ 27 февраля 2019

Создайте пользовательский PieSectionLabelGenerator и верните null, когда не нравится отображать метку.

Пример

public class PieMaximumLabelsGenerator extends StandardPieSectionLabelGenerator {

    private static final long serialVersionUID = 1385777973353453096L;
    private int nrLabels;
    private boolean showFirst;

    /**
     * A custom label generator to show only limited numbers of labels
     * @param nrLabels, number of labels to show
     * @param showFirst, if true, show first labels otherwise show the last
     */
    public PieMaximumLabelsGenerator(int nrLabels, boolean showFirst){
        this.nrLabels = nrLabels;
        this.showFirst = showFirst;

    }

    @Override
    public String generateSectionLabel(PieDataset dataset, Comparable key) {
        int index = dataset.getIndex(key);
        if (showFirst){
            if (index>=nrLabels){
                return null; //no more lables if index is above
            }
        }else{
            if (index<dataset.getItemCount()-nrLabels){
                return null; //no labels if index is not enough
            }
        }
        return super.generateSectionLabel(dataset, key);
    }
}

Затем установите это на свой график

((PiePlot) chart.getPlot()).setLabelGenerator(new  PieMaximumLabelsGenerator(3, false));

Вывод , аналогичный пример, но с отображением первых 5 значений вместо последних 3, следовательно, ((PiePlot) chart.getPlot()).setLabelGenerator(new PieMaximumLabelsGenerator(5, true));

output


Однако я предпочитаю отображать метку, если угол дуги среза достаточно велик.Это можно сделать, собрав итоговые значения элементов на диаграмме, а затем рассчитав угол, используя Number value = dataset.getValue(key); в generateSectionLabel, чтобы получить текущий угол (размер) среза.

...