将与节无关的文本添加到JFreeChart PieChart中的Legend中

问题描述 投票:3回答:3

是否可以在JFreeChart PieChart的图例中包含一些任意文本?我知道可以分配PieSectionLabelGenerator来自定义出现在图表图例上的每个Pie区域的标签。

我想在图例中插入一些文本,这些文本与任何饼图部分都完全无关,例如“传奇”。

我正在这样构建图表:

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

    ParamsDTO dto = (ParamsDTO) getModelObject();
    List llistaValors = statisticsService.getStatistics(dto);
    if (!llistaValors.isEmpty() && !(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;
}

UPDATE:我刚刚发现JFreeChart.addSubtitle(),希望它可以将其放置在图例的上方,但只会在图表标题旁边添加一个字幕。

UPDATE 2:我试图将JFreeChart.addSubtitle()放置在TextTitle的包装内,但在图表构建时它似乎为空。

LegendTitle

添加“传奇”文本来装饰图例应该没有那么复杂。

java jfreechart
3个回答
8
投票

查看LegendTitle legend = chart.getLegend(); BlockContainer container = legend.getWrapper(); container.add(new TextTitle("Legend")); 的源代码,发现org.jfree.chart.JFreeChart只不过是幕后的org.jfree.chart.JFreeChart,一切都表明应该使用addLegend()来实现。

查看addSubtitle()添加其自己的addSubtitle()项目的部分,我们可以找到org.jfree.chart.JFreeChart用于放置图例org.jfree.chart.JFreeChart的设置。

因此,解决方案是以类似方式将LegendTitle添加到JFreeChart。此处的相关设置是here

TextTitle

3
投票

我最近建立了一个多轴图表,并提出了此方案来区分我所显示的时间段,使用折线图显示施加在前12个月的条形图,而不是显示当前12个月的条形图。

如果要在其他系列之前添加文本,以使图例看起来像这样:

前12个月:*费用*调整额*现金当前12个月:*费用*调整额*现金

其中*是系列的形状/颜色。 (我会附上一张图片,但是我没有足够的代表点……这是我第一次向堆栈溢出=)))

然后,我建议添加一个序列,并使其成为图表中的第一个序列(序列0)。将该系列命名为您想要显示的任何文本(我的示例是“ Previous 12 Months:”。然后,您可以使用一些Java来定制系列0,这样数据就不会显示在图表上,但是您仍然可以在图例中获得标签。

这是使线形图线/形状不可见的自定义方法:

Chart

如果是其他类型的图表(如条形图,则只需将系列0的颜色设置为与背景匹配,并为其赋予一个类似1的值即可。请注意,这确实在条形图之间增加了更多空间!我的图表上的条形图之间的多余空间使它看起来更好,但是如果您希望图表条形图之间的间距不是一个好的解决方案。

不确定这是否对回答最初的问题有用,但对于希望在图表图例中添加文本的人来说,这是另一种选择。

享受!


1
投票

[另一种可能性是创建一个实现接口setPosition(RECTANGLE.BOTTOM)的类,该类提供所有其他图例项。然后,将自己的TextTitle legendText = new TextTitle("This is LEGEND: "); legendText.setPosition(RectangleEdge.BOTTOM); chart.addSubtitle(legendText); 添加到@Override public void customize(JFreeChart chart, JRChart jasperChart) { LineAndShapeRenderer renderer = (LineAndShapeRenderer) chart.getCategoryPlot().getRenderer(); renderer.setSeriesLinesVisible(0, false); renderer.setSeriesShapesVisible(0, false); etc .... } 对象(唯一的其他项源是PieChart)。

org.jfree.chart.LegendItemSource

如果要控制将图例项放置在何处或每个项源的顺序,可以覆盖LegendTitle。

© www.soinside.com 2019 - 2024. All rights reserved.