Graphique JFreechart avec heure de la base de données SQL
Je suis nouveau avec JFreeChart et j'essaie de créer un graphique qui affiche une valeur sur l'axe y et le temps sur l'axe x. Toutes ces données (valeur et heure) sont déjà dans ma base de données et j'ai quelque chose comme une valeur pour chaque 3 à 4 secondes.
Cependant je ne veux pas tout afficher ni être dynamique. Je veux juste afficher un graphique qui montre toutes les valeurs du 2020-06-16 10:31:52 au 2020-06-29 11:31:52 par exemple (mais tout est déjà dans ma base de données comme je l'ai dit).
Voici ma variation de ceci (sans toutes les importations):
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'erreur provenait de la base de données et non du code lui-même.
Edit: Le code est inspiré du travail de trashgod http://stackoverflow.com/a/24762078/230513
Information additionnelle :
Date_Time les types timestamp
PV les types float
Réponses
L' exemple cité en utilisant JDBCXYDatasetfonctionne également avec JDBCCategoryDataset, comme indiqué ci-dessous et dans votre question d' origine . En utilisant JDBCCategoryDataset, "La première colonne sera le nom de la catégorie et [les] colonnes restantes [seront] des valeurs (chaque colonne représente une série);" en utilisant JDBCXYDataset, "La première colonne correspondra aux valeurs de l'axe des x et des colonnes restantes sur l'axe des y."
SELECT Date_Time, PV …
L'axe de votre domaine étant le temps, envisagez de faire pivoter les positions des étiquettes, comme illustré ici . Lorsque vous décidez, notez que a TimeSeriesest moins flexible sur l'orientation mais plus flexible sur le formatage.
les valeurs de ma base de données sont
Float.
Les modifications suivantes apportées à l' exemple illustrent l'utilisation de valeurs à virgule flottante. Notez que PVc'est de type float, et les PreparedStatementutilisations 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;
}