Det citerade exemplet
med JDBCXYDataset
fungerar även med JDBCCategoryDataset
, som visas nedan och i din ursprungliga fråga
. Använder JDBCCategoryDataset
, "Den första kolumnen kommer att vara kategorinamnet och [de] återstående kolumnerna [kommer att vara] värden (varje kolumn representerar en serie);" med JDBCXYDataset
, "Den första kolumnen kommer att vara x-axeln och de återstående kolumnernas y-axelvärden." Som ett resultat skulle jag förvänta mig att din fråga skulle vara ungefär så här:
SELECT Date_Time, PV …
Eftersom din domänaxel är tid, överväg att rotera etikettpositionerna, som visas här
. När du bestämmer dig, notera att en TimeSeries
är mindre flexibel när det gäller orientering men mer flexibel när det gäller formatering.
Följande ändringar av exemplet
illustrera med hjälp av flyttalsvärden. Observera att PV
är av typen float
och PreparedStatement
använder 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;
}