我使用Jfreechart API 1.0.8生成TimeSeriesChart(折线图)。
当我生成图表时,我面临着重叠的问题。 在这里,我试图通过使用带有StandardXYItemLabelGenerator的XYLineAndShapeRenderer来显示渲染点(图形渲染点)。
显示点时,数据点与生成的折线图(图形)重叠。 我把X轴作为时间,y轴作为组织的收入,我在这里使用折线图。
我正在展示如下所述的要点。
通过使用“renderer.setBasePositiveItemLabelPosition”方法,全局我在设置xyplot渲染图表内的图形点(数据点)的位置,同时考虑渲染的“ItemLabelAnchor”。
我在这里发送示例代码:
chart = ChartFactory.createTimeSeriesChart("", "", "", newxyseries, false, true, false);
renderer = new XYLineAndShapeRenderer();
renderer = (XYLineAndShapeRenderer) chart.getXYPlot().getRenderer();
renderer.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator("{2}", monthDate, formatSymbol));
renderer.setBaseItemLabelsVisible(true);
renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE3, TextAnchor.TOP_RIGHT));
chart.getXYPlot().setRenderer(renderer);
但是当我使用Excel工具的Ms-office生成图表时,没有标签重叠的问题,这些点以有效的方式显示而没有任何重叠。
答案 0 :(得分:0)
JFreeChart不对项目标签进行任何重叠检测。这将是一个很棒的功能,但没有人编写代码来实现它。
答案 1 :(得分:0)
您必须通过定义您自己的算法或逻辑来避免标签重叠,因为随着图表不断增长,标签将开始重叠。 关键是使某些或替代标签透明,以免发生重叠 例如在下面的 P.O.C 中,只绘制了 35 个标签,但图表的刻度将保持不变,只是标签减少了
CategoryAxis domainAxis = plot.getDomainAxis();
CategoryLabelPositions pos = domainAxis.getCategoryLabelPositions();
double size = plot.getCategories().size();
double occurence = Math.ceil(plot.getCategories().size() / 20);
double interval = Math.ceil(plot.getCategories().size() / 20);
for (int i = 1; i <= plot.getCategories().size(); i++) {
if (plot.getCategories().size() > 35) {
if(plot.getCategories().size()>35 && plot.getCategories().size()<250) {
if(i%8==0){
String cat_Name = (String) plot.getCategories().get(i-1);
} else{
String cat_Names = (String) plot.getCategories().get(i-1);
domainAxis.setTickLabelPaint(cat_Names, new Color(0,0,0,0));
}
}else if(plot.getCategories().size()>250){
[![enter image description here][1]][1]
if (i == occurence) {
String cat_Name = (String) plot.getCategories().get(i - 1);
if (occurence + interval >= size) {
// occurence=size;
} else {
occurence = occurence + interval;
}
} else {
String cat_Names = (String) plot.getCategories().get(i - 1);
domainAxis.setTickLabelPaint(cat_Names, new Color(0, 0, 0, 0));
}
}
}
下面的行将使标签透明
domainAxis.setTickLabelPaint(cat_Names, new Color(0,0,0,0));