-
Notifications
You must be signed in to change notification settings - Fork 90
/
HistogramBasicSample.java
139 lines (127 loc) · 6.55 KB
/
HistogramBasicSample.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package de.gsi.chart.samples;
import static de.gsi.dataset.spi.AbstractHistogram.HistogramOuterBounds.BINS_ALIGNED_WITH_BOUNDARY;
import java.util.*;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.binding.Bindings;
import javafx.collections.FXCollections;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import de.gsi.chart.XYChart;
import de.gsi.chart.plugins.EditAxis;
import de.gsi.chart.plugins.Zoomer;
import de.gsi.chart.renderer.LineStyle;
import de.gsi.chart.renderer.spi.ErrorDataSetRenderer;
import de.gsi.dataset.DataSet;
import de.gsi.dataset.spi.AbstractHistogram;
import de.gsi.dataset.spi.Histogram;
import de.gsi.math.Math;
public class HistogramBasicSample extends Application {
private Histogram dataSet1 = new Histogram("myHistogram1", 4, 0.0, 4.0, BINS_ALIGNED_WITH_BOUNDARY);
@Override
public void start(final Stage primaryStage) {
final XYChart chart = new XYChart();
final ErrorDataSetRenderer renderer1 = new ErrorDataSetRenderer();
renderer1.setPolyLineStyle(LineStyle.HISTOGRAM_FILLED);
chart.getRenderers().add(renderer1);
renderer1.getDatasets().addAll(dataSet1);
chart.getPlugins().add(new EditAxis());
final Zoomer zoomer = new Zoomer();
zoomer.setSliderVisible(false);
chart.getPlugins().add(zoomer);
final VBox root = new VBox();
final Scene scene = new Scene(root, 800, 600);
// Controls to generate new equidistant dataset
final ToolBar addDataSet = new ToolBar();
final Slider nBinsSlider = new Slider(1, 25, 4);
nBinsSlider.setMajorTickUnit(1);
nBinsSlider.setSnapToTicks(true);
nBinsSlider.setShowTickLabels(true);
nBinsSlider.setShowTickMarks(true);
final Slider minSlider = new Slider(-10, 10, 0);
minSlider.setShowTickLabels(true);
minSlider.setShowTickMarks(true);
final Slider maxSlider = new Slider(-10, 10, 4);
maxSlider.setShowTickLabels(true);
maxSlider.setShowTickMarks(true);
final ComboBox<AbstractHistogram.HistogramOuterBounds> histoBoundsCombo = new ComboBox<>(FXCollections.observableList(List.of(AbstractHistogram.HistogramOuterBounds.values())));
histoBoundsCombo.setValue(BINS_ALIGNED_WITH_BOUNDARY);
final Button newHistogramButton = new Button("New Histogram");
newHistogramButton.setOnAction(e -> {
dataSet1 = new Histogram("myHistogram1", (int) nBinsSlider.getValue(), minSlider.getValue(), maxSlider.getValue(), histoBoundsCombo.getValue());
for (int i = 0; i < dataSet1.getDataCount() + 2; i++) {
dataSet1.addBinContent(i, dataSet1.getDataCount() + 2.0 - Math.abs(i - 0.5 * (dataSet1.getDataCount() + 2)));
}
renderer1.getDatasets().setAll(dataSet1);
});
addDataSet.getItems().addAll( //
new Label("nBins: "), nBinsSlider, //
new Label("min: "), minSlider, //
new Label("max: "), maxSlider, //
histoBoundsCombo, //
newHistogramButton //
);
// controls to generate new non-equidistant histogram
final ToolBar addNeqDataSet = new ToolBar();
final TextField points = new TextField("0.0, 1.0, 2.0, 3.0, 4.0");
final Button newNeqHistogramButton = new Button("New non-equidistant Histogram");
newNeqHistogramButton.setOnAction(e -> {
dataSet1 = new Histogram("Non equidistant histogram", Arrays.stream(points.getText().split(",")).mapToDouble(v -> Double.parseDouble(v.trim())).toArray());
for (int i = 0; i < dataSet1.getDataCount() + 2; i++) {
dataSet1.addBinContent(i, dataSet1.getDataCount() + 2.0 - Math.abs(i - 0.5 * (dataSet1.getDataCount() + 2)));
}
renderer1.getDatasets().setAll(dataSet1);
});
addNeqDataSet.getItems().addAll( //
new Label("Bin boundaries: "), points, //
newNeqHistogramButton, //
new Label("NOTE: because the ErrorDataSetRenderer cannot obtain the widths of the bins, bin boundaries will be off") //
);
// controls to add data points
final ToolBar addDataBar = new ToolBar();
final ToggleGroup addDataToggleGroup = new ToggleGroup();
final RadioButton addDataValueRadio = new RadioButton("Add data to value: ");
addDataValueRadio.setToggleGroup(addDataToggleGroup);
addDataValueRadio.setSelected(true);
final Spinner<Double> valueToAddTo = new Spinner<>(new SpinnerValueFactory.DoubleSpinnerValueFactory(Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, 1.0, 0.1));
valueToAddTo.setEditable(true);
valueToAddTo.disableProperty().bind(Bindings.not(addDataValueRadio.selectedProperty()));
final RadioButton addDataBinRadio = new RadioButton("Add data to bin: ");
addDataBinRadio.setToggleGroup(addDataToggleGroup);
final Spinner<Integer> binToAddTo = new Spinner<>(0, Integer.MAX_VALUE, 2);
binToAddTo.setEditable(true);
binToAddTo.disableProperty().bind(Bindings.not(addDataBinRadio.selectedProperty()));
final Spinner<Double> valueToAdd = new Spinner<>(new SpinnerValueFactory.DoubleSpinnerValueFactory(Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, 1.0, 0.1));
valueToAdd.setEditable(true);
final Button addDataBtn = new Button("add");
addDataBtn.setOnAction(e -> {
if (addDataValueRadio.isSelected()) {
dataSet1.addBinContent(dataSet1.findBin(DataSet.DIM_X, valueToAddTo.getValue()), valueToAdd.getValue());
} else {
dataSet1.addBinContent(binToAddTo.getValue(), valueToAdd.getValue());
}
});
addDataBar.getItems().addAll( //
addDataValueRadio, valueToAddTo, //
addDataBinRadio, binToAddTo, //
new Label("Weight: "), valueToAdd, //
addDataBtn //
);
// show all controls
root.getChildren().addAll(addDataSet, addNeqDataSet, addDataBar, chart);
VBox.setVgrow(chart, Priority.ALWAYS);
primaryStage.setTitle(this.getClass().getSimpleName());
primaryStage.setScene(scene);
primaryStage.show();
primaryStage.setOnCloseRequest(evt -> Platform.exit());
}
/**
* @param args the command line arguments
*/
public static void main(final String[] args) {
Application.launch(args);
}
}