Как я могу нарисовать диаграмму с TimeSeries в jfreecharts, которая не интерполирует для меня значения даты?

Я пытаюсь отобразить данные на XYBarChart с помощью JFreechart. На диаграмме должны отображаться моменты времени вместе с количеством. Таким образом, если пользователь выбирает 25 января и 25 марта в качестве диапазона, диаграмма должна отображать данные между этими датами через определенные интервалы:

если пользователь выбирает ЧАС, я создаю коллекцию за каждый час с 25 января по 10 марта вместе с соответствующим счетчиком. Естественно, это довольно большая коллекция. Если пользователь выбирает МЕСЯЦ, то он должен видеть 3 месяца (и только 3 записи в коллекции). Если пользователь выберет ДЕНЬ, то он увидит только около 60 записей. Понимаете?

Когда я создаю диаграмму (используя приведенный ниже код для создания набора данных), она «интерполирует» значения. Если я выберу часы, он будет показывать данные по дням с большим количеством столбцов между днями (например, 24 маленьких столбика в течение дня). Если я выберу месяцы, у меня все равно будут дни на 2 месяца, но я получу один гигантский блок, охватывающий все дни месяца. Если я выберу ДЕНЬ, все будет хорошо.

Как я могу заставить jfreecharts перестать интерполировать значения и просто нарисовать диаграмму с сопоставлением 1: 1 с тем, какие данные я ей даю. Если я дам ему две записи на 2 месяца и дам ему RegularTimePeriod для Month.class, покажите только две полосы с двумя метками и двумя значениями. Если я дам ему 1000 часов в течение нескольких месяцев, то отображать каждый час с меткой и счетчиком и так далее ...

TimeSeries timeSeries = new TimeSeries(title, "Blah", "blah", clazz);  
// clazz is one of Day.class, Month.class, Hour.class 
for (final ReportRecord reportRecord : records) {
 int count = reportRecord.getCount();
 Date start = reportRecord.getDateRange().getStart();
 RegularTimePeriod period = null;
 switch (type) {
  case DAY: period = new Day(start);  break;
  case MONTH: period = new Month(start); break; 
  case HOUR: period = new Hour(start); break;
 }
 timeSeries.add(new TimeSeriesDataItem(period, count));
}
return new TimeSeriesCollection(timeSeries);

Спасибо, Джош


person Community    schedule 26.09.2009    source источник


Ответы (1)


Мне кажется, jfreechart делает то, что вы просили. Например, когда вы говорите:

«Если я выберу часы, он будет показывать данные по дням с большим количеством столбцов между днями (например, 24 маленьких столбика в течение дня)».

Введенный вами код добавляет элемент в коллекцию на каждый час, поэтому уместно использовать отдельную маленькую полосу для каждого часа.

Если вы измените логику добавления коллекции, чтобы добавить значение только в то время, которое вы решите (скажем, один раз в день в полночь), она должна создать только одну полосу на диаграмме для рассматриваемого дня.

Раньше я просто вставлял значения с точностью до секунды (не то чтобы вам нужна была такая точность), а jfreechart позаботится обо всем остальном, в зависимости от выбранного вами масштаба времени (программно или интерактивно).

as in:

        TimeSeriesCollection dataset = new TimeSeriesCollection();
        TimeSeries series = new TimeSeries("Basal", Second.class);
        for (BasalRate basal : pInsulin.basals) {
            Second lSecond = new Second(basal.getTime());
            series.addOrUpdate(lSecond, basal.getValue());
        }
        dataset.addSeries(series);
person Community    schedule 28.09.2009