我不知道我理解得很好,所以当你想要抽取数据时,我会谈谈这种情况。
最好的解决方案是重新采样您的输入数据和时间向量。
但如果你想简单一点,你可以尝试这样的事情:
例子
此示例将始终生成LineChart
具有 20 个节点的 a,与您输入数组具有多少数据点无关。
注意:这个解决方案远不是你能拥有的最好的,并且严重依赖于输入数据向量具有相同的时间向量。时间向量的步长固定也影响结果。
public class ChartingApp extends Application {
@Override
public void start(Stage stage) throws Exception {
final NumberAxis xAxis = new NumberAxis();
final NumberAxis yAxis = new NumberAxis();
final LineChart<Number, Number> lineChart = new LineChart<Number, Number>(xAxis, yAxis);
// Size of the input data
int dataCount = 777;
// One X axis two Y axis
double[] xValues = new double[dataCount];
double[] y1Values = new double[dataCount];
double[] y2Values = new double[dataCount];
// Generate some initial data
Random randomGenerator = new Random();
for (int i = 0; i < dataCount; i++) {
xValues[i] = i;
y1Values[i] = randomGenerator.nextInt(200);
y2Values[i] = randomGenerator.nextInt(200);
}
// Amount of nodes to display
int valueCountToDisplay = 20;
Series<Number, Number> series1 = new Series<Number, Number>();
Series<Number, Number> series2 = new Series<Number, Number>();
// The first element is always added
series1.getData().add(new Data<Number, Number>(xValues[0], y1Values[0]));
series2.getData().add(new Data<Number, Number>(xValues[0], y2Values[0]));
// Generate the inner nodes
double elementToPick = Math.floor((dataCount - 2) / (valueCountToDisplay - 2));
for (int i = 1; i < dataCount - 1; i++) {
if (i % elementToPick == 0) {
series1.getData().add(new Data<Number, Number>(xValues[i], y1Values[i]));
series2.getData().add(new Data<Number, Number>(xValues[i], y2Values[i]));
}
}
// The last element is always added
series1.getData().add(new Data<Number, Number>(xValues[dataCount - 1], y1Values[dataCount - 1]));
series2.getData().add(new Data<Number, Number>(xValues[dataCount - 1], y2Values[dataCount - 1]));
Scene scene = new Scene(lineChart, 800, 600);
lineChart.getData().addAll(series1, series2);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
结果是:

背后的逻辑可以总结如下:
double[] createSparseArray(double[] inputData, int arraySize) {
List<Double> sparseList = new ArrayList<Double>();
sparseList.add(inputData[0]);
double elementToPick = Math.floor((inputData.length - 2) / (arraySize - 2));
for (int i = 1; i < inputData.length - 1; i++) {
if (i % elementToPick == 0)
sparseList.add(inputData[i]);
}
sparseList.add(inputData[arraySize - 1]);
return sparseList.stream().mapToDouble(d -> d).toArray();
}
该示例使用数组来存储数据,但它与您的数据结构非常相似(使用size ofSet
并使用旧的 for 循环进行循环)。