Java 如何使用JFreeChart fixed auto range避免负值

Java 如何使用JFreeChart fixed auto range避免负值,java,swing,charts,graph,jfreechart,Java,Swing,Charts,Graph,Jfreechart,我有一个JFreeChart折线图,它在算法的每次迭代中动态更新一个数据点。因为数据点的数量可能很快变得非常大,所以我在域轴上使用了这种方法。这将图形限制为显示n个最近的迭代(在我的示例中为200个) 除了在前200次迭代中,这种方法工作得很好。问题是,在有200次迭代之前,轴包含负值(例如,在50次迭代之后,范围为-150到50)。负迭代没有意义。我希望轴从零开始,而不是负值。我怎样才能做到这一点 我不介意轴最初是从0到200(图表的右侧部分留空,直到绘图填充为止),还是从0到1开始并增长(以

我有一个JFreeChart折线图,它在算法的每次迭代中动态更新一个数据点。因为数据点的数量可能很快变得非常大,所以我在域轴上使用了这种方法。这将图形限制为显示n个最近的迭代(在我的示例中为200个)

除了在前200次迭代中,这种方法工作得很好。问题是,在有200次迭代之前,轴包含负值(例如,在50次迭代之后,范围为-150到50)。负迭代没有意义。我希望轴从零开始,而不是负值。我怎样才能做到这一点

我不介意轴最初是从0到200(图表的右侧部分留空,直到绘图填充为止),还是从0到1开始并增长(以便绘图始终延伸到图表的整个宽度)。两者都可以接受,尽管我有点偏爱前者

我尝试过的事情:

  • 调用setFixedAutoRange时效果不佳
  • 打电话似乎没什么区别

有什么想法吗?

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

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

domainAxis.setRange(0, 200);
在将数据添加到绘图的代码中,我检查是否是要添加的第200个值,如果是,我将范围切换到200的固定自动范围。这是可行的,尽管它有点笨重(特别是当我还必须检查用户是否选择了完全禁用固定窗口的选项并让它显示所有值时)


看起来您正在寻找一种解决方案,该解决方案涉及配置JFreeChart来为您完成这项工作,而不是手动设置范围

我没办法…但这里有一些其他丑陋的解决方案:p

您可以这样做(为伪代码感到抱歉):

while(生产数据){
这个.produceData();
如果(!allDataButton.isSelected()){
domainAxis.setRange((计数<200)?0:count-200),计数;
}否则{
domainAxis.setRange(0,计数);
}
}
如果我是一个perl程序员,我会这样写,只是为了让它更难阅读:p

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

}
while(生产数据){
这个.produceData();
domainAxis.setRange(
((count<200)| | allDataButton.isSelected())?0:count-200),count);
}
我尝试过的事情:

调用setLowerBound无法播放 与setFixedAutoRange配合得很好。使命感 setRangeType(RangeType.POSITIVE) 似乎没什么区别。 有什么想法吗


您是否尝试过axis.setRange(0200)

我遇到了同样的问题,我用以下方法解决了这个问题:

axis.setAutoRangeMinimumSize(100); // Ensures graph always shows at least 0-100.
axis.setRangeType(RangeType.POSITIVE);
我使用的是JFreeChart v1.0.14。也许他们已经修复了一个
setAutoRangeType
的bug,因为这个问题最初发布了


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

谢谢。这看起来比我的解决方案简单一点,因为它完全是通过setRange方法实现的。我后来发现JFreeChart的自动范围性能很差。每次添加数据点时,它都会在整个数据集中搜索最小值和最大值,以调整范围。您的解决方案(避免setAutoRange和setFixedAutoRange)不会遇到该问题。
while(producingData) {
   this.produceData();
   domainAxis.setRange(
       (((count < 200) || allDataButton.isSelected()) ? 0 : count-200), count);

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