代码之家  ›  专栏  ›  技术社区  ›  Dan Dyer

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

  •  2
  • Dan Dyer  · 技术社区  · 16 年前

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

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

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

    我尝试过的事情:

    4 回复  |  直到 16 年前
        1
  •  4
  •   Duncan Jones    12 年前

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

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

    我使用的是JFreeChart v1.0.14。也许他们已经修复了一个错误 setAutoRangeType 既然这个问题最初发布了?

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

        2
  •  1
  •   Jared    16 年前

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

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

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

    如果我是一个perl程序员,我会这样写,只是为了让它更难阅读:P

    while(producingData) {
       this.produceData();
       domainAxis.setRange(
           (((count < 200) || allDataButton.isSelected()) ? 0 : count-200), count);
    
    }
    
        3
  •  0
  •   Dan Dyer    16 年前

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

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

    domainAxis.setRange(0, 200);
    

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

    if (!allDataButton.isSelected() && count == 200)
    {
        domainAxis.setAutoRange(true);
        domainAxis.setFixedAutoRange(200);
    }
    
        4
  •  0
  •   penguru    15 年前

    我尝试过的事情:

    调用setLowerBound无法播放 setRangeType(RangeType.POSITIVE) 似乎没什么区别。 有什么想法吗?

    你试过了吗 axis.setRange(0, 200);