उद्धृत उदाहरण
JDBCXYDataset
का उपयोग करके
JDBCCategoryDataset
के साथ भी काम करता है कोड>
, जैसा कि नीचे दिखाया गया है और आपके मूल प्रश्न
में दिखाया गया है . JDBCCategoryDataset
. का उपयोग करना , "पहला कॉलम श्रेणी का नाम होगा और [the] शेष कॉलम [होगा] मान (प्रत्येक कॉलम एक श्रृंखला का प्रतिनिधित्व करता है);" JDBCXYDataset
. का उपयोग करके , "पहला स्तंभ x-अक्ष और शेष स्तंभ y-अक्ष मान होंगे।" परिणामस्वरूप, मैं आपकी क्वेरी के कुछ इस तरह होने की अपेक्षा करूंगा:
SELECT Date_Time, PV …
चूंकि आपका डोमेन अक्ष समय है, लेबल स्थितियों को घुमाने पर विचार करें, जैसा कि यहां
दिखाया गया है। . निर्णय लेते समय, ध्यान दें कि एक TimeSeries
अभिविन्यास के बारे में कम लचीला है लेकिन स्वरूपण के बारे में अधिक लचीला है।
उदाहरण
में निम्न परिवर्तन फ़्लोटिंग पॉइंट मानों का उपयोग करके वर्णन करें। ध्यान दें कि PV
float
type प्रकार का है , और 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;
}