【问题标题】:How to avoid negative values with JFreeChart fixed auto range如何使用 JFreeChart 固定自动范围避免负值
【发布时间】:2009-01-29 16:51:59
【问题描述】:

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

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

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

我尝试过的事情:

有什么想法吗?

【问题讨论】:

    标签: java swing charts graph jfreechart


    【解决方案1】:

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

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

    我正在使用 JFreeChart v1.0.14。自从问题最初发布以来,也许他们已经修复了 setAutoRangeType 的错误?

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

    【讨论】:

      【解决方案2】:

      您似乎正在寻找一种解决方案,该解决方案涉及配置 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);
      
      }
      

      【讨论】:

      • 谢谢。这看起来比我的解决方案简单一点,因为它是根据 setRange 方法完成的。
      • 我后来发现 JFreeChart 的自动范围表现不佳。每次添加数据点时,它都会搜索整个数据集的最小值和最大值以调整范围。您的解决方案(避免 setAutoRange 和 setFixedAutoRange)不会遇到该问题。
      【解决方案3】:

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

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

      domainAxis.setRange(0, 200);
      

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

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

      【讨论】:

        【解决方案4】:

        我尝试过的事情:

        调用 setLowerBound 不起作用 很好地与 setFixedAutoRange。打电话 setRangeType(RangeType.POSITIVE) 似乎没有任何区别。 有什么想法吗?

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-24
          • 2013-12-27
          相关资源
          最近更新 更多