来自数据库的jfreechart中的散点图

如何使用java中的jfreechart在mysql数据库表中绘制数据的散点图。 我用过swing库。 任何链接都会有所帮助。 我搜索谷歌但无法找到理解解决方案。 如果你有代码只是提供给我。 实际上我做了barchart并使用jfreechart绘制它。 我用于条形图的代码就在这里。 这里display3函数显示条形图。 如何修改它以显示散点图?

public void display3() throws SQLException, ClassNotFoundException{ DefaultCategoryDataset dataset = new DefaultCategoryDataset(); String JDBC_DRIVER="com.mysql.jdbc.Driver"; String DB_URL="jdbc:mysql://localhost/data2"; Connection conn; Statement stmt; String USER = "root"; String PASS = ""; try{ Class.forName(JDBC_DRIVER); conn=DriverManager.getConnection(DB_URL,USER,PASS); System.out.println("Creating statement..."); stmt = conn.createStatement(); String sql; sql="SELECT * FROM `production` WHERE crop_id = 1 AND location_id = 1"; ResultSet rs=stmt.executeQuery(sql); while (rs.next()){ //String student = rs.getString("studentname"); String yeartext = rs.getString("year_of_production"); //double value = Double.parseDouble(text); String productiontext = rs.getString("production_amount"); double production = Double.parseDouble(productiontext); Integer year = Integer.parseInt(yeartext); dataset.setValue(production, "production", year); } JFreeChart chart = ChartFactory.createBarChart("Bar Graph",// Chart Title "Year", //horizontal axis label "Paddy Production", // vertical axis label dataset, //data PlotOrientation.VERTICAL, //orientation of chart true, //include legend false, // tool tips true);//urls CategoryPlot p = chart.getCategoryPlot(); ChartPanel chartPanel = new ChartPanel(chart, false); jPanel9.setLayout(new BorderLayout()); jPanel9.add(chartPanel, BorderLayout.EAST); jPanel9.add(chartPanel); SwingUtilities.updateComponentTreeUI(this); p.setRangeGridlinePaint(blue); System.out.println("Database created successfully..."); } catch(SQLException se) { //Handle errors for JDBC System.out.println("Connect failed ! "); se.printStackTrace(); } } I finally solved my problem: 

优化代码如下,它的工作原理如下:

 public void display3() throws SQLException, ClassNotFoundException{ //DefaultCategoryDataset dataset = new DefaultCategoryDataset(); XYSeriesCollection dataset = new XYSeriesCollection(); XYSeries series = new XYSeries("production"); String JDBC_DRIVER="com.mysql.jdbc.Driver"; String DB_URL="jdbc:mysql://localhost/data2"; Connection conn; Statement stmt; String USER = "root"; String PASS = ""; try{ Class.forName(JDBC_DRIVER); conn=DriverManager.getConnection(DB_URL,USER,PASS); System.out.println("Creating statement..."); stmt = conn.createStatement(); String sql; sql="SELECT * FROM `production` WHERE crop_id = 1 AND location_id = 1"; ResultSet rs=stmt.executeQuery(sql); while (rs.next()){ //String student = rs.getString("studentname"); String yeartext = rs.getString("year_of_production"); //double value = Double.parseDouble(text); String productiontext = rs.getString("production_amount"); double production = Double.parseDouble(productiontext); double year = Double.parseDouble(yeartext); series.add(year,production) ; //dataset.addSeries(series); } dataset.addSeries(series); JFreeChart chart = ChartFactory.createScatterPlot("Scatter Plot","Year","Paddy Production", dataset); //CategoryPlot p = chart.getCategoryPlot(); //XYPlot xyplot = (XYPlot)jfreechart.getPlot(); //http://sofzh.miximages.com/java/29ynsxh.png 

此完整示例在内存中创建合适的数据库表,将其查询到JDBCXYDataset并在散点图中显示数据集。 请注意第一列如何成为域,而连续列成为单个系列。

图片

 import java.awt.EventQueue; import java.sql.Connection; import java.sql.Date; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import java.util.Calendar; import java.util.Random; import javax.swing.JFrame; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.DateAxis; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import org.jfree.data.jdbc.JDBCXYDataset; /** * @see http://stackoverflow.com/a/24592754/230513 */ public class JDBCTest { private static final int N = 30; private static final Random r = new Random(); private void display() { JFrame f = new JFrame("JDBCTest"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JDBCXYDataset jds = createDataset(); JFreeChart chart = ChartFactory.createScatterPlot("Inventory", "Date", "Count", jds, PlotOrientation.VERTICAL, true, true, false); XYPlot plot = chart.getXYPlot(); plot.setDomainAxis(new DateAxis("Date")); f.add(new ChartPanel(chart)); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); for (int i = 0; i < jds.getItemCount(); i++) { System.out.println(new Date(jds.getX(0, i).longValue())); } } private JDBCXYDataset createDataset() { try { Connection conn = DriverManager.getConnection( "jdbc:h2:mem:test", "", ""); Statement st = conn.createStatement(); st.execute("create table inventory(when date, n1 integer, n2 integer)"); PreparedStatement ps = conn.prepareStatement( "insert into inventory values (?, ?, ?)"); Calendar c = Calendar.getInstance(); for (int i = 0; i < N; i++) { ps.setDate(1, new Date(c.getTimeInMillis())); ps.setInt(2, N / 3 + r.nextInt(N / 3)); ps.setInt(3, N / 2 + r.nextInt(N / 3)); ps.execute(); c.add(Calendar.MONTH, 1); } JDBCXYDataset jds = new JDBCXYDataset(conn); jds.executeQuery("select when, n1, n2 from inventory"); 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(); } }); } }