Bagan JFreechart dengan Waktu dari Database SQL

Sep 16 2020

Saya baru mengenal JFreeChart dan saya mencoba membuat bagan yang menampilkan nilai pada sumbu y dan waktu pada sumbu x. Semua data ini (nilai dan waktu) sudah ada di database saya dan saya memiliki nilai untuk setiap 3 hingga 4 detik.

Namun saya tidak ingin menampilkan semuanya atau menjadi dinamis. Saya hanya ingin menampilkan grafik yang menunjukkan semua nilai dari 2020-06-16 10:31:52 hingga 2020-06-29 11:31:52 misalnya (tetapi semuanya sudah ada di Database saya seperti yang saya katakan).

Berikut adalah variasi saya ini (tanpa semua impor):

public class JDBCTest {

    private void display() {
        JFrame f = new JFrame("JDBCTest");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JDBCXYDataset jds = createDataset();
        JFreeChart chart = ChartFactory.createTimeSeriesChart(
            "Inventory", "Date", "Count", jds, true, true, false);
        f.add(new ChartPanel(chart));
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    private JDBCXYDataset createDataset() {
        try {
            Connection conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:","", "");
           
            Statement st = conn.createStatement();
            st.execute("DROP TABLE IF EXISTS Test ");
            st.execute("create table Test(Date_Heure timestamp, PV float)");
            
            String Date_Debut = "2020-06-25 13:28:08";
            String Date_Fin = "2020-06-26 13:28:08";
            String sql1 = "INSERT INTO Test (Date_Heure,PV) "
                    + "SELECT TABLE ,TABLE "
                    + "FROM TABLE "
                    + "WHERE Date_Heure BETWEEN ? AND ?";
            
            PreparedStatement ps = conn.prepareStatement(sql1);
           
            ps.setString(1,Date_Debut);
            ps.setString(2,Date_Fin);
            ps.executeUpdate();
            
            JDBCXYDataset jds = new JDBCXYDataset(conn);
            jds.executeQuery("select TABLE , TABLE from Test");
            return jds;
            } catch (SQLException ex) {
                ex.printStackTrace(System.err);
            }
            return null;
        }
    
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JDBCTest().display();
            }
        });
    }
}

EDIT: Kesalahan datang dari Database dan bukan dari kode itu sendiri.


Sunting: Kode ini terinspirasi di sekitar pekerjaan trashgod http://stackoverflow.com/a/24762078/230513

informasi tambahan :

Date_Time tipe ini timestamp

PV tipe ini float

Jawaban

2 trashgod Sep 17 2020 at 03:29

The contoh dikutip menggunakan JDBCXYDatasetjuga bekerja dengan JDBCCategoryDataset, seperti yang ditunjukkan di bawah ini dan di asli Anda pertanyaan . Menggunakan JDBCCategoryDataset, "Kolom pertama akan menjadi nama kategori dan kolom [yang] tersisa [akan] nilai (setiap kolom mewakili seri);" menggunakan JDBCXYDataset, "Kolom pertama akan menjadi sumbu x dan kolom yang tersisa nilai sumbu y." Akibatnya, saya berharap kueri Anda menjadi seperti ini:

SELECT Date_Time, PV …

Karena sumbu domain Anda adalah waktu, pertimbangkan untuk memutar posisi label, seperti yang ditunjukkan di sini . Saat memutuskan, perhatikan bahwa a TimeSerieskurang fleksibel tentang orientasi tetapi lebih fleksibel tentang pemformatan.

nilai dalam database saya adalah Float.

Perubahan berikut pada contoh diilustrasikan menggunakan nilai titik mengambang. Perhatikan PVjenis float, dan PreparedStatementkegunaannya 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;
}