JFreeChart直方图,在缩放时具有恒定的箱数

时间:2012-05-16 14:42:59

标签: java user-interface charts jfreechart histogram

我想制作一个JFreeChart直方图,在放大和缩小时保持恒定数量的分档。例如,你可以通过缩小的方式看到12年,每年会有1个垃圾箱。当您放大一点时,您可能会看到12个月,每个月都会有一个垃圾箱。进一步放大可能每天每小时都有1个垃圾箱,等等。它们不一定是这么干净的箱子大小,但你明白了。

我正在使用HistogramDataset.addSeries将我的数据添加到直方图中。 bins参数是整个集合的分箱数,不考虑缩放。

我发现我可以使用ChartPanel并覆盖其zoom方法。在这里,我可能会改变垃圾箱的数量。但是,我很难弄清楚哪里可以改变垃圾箱的数量以及应该改变什么。

编辑:

我感兴趣的是这个问题的一部分,我认为这对解决方案至关重要:

  1. 如何最好地告诉用户放大了。我目前的做法是覆盖zoom
  2. 如何确定用户缩放的范围。我还不确定该怎么做。
  3. 如何更改数据模型中的分档数量,以便缩放保持相同数量的显示的分档。
  4. 在某些情况下,我的最终目标是创建Google财务样式控件: Google Finance style control for Java?

2 个答案:

答案 0 :(得分:2)

重载缩放功能很吸引人,但也许令人困惑。作为替代方案,请考虑添加更新数据模型的控件,如此example所示。 enum的实例对填充JComboBox特别方便,如here所示。

答案 1 :(得分:1)

回答上面的个人问题:

  1. 我继续覆盖ChartPanel班级的缩放。
  2. 为了确定用户缩放到的范围,我使用了下面的windowToRatioratioToModel函数,因为缩放功能是给定窗口坐标的。
  3. 要更改分档数,我实际上保持分箱数相同,只需更改传入图表的数据集。我使用SortedMap作为我的数据模型,我可以轻松地从中获取subMap。
  4. 功能:

    private double windowToRatio(double window) {
        Rectangle2D scaledDataArea = getScreenDataArea();
        return (window - scaledDataArea.getMinX()) / scaledDataArea.getWidth();
    }
    
    private double ratioToModel(double ratio) {
        Range domainRange = getChart().getXYPlot().getDomainAxis().getRange();
        return domainRange.getLowerBound() + ratio * domainRange.getLength();
    }