将动态数据集映射到 JFreeChart 中的不同轴
Map dynamic dataset to different axis in 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、m/s和勒克斯
一切正常,但它没有完全按照我的意愿映射系列。
如你所见,蓝线和绿线没有映射到第二和第三轴。
有什么让它工作的想法吗?
我们将不胜感激。
// 已更新 :
我试过用这个,但结果是一样的:
List<Integer> axes = Arrays.asList(0, 1, 2);
plot.mapDatasetToRangeAxes(0, axes);
在你的片段中,我看到三个轴和一个包含三个系列的数据集。您对 mapDatasetToRangeAxis()
appear to assume three distinct datasets. As suggested in this related 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);
这是我目前的代码(已更新):
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和勒克斯
一切正常,但它没有完全按照我的意愿映射系列。
如你所见,蓝线和绿线没有映射到第二和第三轴。
有什么让它工作的想法吗?
我们将不胜感激。
// 已更新 :
我试过用这个,但结果是一样的:
List<Integer> axes = Arrays.asList(0, 1, 2);
plot.mapDatasetToRangeAxes(0, axes);
在你的片段中,我看到三个轴和一个包含三个系列的数据集。您对 mapDatasetToRangeAxis()
appear to assume three distinct datasets. As suggested in this related 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);