Het geciteerde voorbeeld
met behulp van JDBCXYDataset
werkt ook met JDBCCategoryDataset
, zoals hieronder weergegeven en in uw originele vraag
. JDBCCategoryDataset
gebruiken , "De eerste kolom is de categorienaam en [de] overige kolommen [zullen] waarden zijn (elke kolom vertegenwoordigt een reeks);" met behulp van JDBCXYDataset
, "De eerste kolom is de x-as en de overige kolommen zijn de y-aswaarden." Als resultaat verwacht ik dat uw zoekopdracht er ongeveer zo uit zal zien:
SELECT Date_Time, PV …
Aangezien uw domeinas tijd is, kunt u overwegen de labelposities te roteren, zoals hier
wordt weergegeven . Houd er bij de beslissing rekening mee dat een TimeSeries
is minder flexibel wat betreft oriëntatie, maar flexibeler wat betreft opmaak.
De volgende wijzigingen in het voorbeeld
illustreren met behulp van drijvende-kommawaarden. Merk op dat PV
is van het type float
, en de PreparedStatement
gebruikt 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;
}