Сопоставьте динамический набор данных с другой осью в JFreeChart

Это мой код на данный момент (обновлено):

public DynamicTimeSeriesCollection dataset;
private static final String TITLE = "Stripchart";
private static final int COUNT = 3 * 60;
private static final int TEMP_MIN = -10;
private static final int TEMP_MAX = 50;
private static final int AIR_MIN = 0;
private static final int AIR_MAX = 20;
private static final int INSO_MIN = 0;
private static final int INSO_MAX = 1;
public void draw(Data data) {
    float[] newData = new float[3];
    newData[0] = (float) data.getTemp();
    newData[1] = (float) data.getAir();
    newData[2] = (float) data.getInso();
    dataset.advanceTime();
    dataset.appendData(newData);
}

private ChartPanel createChart() {
    dataset = new DynamicTimeSeriesCollection(3, COUNT, new Second());
    dataset.setTimeBase(new Second(0, 0, 0, 1, 1, 2016));
    dataset.addSeries(new float[1], 0, "Temperature");
    dataset.addSeries(new float[1], 1, "Air");
    dataset.addSeries(new float[1], 2, "Insolation");
    final JFreeChart result = ChartFactory.createTimeSeriesChart(
            TITLE, "hh:mm:ss", " ", dataset, true, true, false);
    final XYPlot plot = result.getXYPlot();
    ValueAxis domain = plot.getDomainAxis();
    domain.setAutoRange(true);
    NumberAxis temp = new NumberAxis("Temperature");
    NumberAxis air = new NumberAxis("Air");
    NumberAxis inso = new NumberAxis("Insolation");

    plot.setRangeAxis(0, temp);
    plot.setRangeAxisLocation(0, AxisLocation.BOTTOM_OR_LEFT);
    plot.setRangeAxis(1, air);
    plot.setRangeAxisLocation(1, AxisLocation.BOTTOM_OR_LEFT);
    plot.setRangeAxis(2, inso);
    plot.setRangeAxisLocation(2, AxisLocation.BOTTOM_OR_LEFT);
    List<Integer> axes = Arrays.asList(0, 1, 2);
    plot.mapDatasetToRangeAxes(0, axes);
    temp.setRange(TEMP_MIN, TEMP_MAX);
    air.setRange(AIR_MIN, AIR_MAX);
    inso.setRange(INSO_MIN, INSO_MAX);

    ChartPanel chartPanel = new ChartPanel(result);

    return chartPanel;
}

Единицы: °C, м/с и люкс соответственно.

Все работает нормально, но не отображает серию так точно, как я хочу.

введите здесь описание изображения

Как видите, синяя и зеленая линии не сопоставлены со второй и третьей осью.

Любые идеи, чтобы заставить его работать?

Ваша помощь будет оценена по достоинству.

// Обновлено :

Я пробовал использовать это, но результат тот же:

List<Integer> axes = Arrays.asList(0, 1, 2);
plot.mapDatasetToRangeAxes(0, axes);

person Forrest    schedule 29.08.2016    source источник


Ответы (1)


В вашем фрагменте я вижу три оси и один набор данных с тремя сериями. Ваши обращения к mapDatasetToRangeAxis() предполагает наличие трех разных наборов данных. Как предлагается в этом связанном примере, вам может понадобиться что-то вроде этого:

List<Integer> axes = Arrays.asList(0, 1, 2);
plot.mapDatasetToRangeAxes(0, axes);

Подход предполагает, что три ряда имеют линейно зависимые масштабы, и вам придется соответствующим образом масштабировать отдельные оси, как показано здесь. Вы можете попробовать отдельные наборы данных, но я не пробовал.

Приложение: Судя по вашему обновлению, три набора данных несоизмеримы. Вместо этого создайте три отдельных набора данных. Используйте первый в своей фабрике диаграмм, используйте setDataset(), чтобы установить два других и соответствующим образом сопоставить их:

final JFreeChart result = ChartFactory.createTimeSeriesChart(
    TITLE, "hh:mm:ss", " ", createDatasetTemp(), true, true, false);
…
plot.setDataset(1, createDatasetAir());
plot.setDataset(2, createDatasetInso());
plot.setRangeAxis(0, temp);
plot.setRangeAxisLocation(0, AxisLocation.BOTTOM_OR_LEFT);
plot.setRangeAxis(1, air);
plot.setRangeAxisLocation(1, AxisLocation.BOTTOM_OR_LEFT);
plot.setRangeAxis(2, inso);
plot.setRangeAxisLocation(2, AxisLocation.BOTTOM_OR_LEFT);
plot.mapDatasetToRangeAxis(0, 0);
plot.mapDatasetToRangeAxis(1, 1);
plot.mapDatasetToRangeAxis(2, 2);
person trashgod    schedule 29.08.2016
comment
List<Integer> axes = Arrays.asList(0, 1, 2); plot.mapDatasetToRangeAxes(0, axes); Это не работает так, как я хочу. Что мне делать, если три серии имеют независимые шкалы? - person Forrest; 29.08.2016
comment
Я вижу °C и вес/м^2. Какие единицы измерения воздуха? Для получения более конкретных указаний отредактируйте свой вопрос, включив в него минимально воспроизводимый пример, демонстрирующий ваш пересмотренный подход. - person trashgod; 29.08.2016
comment
Отредактировано. Кстати, есть ли способ сбросить все серии в наборе данных? - person Forrest; 29.08.2016
comment
Вы можете просто установить верхнюю и нижнюю границы каждой оси на соответствующие определенные значения. Я не вижу метода сброса в DynamicTimeSeriesCollection. - person trashgod; 29.08.2016
comment
обновлено с дополнительной информацией. Твоя помощь будет оценена, трэшбод - person Forrest; 30.08.2016
comment
А, я понимаю, что вы имеете в виду; попробуйте отдельные наборы данных, как указано выше. - person trashgod; 30.08.2016