Das Beispiel zitiert
mit JDBCXYDataset
funktioniert auch mit JDBCCategoryDataset
, wie unten und in Ihrer ursprünglichen Frage
gezeigt . Verwenden von JDBCCategoryDataset
, "Die erste Spalte wird der Kategoriename sein und [die] verbleibenden Spalten [werden] Werte sein (jede Spalte repräsentiert eine Serie);" mit JDBCXYDataset
, "Die erste Spalte enthält die x-Achse und die restlichen Spalten die y-Achsenwerte. " Als Ergebnis würde ich erwarten, dass Ihre Abfrage etwa so lautet:
SELECT Date_Time, PV …
Da Ihre Domain-Achse die Zeit ist, ziehen Sie in Betracht, die Label-Positionen zu drehen, wie hier
gezeigt . Beachten Sie bei der Entscheidung, dass eine TimeSeries
ist weniger flexibel in Bezug auf die Ausrichtung, aber flexibler in Bezug auf die Formatierung.
Die folgenden Änderungen am Beispiel
anhand von Fließkommawerten veranschaulichen. Beachten Sie, dass PV
ist vom Typ float
, und das PreparedStatement
verwendet setFloat()
.
JDBCCategoryDataset jds = createDataset();
JFreeChart chart = ChartFactory.createLineChart("Test", "Time", "PV",
jds,PlotOrientation.VERTICAL, true, true, false);
CategoryPlot plot = (CategoryPlot) chart.getPlot();
CategoryAxis domain = plot.getDomainAxis();
plot.getDomainAxis().setCategoryLabelPositions(CategoryLabelPositions.UP_45);
…
private JDBCCategoryDataset createDataset() {
try {
Connection conn = DriverManager.getConnection(
"jdbc:h2:mem:test", "", "");
Statement st = conn.createStatement();
st.execute("create table data(when timestamp, pv float)");
PreparedStatement ps = conn.prepareStatement(
"insert into data values (?, ?)");
Calendar c = Calendar.getInstance();
for (int i = 0; i < N; i++) {
ps.setTimestamp(1, new Timestamp(c.getTimeInMillis()));
ps.setFloat(2, (float)r.nextGaussian() + 2);
ps.execute();
c.add(Calendar.SECOND, r.nextInt(60 * 60));
}
JDBCCategoryDataset jds = new JDBCCategoryDataset(conn);
jds.executeQuery("select when, pv from data");
return jds;
} catch (SQLException ex) {
ex.printStackTrace(System.err);
}
return null;
}