Grafico JFreechart con ora dal database SQL

Sep 16 2020

Sono nuovo con JFreeChart e sto cercando di creare un grafico che visualizzi un valore sull'asse ye l'ora sull'asse x. Tutti i dati di tesi (valore e tempo) sono già nel mio database e ho qualcosa come un valore per ogni 3 o 4 secondi.

Tuttavia non voglio mostrare tutto o essere dinamico. Voglio solo visualizzare un grafico che mostra tutti i valori da 2020-06-16 10:31:52 a 2020-06-29 11:31:52 ad esempio (ma tutto è già nel mio database come ho detto).

Ecco la mia variazione di questo (senza tutte le importazioni):

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: l'errore proveniva dal database e non dal codice stesso.


Modifica: il codice è ispirato al lavoro di trashgod http://stackoverflow.com/a/24762078/230513

Informazioni aggiuntive :

Date_Time tipo di timestamp

PV tipo di float

Risposte

2 trashgod Sep 17 2020 at 03:29

L' esempio citato usando JDBCXYDatasetfunziona anche con JDBCCategoryDataset, come mostrato di seguito e nella tua domanda originale . Utilizzando JDBCCategoryDataset, "La prima colonna sarà il nome della categoria e [le] colonne rimanenti [saranno] valori (ogni colonna rappresenta una serie);" utilizzando JDBCXYDataset"La prima colonna sarà l'asse xe le restanti colonne i valori dell'asse y". Di conseguenza, mi aspetto che la tua query sia qualcosa del genere:

SELECT Date_Time, PV …

Poiché l'asse del tuo dominio è il tempo, valuta la possibilità di ruotare le posizioni dell'etichetta, come mostrato qui . Al momento di decidere, nota che a TimeSeriesè meno flessibile sull'orientamento ma più flessibile sulla formattazione.

i valori nel mio database sono Float.

Le seguenti modifiche all'esempio illustrano l'utilizzo di valori in virgola mobile. Nota che PVè di tipo floate gli PreparedStatementusi 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;
}