放大时,JFreeChart Tick Labels消失

时间:2013-10-22 10:54:19

标签: java charts zoom jfreechart

我正在使用JFreeChart创建具有“对数”y轴的XYLineCharts,但我正面临一个我似乎无法解决的错误。

在某些情况下,我的值​​非常低(在一种情况下,y轴值介于4.5e-8到1.7112之间)。我使用XY轴的对数轴在XYLineChart上绘制这些值(并在y轴上使用LogAxis.createLogTickUnits(Locale.ENGLISH)和.setExpTickLabelsFlag(true)来创建指数刻度单位)。我将范围界限从4.5e-8设置为1.712并且可以清楚地看到这些点,即使图表在y轴上仅显示1个值:1e0。

这没关系,但是当我进一步缩放到图表时,y轴上的刻度标签会自动消失。如果我在y轴值上放大太多,这也会在使用NumberAxis的图表中发生。基本上,如果y轴值的差异变得非常小(超过8位小数),标签就会消失。

如何在JFreeChart中覆盖zoom()方法,以便在图表缩放时强制它显示刻度标签/名称。

如果有人有任何建议或解决方案,请尽快通知我,因为我需要尽快实施。

感谢。

2 个答案:

答案 0 :(得分:0)

在两种情况下触发缩放事件:鼠标滚轮和弹出菜单命令。在这两种情况下,都会调用“ChartPanel”(zoomInBoth,zoomInDomain,zoomInRange等)的“zoom *”方法,因此根据您的需要,您可以覆盖这些方法。

我认为覆盖这些方法不是一个好主意。也许有一些关于轴的属性的配置你可以改变,以便刻度标签/名称在缩放后不会消失。您可以查阅源代码。

答案 1 :(得分:0)

我知道它已经有一段时间但是我遇到了同样的问题,因为当放大时,刻度单位变得太大而且没有标签显示。

我所做的是听取AxisChange并计算一个新的滴答单元,然后将其设置为轴。

以下是一个例子:

chart.getXYPlot().getDomainAxis().addChangeListener(new AxisChangeListener() {
        @Override
        public void axisChanged(AxisChangeEvent e) {
            // TODO Auto-generated method stub
            Date lowerB = ((DateAxis)e.getAxis()).getMinimumDate();
            Date upperB = ((DateAxis)e.getAxis()).getMaximumDate();
            setTick(((DateAxis)e.getAxis()),calculateTick(lowerB,upperB));
        }
    });

在setTick方法中要小心,检查tick是否已经改变,否则由于事件将导致无限循环。这可以通过使用"缩放监听器来解决。而不是AxiChanged听众,但我没有找到任何。