如何使用JFreeChart固定自动范围避免负值

时间:2009-01-29 16:52:00

标签: java swing charts graph jfreechart

我有一个JFreeChart线图,我的算法每次迭代都会动态更新一个数据点。由于数据点的数量可能很快变得非常大,我在域轴上使用了setFixedAutoRange(double)方法。这限制了图形显示n个最近的迭代(在我的情况下为200)。

除了前200次迭代之外,这种方法效果很好。问题在于,直到有200次迭代,轴包括负值(例如,在50次迭代之后,范围从-150到50)。负迭代毫无意义。我希望轴从零开始而不是负值。我怎样才能做到这一点?

我不介意轴是否最初从0变为200(图表的右侧部分留空,直到图表填满)或者是否从0到1开始并增长(以便绘图总是在图表的整个宽度上拉伸。要么是可以接受的,尽管我对前者略有偏好。

我尝试过的事情:

有什么想法吗?

4 个答案:

答案 0 :(得分:4)

我遇到了同样的问题,我解决了这个问题:

axis.setAutoRangeMinimumSize(100); // Ensures graph always shows at least 0-100.
axis.setRangeType(RangeType.POSITIVE);

我正在使用JFreeChart v1.0.14。也许他们已经修复了setAutoRangeType的错误,因为这个问题最初发布了?

这种方法的一个缺点是零值不可见。

答案 1 :(得分:1)

看起来您正在寻找一种解决方案,其中包括配置JFreeChart为您执行此操作,而不是手动设置范围。

我无能为力......但这里有一些其他丑陋的解决方案:P ....

你可以这样做(抱歉伪代码):

while(producingData) {
   this.produceData();
   if(!allDataButton.isSelected()) {
      domainAxis.setRange((count < 200) ? 0 : count-200), count);
    } else {
      domainAxis.setRange(0, count);
    }
}

如果我是一个编码员,我会这样写,只是为了让它更难以阅读:P

while(producingData) {
   this.produceData();
   domainAxis.setRange(
       (((count < 200) || allDataButton.isSelected()) ? 0 : count-200), count);

}

答案 2 :(得分:0)

我现在有一个可行的解决方案,虽然我仍然对更好的方法感兴趣,

最初,我将域轴的范围设置为0到200的固定范围:

domainAxis.setRange(0, 200);

在将数据添加到绘图的代码中,我检查它是否是正在添加的第200个值,如果是,我将范围切换到200的固定自动范围。这有效,尽管它是一个有点笨拙(特别是因为我还要检查用户是否选择了完全禁用固定窗口的选项并让它显示所有值)。

if (!allDataButton.isSelected() && count == 200)
{
    domainAxis.setAutoRange(true);
    domainAxis.setFixedAutoRange(200);
}

答案 3 :(得分:0)

  

我尝试过的事情:

     

调用setLowerBound不会播放   很好地与setFixedAutoRange。调用   setRangeType(RangeType.POSITIVE)   似乎没有任何区别。   有什么想法吗?

您是否尝试过axis.setRange(0, 200);