Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将与节无关的文本添加到JFreeChart PieChart的图例中_Java_Jfreechart - Fatal编程技术网

Java 将与节无关的文本添加到JFreeChart PieChart的图例中

Java 将与节无关的文本添加到JFreeChart PieChart的图例中,java,jfreechart,Java,Jfreechart,有没有办法在JFreeChart图表的图例中包含任意文本?我知道可以指定一个PieSectionLabelGenerator,以自定义图表图例上显示的每个饼图部分的标签 我想在图例中插入一些与任何饼图部分完全无关的文本,例如“图例” 我正在构建这样的图表: private JFreeChart constructChart() { List<Object[]> llistaValorsArr; ParamsDTO dto = (ParamsDTO) getModel

有没有办法在JFreeChart图表的图例中包含任意文本?我知道可以指定一个
PieSectionLabelGenerator
,以自定义图表图例上显示的每个饼图部分的标签

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

我正在构建这样的图表:

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;
}

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

查看的源代码,看到
addLegend()
只不过是
addSubtitle()
幕后,一切都表明这应该使用
addSubtitle()
实现

查看添加了自己的
LegendTitle
项的部分,我们可以找到放置图例的设置
JFreeChart

因此,解决方案是以类似的方式向
图表添加
TextTitle
。这里的相关设置是
setPosition(RECTANGLE.BOTTOM)


另一种可能是创建一个实现接口
org.jfree.chart.LegendItemSource
的类,该接口提供所有其他图例项。然后将自己的
LegendItemSource
添加到
LegendTitle
对象中(唯一的其他项目源是PieChart)


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

我最近创建了一个多轴图表,并提出了此方案,以区分我显示的时间段,使用折线图显示前12个月,而条形图显示当前12个月

如果要在其他系列之前添加文字,以便图例显示如下:

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

其中*是系列的形状/颜色。(我本来会包括一张图片,但我没有足够的代表点…这是我第一次发布stack overflow=)

然后我建议添加一个系列,并将其作为图表中的第一个系列(系列0)。将此系列命名为您想要显示的任何文本(我的示例是“前12个月:”。然后您可以使用一些java自定义系列0,以便数据不会显示在图表上,但您仍然可以在图例中获得标签

这就是我的customize方法使折线图线条/形状不可见的原因:

@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的值。请注意,这确实会在条形图之间添加更多的空间!我的图表上条形图之间的额外空间使其看起来更好,但如果您喜欢图表条形图之间的间距,这将不是一个好的解决方案

不确定这是否有助于回答最初的问题,但对于任何希望添加图表图例文本的人来说,这是另一个选项


享受!

谢谢你的第一篇帖子。我已经看过了,看起来做得很好。请告诉我在哪里可以找到包含它的图片(或者等待一段时间,直到你积累了rep)
TextTitle legendText = new TextTitle("This is LEGEND: ");
legendText.setPosition(RectangleEdge.BOTTOM);
chart.addSubtitle(legendText);
chart.getLegend().setSources(sourcesContainingTheOriginalAndYourNewOne);
@Override
public void customize(JFreeChart chart, JRChart jasperChart) {
    LineAndShapeRenderer renderer = (LineAndShapeRenderer) chart.getCategoryPlot().getRenderer();

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

    etc ....
}