Как избежать отрицательных значений с фиксированным автоматическим диапазоном JFreeChart

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

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

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

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

Любые идеи?


person Dan Dyer    schedule 29.01.2009    source источник


Ответы (4)


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

}
person Jared    schedule 29.01.2009
comment
Спасибо. Это выглядит немного проще, чем мое решение, потому что все это делается с помощью метода setRange. - person Dan Dyer; 30.01.2009
comment
С тех пор я обнаружил, что автоматический диапазон JFreeChart работает плохо. Каждый раз, когда вы добавляете точку данных, выполняется поиск минимального и максимального значений по всему набору данных, чтобы скорректировать диапазон. Ваше решение (избегая setAutoRange и setFixedAutoRange) не страдает от этой проблемы. - person Dan Dyer; 01.02.2009

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

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

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

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

person Duncan Jones    schedule 03.04.2013

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

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

domainAxis.setRange(0, 200);

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

if (!allDataButton.isSelected() && count == 200)
{
    domainAxis.setAutoRange(true);
    domainAxis.setFixedAutoRange(200);
}
person Dan Dyer    schedule 29.01.2009

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

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

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

person penguru    schedule 27.10.2009