渲染器标签点(数据点)的xy图与jfreechart的TimeSeriesChart的折线图重叠

时间:2014-07-04 06:45:12

标签: jfreechart

我使用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生成图表时,没有标签重叠的问题,这些点以有效的方式显示而没有任何重叠。

2 个答案:

答案 0 :(得分:0)

JFreeChart不对项目标签进行任何重叠检测。这将是一个很棒的功能,但没有人编写代码来实现它。

答案 1 :(得分:0)

enter image description here您必须通过定义您自己的算法或逻辑来避免标签重叠,因为随着图表不断增长,标签将开始重叠。 关键是使某些或替代标签透明,以免发生重叠 例如在下面的 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));