2013-03-28 89 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