Добавление текста, не связанного с разделами, в легенду в JFreeChart PieChart

#java #jfreechart

#ява #jfreechart ( бесплатная карта ) #java #jfreechart

Вопрос:

Есть ли способ включить некоторый произвольный текст в легенду в диаграмме JFreeChart PieChart? Я знаю, что можно назначить PieSectionLabelGenerator , чтобы настроить метки каждого из разделов круга, которые отображаются в легенде диаграммы.

Я хотел бы вставить в легенду некоторый текст, совершенно не связанный ни с одним из разделов pie, например, «Легенда».

Я строю Диаграмму следующим образом:

 private JFreeChart constructChart() {
    List<Object[]> llistaValorsArr;

    ParamsDTO dto = (ParamsDTO) getModelObject();
    List llistaValors = statisticsService.getStatistics(dto);
    if (!llistaValors.isEmpty() amp;amp; !(llistaValors.get(0) instanceof Object[])){
        llistaValorsArr = new ArrayList<Object[]>();
        llistaValorsArr.add(new Object[]{llistaValors.get(0), ""});
    }
    else{
        llistaValorsArr = (List<Object[]>) llistaValors;
    }
    DefaultPieDataset dataSet = new DefaultPieDataset();
    for (Object[] objects : llistaValorsArr) {
        dataSet.setValue((Comparable) objects[1], (Number)objects[0]);
    }

    String title = "Total: "    new Double(DatasetUtilities.calculatePieDatasetTotal(dataSet)).intValue();
    JFreeChart chart = ChartFactory.createPieChart(title, dataSet, true, false, true);

    final PiePlot plot = (PiePlot) chart.getPlot();
    plot.setForegroundAlpha(0.5f);
    plot.setNoDataMessage("No data");

    PieSectionLabelGenerator labelGenerator = new StandardPieSectionLabelGenerator("{0} - {1} ({2})"){
        @Override
        protected Object[] createItemArray(PieDataset dataset, Comparable key) {
            // TODO Auto-generated method stub
            Object[] array = super.createItemArray(dataset, key);
            array[0] = getEntityLabel(key);
            return array;
        }
    };
    plot.setLabelGenerator(labelGenerator);
    plot.setLegendLabelGenerator(labelGenerator);        
    //plot.setStartAngle(290);
    boolean circular = true;
    plot.setCircular(circular);
    return chart;
}
  

ОБНОВЛЕНИЕ: я только что узнал JFreeChart.addSubtitle() , надеясь, что это позволит разместить его чуть выше легенды, но это просто добавит подзаголовок рядом с заголовком диаграммы.

ОБНОВЛЕНИЕ 2: я пытался поместить a TextTitle внутри LegendTitle оболочки, но, похоже, во время построения диаграммы оно равно null.

 LegendTitle legend = chart.getLegend();
BlockContainer container = legend.getWrapper();
container.add(new TextTitle("Legend"));
  

На самом деле добавить текст «Легенды» для украшения легенды не должно быть так сложно.

Ответ №1:

Глядя на исходный код org.jfree.chart.JFreeChart и видя, что addLegend() это не более чем addSubtitle() за кулисами, все указывает на то, что этого следует достичь с помощью addSubtitle() .

Глядя на ту часть, где org.jfree.chart.JFreeChart добавляется свой собственный LegendTitle элемент, мы можем найти, какие настройки JFreeChart используются для размещения легенды здесь.

Итак, решение состоит в том, чтобы добавить, например, TextTitle в Chart аналогичным образом. Соответствующая настройка здесь setPosition(RECTANGLE.BOTTOM) .

 TextTitle legendText = new TextTitle("This is LEGEND: ");
legendText.setPosition(RectangleEdge.BOTTOM);
chart.addSubtitle(legendText);
  

Ответ №2:

У меня есть многоосевая диаграмма, которую я недавно построил, и я разработал эту схему, чтобы различать периоды времени, которые я отображал, используя линейную диаграмму, чтобы показать предыдущие 12 месяцев, наложенные на столбчатую диаграмму, показывающую текущие 12 месяцев.

Если вы хотите добавить текст перед другими вашими сериями, чтобы ваша легенда выглядела примерно так:

Предыдущие 12 месяцев: * начисления * дополнительные * наличные Текущие 12 месяцев: * начисления * дополнительные * наличные

где * — это формы / цвета вашей серии. (я бы включил рисунок, но у меня недостаточно очков репутации… это мой первый пост в stack overflow =) )

Тогда я бы предложил добавить серию и сделать ее первой серией в ваших диаграммах (series 0). Назовите эту серию любым текстом, который вы хотите отобразить (мой пример — «Предыдущие 12 месяцев: «. Затем вы можете использовать некоторую Java для настройки серии 0, чтобы данные не отображались на диаграмме, но вы все равно получите метку в легенде.

Это то, что мой метод custmoize для создания невидимой линии / формы линейной диаграммы:

 @Override
public void customize(JFreeChart chart, JRChart jasperChart) {
    LineAndShapeRenderer renderer = (LineAndShapeRenderer) chart.getCategoryPlot().getRenderer();

    renderer.setSeriesLinesVisible(0, false);
    renderer.setSeriesShapesVisible(0, false);

    etc ....
}
  

Если это диаграмма другого типа, например гистограмма, тогда просто сделайте цвет серии 0 таким, чтобы он соответствовал фону, и присвоите ему значение, подобное 1. Обратите внимание, что это добавляет больше места между столбцами! Дополнительное пространство между столбцами на моей диаграмме сделало ее лучше, но это не было бы хорошим решением, если вам нравится интервал между столбцами вашей диаграммы.

Не уверен, что это полезно для ответа на первоначальный вопрос, но это еще один вариант для тех, кто хочет добавить текст в легенду своих диаграмм.

Наслаждайтесь!

Комментарии:

1. Спасибо за ваш первый пост. Я просмотрел его, и он выглядит хорошо выполненным. Дайте мне знать, где я могу найти изображение, чтобы включить его (или подождите некоторое время, пока вы не наберете репутацию)

Ответ №3:

Другой возможностью является создание класса, реализующего интерфейс org.jfree.chart.LegendItemSource , который предоставляет все ваши дополнительные элементы легенды. Затем вы добавляете свой собственный LegendItemSource в свой LegendTitle объект (единственным другим источником элемента является PieChart).

 chart.getLegend().setSources(sourcesContainingTheOriginalAndYourNewOne);
  

Если вы хотите контролировать, где размещать элементы легенды или в каком порядке каждого источника элемента, вы можете переопределить LegendTitle.