Det citerede eksempel
ved hjælp af JDBCXYDataset
virker også med JDBCCategoryDataset
, som vist nedenfor og i dit originale spørgsmål
. Brug af JDBCCategoryDataset
, "Den første kolonne vil være kategorinavnet og [de] resterende kolonner [vil være] værdier (hver kolonne repræsenterer en serie);" ved hjælp af JDBCXYDataset
, "Den første kolonne vil være værdierne for x-aksen og de resterende kolonners y-akse." Som et resultat ville jeg forvente, at din forespørgsel ville være sådan her:
SELECT Date_Time, PV …
Da din domæneakse er tid, kan du overveje at rotere etiketpositionerne, som vist her
. Når du beslutter dig, skal du bemærke, at en TimeSeries
er mindre fleksibel med hensyn til orientering, men mere fleksibel med hensyn til formatering.
Følgende ændringer af eksemplet
illustrere ved hjælp af flydende kommaværdier. Bemærk, at PV
er af typen float
, og PreparedStatement
bruger 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;
}