2013-03-28 141 views
0

我需要創建一個條形圖,從列出訪問記錄的數據庫中的表中讀取數據。jfreechart條形圖輸出

表應該顯示哪些供應商訪問它(X軸),那是誰的代表(各條)訪問,多少次(Y軸)

每個供應商可以代表的訪問多個直轄市,但每個直轄市只有一個供應商。因此,每個供應商可能會顯示多個酒吧....但是,圖表中的每個酒吧都是唯一的,並按供應商分組。

在jfreechart的例子中,我看到x軸上的每個類別都使用重複系列,但是如何在每個小節獨特的地方執行我所需要的操作?

下面是相關的servlet代碼:

      //Municipality, Vendor             //for month of January       //Vendor //Municipality             
     if (stmt.execute("Select COUNT(accessFor), accessBy, accessFor FROM bps_bam.access WHERE DATE_FORMAT(accessTime, '%Y %M') = '2012 January' GROUP BY accessBy, accessFor;")) { 
      rs = stmt.getResultSet(); 
     } else { 
      System.err.println("select failed"); 
     } 

     DefaultCategoryDataset dataset = new DefaultCategoryDataset(); //Set of values for Bar Graph 

     while(rs.next()) 
     {     //count   //municipality   //vendor 
      dataset.addValue(rs.getDouble(1), rs.getString(3), (String)rs.getString(2)); 
     } 

     counter++; 

     JFreeChart chart = ChartFactory.createBarChart(
       "January Access Times", // chart title 
       "Vendor", // domain axis label 
       "Value", // range axis label 
       dataset, // data 
       PlotOrientation.VERTICAL, // orientation 
       false, // include legend 
       false, // tooltips 
       false // URLs? 
       ); 



     CategoryPlot plot = (CategoryPlot) chart.getPlot(); 
     CategoryItemRenderer renderer = plot.getRenderer(); 
     CategoryItemLabelGenerator generator 
      = new StandardCategoryItemLabelGenerator("{0}", 
        NumberFormat.getInstance()); 
     renderer.setBaseItemLabelGenerator(generator); 
     renderer.setBaseItemLabelFont(new Font("SansSerif", Font.PLAIN, 12)); 
     renderer.setBaseItemLabelsVisible(true); 
     renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(
       ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_CENTER)); 


     response.setContentType("image/png"); 
     //response.addHeader("Refresh", "5"); 

     //Write numbers on range axis just as integrals, not decimals 
     NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); 
     rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); 

     ChartUtilities.writeChartAsPNG(out, chart, 800, 500); 

回答

2

難道這就是你想幹什麼?

enter image description here

private static CategoryDataset createDataset() { 

    // row keys... 
    String series1 = "Municipality 1"; 
    String series2 = "Municipality 2"; 
    String series3 = "Municipality 3"; 

    // column keys... 
    String category1 = "Vendor 1"; 
    String category2 = "Vendor 2"; 
    String category3 = "Vendor 3"; 
    String category4 = "Vendor 4"; 
    String category5 = "Vendor 5"; 

    // create the dataset... 
    DefaultCategoryDataset dataset = new DefaultCategoryDataset(); 

    dataset.addValue(1.0, series1, category1); 
    dataset.addValue(4.0, series1, category2); 
    dataset.addValue(3.0, series1, category3); 
    dataset.addValue(5.0, series1, category4); 
    dataset.addValue(5.0, series1, category5); 

    dataset.addValue(5.0, series2, category1); 
    dataset.addValue(6.0, series2, category3); 
    dataset.addValue(8.0, series2, category4); 
    dataset.addValue(4.0, series2, category5); 

    dataset.addValue(4.0, series3, category1); 
    dataset.addValue(3.0, series3, category2); 
    dataset.addValue(3.0, series3, category4); 
    dataset.addValue(6.0, series3, category5); 

    return dataset; 

} 
+0

謝謝格雷厄姆,但沒有:) 每個市應在圖表中一旦出現,因爲每個市只有一家供應商。事實上,每個市鎮都可以是相同的顏色,因爲沒有一個會在圖表上出現兩次。我只需要由供應商在X軸上分割它們。 – Moe45673

+0

@ Moe45673在這種情況下,你可以模擬一個圖表,因爲我無法想象你想要做什麼。 – GrahamA

+0

嗯...... ..... 那麼,你在顯示的圖表中有13個條。想象一下,所有的酒吧都是相同的顏色,並且市政府被命名爲「市政1」到「市政13」,並且爲了這個實體模型而被分配到酒吧。 這就是我試圖達到的樣子(顯然真實的數據不會是隨機的)。這有幫助嗎? – Moe45673