【问题标题】:Map dynamic dataset to different axis in JFreeChart将动态数据集映射到 JFreeChart 中的不同轴
【发布时间】:2016-08-29 04:18:46
【问题描述】:

这是我目前的代码(更新):

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、m/s和lux。

一切正常,但它并没有按照我的要求准确地映射系列。

如您所见,蓝线和绿线没有与第二和第三轴映射。

有什么想法让它发挥作用吗?

您的帮助将不胜感激。

// 更新

我试过用这个,但结果是一样的:

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

【问题讨论】:

    标签: java swing jfreechart timeserieschart


    【解决方案1】:

    在您的片段中,我看到三个轴和一个包含三个系列的数据集。您对mapDatasetToRangeAxis() 的调用似乎假定了三个不同的数据集。正如这个相关的example 中所建议的那样,您可能想要这样的东西:

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

    该方法假定三个系列具有线性相关的比例,您必须相应地缩放各个轴,如 here 所示。您可以尝试单独的数据集,但我没有尝试过。

    附录:根据您的更新,这三个数据集似乎不相称。相反,创建三个单独的数据集。在您的图表工厂中使用第一个,使用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);
    

    【讨论】:

    • List&lt;Integer&gt; axes = Arrays.asList(0, 1, 2); plot.mapDatasetToRangeAxes(0, axes); 它不能按我的意愿工作。三个系列都有独立的秤怎么办?
    • 我看到 °C 和 w/m^2。 “空气”的单位是什么?如需更具体的指导,请编辑您的问题以包含 minimal reproducible example,以显示您修改后的方法。
    • 已编辑。顺便说一句,有没有办法重置数据集中的所有系列?
    • 您可以将每个轴的上限和下限设置为相应的定义值。我在DynamicTimeSeriesCollection 中没有看到重置方法。
    • 更新了更多信息。您的帮助将不胜感激,垃圾神
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多