使用jfreechart在jsp頁面柱狀圖統計


最近做項目,做了一個報表統計柱狀圖。覺得挺好的,記錄一下。

項目使用的strus1+spring+ibatis

具體代碼如下:

以下Java代碼被注釋掉的是繪制柱形圖。另一種是折線圖,具體思路一樣。

/**查詢獲得圖表需要的橫從坐標數據 
            數據采集 (被調用)*/  
    private static CategoryDataset createDataset() {  
        DefaultCategoryDataset localDefaultCategoryDataset = new DefaultCategoryDataset();  
        List<Aceshi> jfreeList;         
        jfreeList = aceshiFacade.getJfreeList();  
        for (int i = 0; i < jfreeList.size(); i++) {   
            localDefaultCategoryDataset.addValue(jfreeList.get(i).getNum(), "省份協會數量分布數量統計圖", jfreeList.get(i).getAreaName());  
        }  
        return localDefaultCategoryDataset;  
    }  
  
    private static JFreeChart createChart(String chartTitle, String x,  
            String y, CategoryDataset dataset) {  
        // 構建一個chart  
        JFreeChart chart = ChartFactory.createLineChart(chartTitle,// 圖的標題  
                x, // x軸標題  
                y, // y軸標題  
                dataset,// 數據點  
                PlotOrientation.VERTICAL, true, true, false);  
        // 字體清晰  
        chart.setTextAntiAlias(false);  
        // 設置背景顏色  
        chart.setBackgroundPaint(Color.LIGHT_GRAY);  
  
        // 設置圖標題的字體  
        Font font = new Font("微軟雅黑", Font.BOLD, 25);  
        chart.getTitle().setFont(font);  
  
        // 設置面板字體  
        Font labelFont = new Font("宋體", Font.TRUETYPE_FONT, 12);  
        // 設置圖示的字體  
        chart.getLegend().setItemFont(labelFont);  
  
        CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();  
        // x軸 // 分類軸網格是否可見  
        categoryplot.setDomainGridlinesVisible(true);  
        // y軸 //數據軸網格是否可見  
        categoryplot.setRangeGridlinesVisible(true);  
        categoryplot.setRangeGridlinePaint(Color.WHITE);// 虛線色彩  
        categoryplot.setDomainGridlinePaint(Color.WHITE);// 虛線色彩  
        categoryplot.setBackgroundPaint(Color.BLACK);// 折線圖的背景顏色  
  
        // 設置軸和面板之間的距離  
        // categoryplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));  
  
        // 橫軸 x  
        CategoryAxis domainAxis = categoryplot.getDomainAxis();  
        domainAxis.setLabelFont(labelFont);// 軸標題  
        domainAxis.setTickLabelFont(labelFont);// 軸數值  
        // domainAxis.setLabelPaint(Color.BLUE);//軸標題的顏色  
        // domainAxis.setTickLabelPaint(Color.BLUE);//軸數值的顏色  
  
        // 橫軸 lable 的位置 橫軸上的 Lable 45度傾斜 DOWN_45  
        domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90);  
  
        // 設置距離圖片左端距離  
        domainAxis.setLowerMargin(0.0);  
        // 設置距離圖片右端距離  
        domainAxis.setUpperMargin(0.0);  
  
        // 縱軸 y  
        NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();  
        numberaxis.setLabelFont(labelFont);  
        numberaxis.setTickLabelFont(labelFont);  
        numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());  
        numberaxis.setAutoRangeIncludesZero(true);  
  
        // 獲得renderer 注意這里是下嗍造型到lineandshaperenderer!!  
        LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) categoryplot  
                .getRenderer();  
        lineandshaperenderer.setBaseShapesVisible(true); // series 點(即數據點)可見  
        lineandshaperenderer.setBaseLinesVisible(true); // series 點(即數據點)間有連線可見  
  
        // 顯示折點數據  
        lineandshaperenderer  
                .setBaseItemLabelGenerator(new   
  
StandardCategoryItemLabelGenerator());  
        lineandshaperenderer.setBaseItemLabelsVisible(true);  
  
        return chart;  
          
        /*JFreeChart chart = ChartFactory.createBarChart("省份協會分布統計圖",// 標題 
                "省份名稱",// x軸 
                "協會數量",// y軸 
                dataset,// 數據 
                PlotOrientation.VERTICAL,// 定位,VERTICAL:垂直 
                true,// 是否顯示圖例注釋(對於簡單的柱狀圖必須是false) 
                false,// 是否生成工具//沒用過 
                false);// 是否生成URL鏈接//沒用過 
              //字體清晰 
              chart.setTextAntiAlias(false); 
              // 周圍的背景色 
              chart.setBackgroundPaint(Color.lightGray); 
              // 設置字體,否則會顯示亂碼 
              chart.getLegend().setItemFont(new Font("宋體",Font.PLAIN,20));  
              Font font = new Font("幼圓", 15, 15); 
              Font lablefont = new Font("黑體", 25, 25); 
              TextTitle title = chart.getTitle(); 
              // 設置標題字體 
              title.setFont(font); 
              CategoryPlot plot = (CategoryPlot) chart.getPlot(); 
              // 生成圖片的背景色 
              plot.setBackgroundPaint(Color.black); 
              // 行線的顏色 
              plot.setRangeGridlinePaint(Color.BLACK); 
              // 刻度字體 
              plot.getDomainAxis().setTickLabelFont(font); 
              // X軸名稱字體 
              plot.getDomainAxis().setLabelFont(lablefont); 
              // LayeredBarRenderer lbr = new LayeredBarRenderer();//(BarRenderer)類: 
              // //void setSeriesBarWidth(int series,double width) 
              // 設定每個分類的寬度(注意設置不要使某分類被覆蓋) 
              // lbr.setSeriesBarWidth(1,0.1); 
 
              // 設置顯示整數 
              NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); 
 
              rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); 
              // 設置上部空白 
              rangeAxis.setUpperMargin(0.15); 
              // 設置y軸名稱字體 
              rangeAxis.setLabelFont(font); 
 
              CategoryItemRenderer renderer = plot.getRenderer(); 
              // renderer.setDrawOutlines(true); 
              //是否折線數據點根據不同數據使用不同的形狀 
              // renderer.setSeriesShapesVisible(0, true); 
              renderer.setSeriesItemLabelsVisible(0, Boolean.TRUE); 
 
              CategoryAxis domainAxis = plot.getDomainAxis(); 
              domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);// 傾斜 
 
45度 
 
              BarRenderer renderer1 = new BarRenderer();// 設置柱子的相關屬性 
              // 設置柱子寬度 
              // renderer1.setMaximumBarWidth(0.9); 
              // renderer1.setMaximumBarWidth(0.10000000000000001D); //寬度 
              // 設置柱子高度 
              renderer1.setMinimumBarLength(0.5); 
              // 設置柱子邊框顏色 
              //renderer1.setBaseOutlinePaint(Color.BLACK); 
              // 設置柱子邊框可見 
              // renderer1.setDrawBarOutline(true); 
              // 設置每個地區所包含的平行柱的之間距離,數值越大則間隔越大,圖片大小一定的 
 
情況下會影響柱子的寬度,可以為負數 
              renderer1.setItemMargin(0.1); 
              // 是否顯示陰影 
              renderer1.setShadowVisible(false); 
              // 陰影顏色 
              // renderer1.setShadowPaint(Color.white); 
              plot.setRenderer(renderer1); 
              plot.setBackgroundAlpha((float) 0.5); // 數據區的背景透明度(0.0~1.0) 
              // 設置柱的透明度 
              // plot.setForegroundAlpha(1.0f); 
              // 設置圖形的寬度 
              // 設置圖形右邊的空白 
              // caxis.setUpperMargin(0.2); 
              // 設置左邊的空白 
              // caxis.setLowerMargin(0.2); 
 
              return chart;*/  
    }  
  
    // 獲取JFreeChart  
    public ActionForward createDemoPanel(ActionMapping mapping,  
            ActionForm form, HttpServletRequest request,  
            HttpServletResponse response) throws Exception {  
        CategoryDataset database = createDataset();  
        JFreeChart localJFreeChart = createChart("省份協會分布統計圖", "省份名稱", "協會數量",  
                database);  
        ChartUtilities.writeChartAsJPEG(response.getOutputStream(), 1.0f,  
                localJFreeChart, 1000, 500, null);  
        return null;  
    }

jsp頁面的代碼如下:

<div style="height: 500px; background-color: #9f9fce;"><img  
    src="<c:url value='/aceshi/view.do?op=createDemoPanel'/>"></div>  
</div> 

具體各層代碼不贅述了,運行過程:頁面DIV圖片標簽請求方法  進入action層  執行createDemoPanel方法,在此方法里面依次執行數據源封裝和柱狀圖生成的方法,最后返回一個圖片地址在jsp頁面顯示。(本人新手,說的很籠統,只為記錄一下。希望大家不要介意。有問題指出來,謝謝)
運行效果如下圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM