有没有办法在JFreeChart PieChart中的图例中包含一些任意文本?我知道可以指定一个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;
}
更新:我刚发现JFreeChart.addSubtitle()
,希望它可以将它放在图例上方,但它只会在图表的标题旁边添加一个字幕。
更新2 :我一直在尝试在TextTitle
的包装中放置一个LegendTitle
,但在图表构建时它似乎为空。
LegendTitle legend = chart.getLegend();
BlockContainer container = legend.getWrapper();
container.add(new TextTitle("Legend"));
添加“图例”文字来装饰图例应该不会那么复杂。
答案 0 :(得分:8)
查看org.jfree.chart.JFreeChart
的源代码,并看到addLegend()
仅仅是幕后的addSubtitle()
,一切都表明应该使用addSubtitle()
来实现这一点。
查看org.jfree.chart.JFreeChart
添加自己的LegendTitle
项的部分,我们可以找到用于放置图例here的设置JFreeChart
。
因此,解决方案是以类似的方式向TextTitle
添加Chart
。此处的相关设置为setPosition(RECTANGLE.BOTTOM)
。
TextTitle legendText = new TextTitle("This is LEGEND: ");
legendText.setPosition(RectangleEdge.BOTTOM);
chart.addSubtitle(legendText);
答案 1 :(得分:3)
我有一个我最近建立的多轴图表,并提出了这个方案,以区分我使用折线图显示的时间段,以显示过去12个月强加于显示当前12个月的条形图。
如果您想在其他系列之前添加文字,以便您的图例看起来像这样:
过去12个月:*费用* adj *现金当前12个月:*费用* adj *现金
其中*是你的系列的形状/颜色。 (我会包含一张照片,但我没有足够的重复点......这是我的第一篇关于堆栈溢出的帖子=))
然后我建议添加一个系列并将其作为图表中的第一个系列(系列0)。将此系列命名为您要显示的任何文本(我的示例为“上一个12个月:”。然后您可以使用一些java来自定义系列0,以便数据不会显示在图表上,但您仍然可以在图例中获得标签
这是我使用线条图线条/形状不可见的保密方法:
@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的值。注意,这确实增加了条之间的空间!我图表上条形图之间的额外空间使它看起来更好,但如果您喜欢图表条之间的间距,这不是一个好的解决方案。
不确定这对于回答最初的问题是否有用,但对于任何想要在其图表图例中添加文字的人来说,这是另一种选择。
享受!
答案 2 :(得分:1)
另一种可能性是创建一个实现接口org.jfree.chart.LegendItemSource
的类,它提供所有其他图例项。然后将自己的LegendItemSource
添加到LegendTitle
对象中(唯一的其他项源是PieChart)。
chart.getLegend().setSources(sourcesContainingTheOriginalAndYourNewOne);
如果您想控制图例项目的放置位置或每个项目源的顺序,您可以覆盖LegendTitle。