最近做項目,做了一個報表統計柱狀圖。覺得挺好的,記錄一下。
項目使用的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頁面顯示。(本人新手,說的很籠統,只為記錄一下。希望大家不要介意。有問題指出來,謝謝)
運行效果如下圖:

