1

我想制作一个 JFreeChart 直方图,在放大和缩小时保持恒定数量的 bin。例如,也许缩小后您可以看到 12 年,并且每年会有 1 个 bin。当您再放大一点时,您可能会看到 12 个月,并且每个月都会有一个 bin。进一步放大可能每天、每小时等有 1 个垃圾箱。它们不必是如此干净的垃圾箱大小,但你明白了。

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

我观察到我可以使用 ChartPanel 并覆盖它的缩放方法。在这里,我可能会改变垃圾箱的数量。但是,我很难弄清楚在哪里可以更改垃圾箱的数量以及应该将其更改为什么。

编辑:

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

  1. 如何最好地告诉用户已缩放。我目前的方法是覆盖zoom.
  2. 如何确定用户缩放到的范围。我仍然不确定该怎么做。
  3. 如何更改数据模型中的 bin 数量,以便缩放保持显示的bin 数量相同。

在某些情况下,我的最终目标是创建一个 Google 财务样式控件: Java 的 Google 财务样式控件?

4

2 回答 2

2

重载缩放功能很吸引人,但可能令人困惑。作为替代方案,请考虑添加一个更新数据模型的控件,如本示例所示。an 的实例enum对于填充 a 特别方便JComboBox,如下所示

于 2012-05-16T18:40:20.480 回答
1

要回答我上面的个人问题:

  1. 我继续覆盖ChartPanel类的缩放。
  2. 为了确定用户缩放到的范围,我使用了下面的windowToRatioandratioToModel函数,因为缩放函数给出了窗口坐标。
  3. 为了更改 bin 的数量,我实际上保持 bin 的数量相同,只是更改了传递到图表中的数据集。我SortedMap为我的数据模型使用了一个我可以很容易地从中获取 subMap 的数据模型。

功能:

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();
}
于 2012-06-13T16:54:46.633 回答