Как избежать отрицательных значений с фиксированным автоматическим диапазоном JFreeChart - PullRequest
2 голосов
/ 29 января 2009

У меня есть линейный график JFreeChart, который динамически обновляется с одной точкой данных для каждой итерации моего алгоритма. Поскольку число точек данных может быстро стать очень большим, я использовал метод setFixedAutoRange (double) на оси домена. Это ограничивает график отображением n самых последних итераций (в моем случае 200).

Это работает хорошо, за исключением первых 200 итераций. Проблема заключается в том, что до тех пор, пока не будет 200 итераций, ось содержит отрицательные значения (например, после 50 итераций диапазон составляет от -150 до 50). Отрицательные итерации не имеют смысла. Я бы хотел, чтобы ось начиналась с нуля, а не с отрицательного значения. Как мне этого добиться?

Я не возражаю против того, будет ли ось изначально изменяться от 0 до 200 (при этом правая часть диаграммы будет оставаться пустой, пока график не заполнит ее), или она будет начинаться с 0 до 1 и будет расти (так, чтобы график всегда растягивается по всей ширине графика). Любой из них был бы приемлемым, хотя я предпочитаю первое.

Вещи, которые я пробовал:

Есть идеи?

Ответы [ 4 ]

4 голосов
/ 03 апреля 2013

Я столкнулся с той же проблемой, с которой решил:

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

Я использую JFreeChart v1.0.14. Возможно, они исправили ошибку с setAutoRangeType, так как вопрос был первоначально опубликован?

Недостатком этого подхода является то, что нулевые значения не видны.

1 голос
/ 30 января 2009

Похоже, вы ищете решение, которое включает в себя настройку 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);

}
0 голосов
/ 27 октября 2009

Вещи, которые я пробовал:

Вызов setLowerBound не воспроизводится хорошо с setFixedAutoRange. призвание setRangeType (RangeType.POSITIVE) кажется, не имеет никакого значения. Есть идеи?

Вы пробовали axis.setRange(0, 200);

0 голосов
/ 29 января 2009

У меня сейчас есть рабочее решение, хотя мне все еще интересны лучшие подходы,

Изначально я установил диапазон оси домена на фиксированный диапазон от 0 до 200:

domainAxis.setRange(0, 200);

В коде, который добавляет данные к графику, я проверяю, добавляется ли 200-е значение, и если это так, я переключаю диапазон на фиксированный автоматический диапазон 200. Это работает, хотя это немного неуклюже (тем более, что я также должен проверить, выбрал ли пользователь опцию, чтобы полностью отключить фиксированное окно и отобразить все значения).

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