Цитираният пример
използвайки JDBCXYDataset
също така работи с JDBCCategoryDatasetкод>
, както е показано по-долу и във вашия оригинален въпрос
. Използване на JDBCCategoryDataset
, "Първата колона ще бъде името на категорията и [] останалите колони [ще бъдат] стойности (всяка колона представлява серия);" използвайки JDBCXYDataset
, "Първата колона ще бъде стойностите на оста х и останалите колони. " В резултат на това бих очаквал вашата заявка да бъде нещо подобно:
SELECT Date_Time, PV …
Тъй като оста на вашия домейн е времето, помислете за завъртане на позициите на етикета, както е показано тук
. Когато решавате, имайте предвид, че TimeSeries
е по-малко гъвкав по отношение на ориентацията, но по-гъвкав относно форматирането.
Следните промени в пример
илюстрирайте с помощта на стойности с плаваща запетая. Имайте предвид, че PV
е от тип float
и PreparedStatement
използва 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;
}