用Jfreechar 实现基于web 的折线图

来源:互联网 发布:周杰伦 黑色幽默 知乎 编辑:程序博客网 时间:2024/05/16 16:11

应项目的需求,要做一个折现统计图,具体的效果如下:


需求中可以在统计年度,季度,月,星期的。其中核心代码是:

/** * 绘图 * @return * @throws IOException * @throws ParseException * @throws IllegalArgumentException * @throws IllegalAccessException */public String createChart() throws IOException, ParseException,IllegalArgumentException, IllegalAccessException {// 定义图标对象JFreeChart chart = ChartFactory.createLineChart(null,// 报表题目,字符串类型"交易时间", // 横轴"交易数量", // 纵轴this.createDataset(), // 获得数据集PlotOrientation.VERTICAL, // 图标方向垂直true, // 显示图例false, // 不用生成工具false // 不用生成URL地址);// 整个大的框架属于chart 可以设置chart的背景颜色// 生成图形CategoryPlot plot = chart.getCategoryPlot();// 图像属性部分plot.setBackgroundPaint(Color.white);plot.setDomainGridlinesVisible(false); // 设置背景网格线是否可见plot.setDomainGridlinePaint(Color.BLACK); // 设置背景网格线颜色plot.setRangeGridlinePaint(Color.GRAY);plot.setNoDataMessage("没有数据");// 没有数据时显示的文字说明。// 数据轴属性部分NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());rangeAxis.setAutoRangeIncludesZero(true); // 自动生成rangeAxis.setUpperMargin(0.20);rangeAxis.setLabelAngle(Math.PI / 2.0);rangeAxis.setAutoRange(false);// 数据渲染部分 主要是对折线做操作LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer();renderer.setBaseItemLabelsVisible(true);renderer.setSeriesPaint(0, Color.black); // 设置折线的颜色renderer.setBaseShapesFilled(true);renderer.setBaseItemLabelsVisible(true);renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());renderer.setBaseItemLabelFont(new Font("Dialog", 1, 14)); // 设置提示折点数据形状plot.setRenderer(renderer);HttpSession session = request.getSession();String filename = ServletUtilities.saveChartAsPNG(chart, 750, 600,null, session);String graphURL = request.getContextPath() + "/DisplayChart?filename="+ filename;ActionContext.getContext().put("graphURL", graphURL);return "icon";}

按星期统计的数据绑定:

/*************************** * 按星期统计交易统计 *  * @throws IllegalAccessException * @throws IllegalArgumentException *             * **************************/private static final int FIRST_DAY = Calendar.MONDAY;public DefaultCategoryDataset createDatasetByWeek() throws ParseException,IllegalArgumentException, IllegalAccessException {DefaultCategoryDataset linedatasetByWeekByWeek = new DefaultCategoryDataset();// 曲线名称String series = "市场交易统计"; // series指的就是报表里的那条数据线// 横轴名称(列名称)String[] time = new String[7];Calendar calendar = Calendar.getInstance();SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");while (calendar.get(Calendar.DAY_OF_WEEK) != FIRST_DAY) {calendar.add(Calendar.DATE, -1);}for (int i = 0; i < 7; i++) {time[i] = dateFormat.format(calendar.getTime()).toString();calendar.add(Calendar.DATE, 1);}List purchaseinfonList = new ArrayList();purchaseinfonList = tenant_purchaseinfoService.findResultListByWeek("%Y-%m-%d", time[0], time[6]);int listlen = purchaseinfonList.size(); // 从数据库中查询出来的数据长度int weeklen = time.length; // 月份的长度// list 中的某条数据放到数组中double[] arrList = new double[time.length];String[] weekdate = new String[7];// 取出星期for (int i = 0; i < weeklen; i++) {if (listlen < i + 1) {weekdate[i] = "";} else {Map map = (Map) purchaseinfonList.get(i);weekdate[i] = map.get("date").toString();}}// 取出总数for (int j = 0; j < listlen; j++) {for (int i = 0; i < weeklen; i++) {if (weekdate[j].equals(time[i])) {Map map = (Map) purchaseinfonList.get(j);arrList[i] = (Double) map.get("purchaseCount");}}}// 添加数据值for (int i = 0; i < time.length; i++) {linedatasetByWeekByWeek.addValue(arrList[i], series, // 值time[i]); // 对应的横轴}return linedatasetByWeekByWeek;}

按月统计的数据绑定:

/*** * 按月统计 * @return */@SuppressWarnings("null")public DefaultCategoryDataset createDatasetByMonth() {DefaultCategoryDataset linedatasetByMonth = new DefaultCategoryDataset();// 曲线名称String series = "市场交易统计"; // series指的就是报表里的那条数据线/********************************* 获取一个月的日期 ****************************************/// 获取当前年份Calendar cal = Calendar.getInstance();// 横轴名称(列名称)int monthInt = cal.get(Calendar.MONTH) + 1; // 获取当前月份// 横轴名称(列名称)String monthString = String.valueOf(monthInt);int yearString = cal.get(Calendar.YEAR); // 获取当前年份String[] time = null;String[] monthdatestrStrings = null;String[] timeValue = { "01", "02", "03", "04", "05", "06", "07", "08","09", "10", "11", "12", "13", "14", "15", "16", "17", "18","19", "20", "21", "22", "23", "24", "25", "26", "27", "28","29", "30", "31" };switch (monthInt) {case 1:case 3:case 5:case 7:case 8:case 10:case 12:time = new String[31];monthdatestrStrings = new String[31];for (int i = 0; i < 31; i++) {time[i] = timeValue[i];monthdatestrStrings[i] = timeValue[i];}break;// 对于2月份需要判断是否为闰年case 2:if ((yearString % 4 == 0 && yearString % 100 != 0)|| (yearString % 400 == 0)) {time = new String[29];monthdatestrStrings = new String[29];for (int i = 0; i < 29; i++) {time[i] = timeValue[i];monthdatestrStrings[i] = timeValue[i];}break;} else {time = new String[28];monthdatestrStrings = new String[28];for (int i = 0; i < 28; i++) {time[i] = timeValue[i];monthdatestrStrings[i] =  timeValue[i];}break;}case 4:case 6:case 9:case 11:time = new String[30];monthdatestrStrings = new String[30];for (int i = 0; i < 30; i++) {time[i] = timeValue[i];monthdatestrStrings[i] = timeValue[i];}break;}/*********************************** 获取一个月的日期结束 **************************************/// 年度交易情况List purchaseinfonList = new ArrayList();purchaseinfonList = tenant_purchaseinfoService.findResultListByYearOrMonth("%d", "%m", monthString);int listlen = purchaseinfonList.size(); // 从数据库中查询出来的数据长度int monthlen = time.length; // 月份的长度int Dvalue = monthlen - listlen;// list 中的某条数据放到数组中double[] arrList = new double[time.length];String[] monthdate = new String[monthdatestrStrings.length];// 取出日期for (int i = 0; i < monthlen; i++) {if (listlen < i + 1) {monthdate[i] = "";} else {Map map = (Map) purchaseinfonList.get(i);monthdate[i] = map.get("month").toString();}}// 取出总数for (int j = 0; j < listlen; j++) {for (int i = 0; i < monthlen; i++) {if (monthdate[j].equals(time[i])) {Map map = (Map) purchaseinfonList.get(j);arrList[i] = (Double)map.get("purchaseCount");}}}// 添加数据值for (int i = 0; i < time.length; i++) {linedatasetByMonth.addValue(arrList[i], series, // 值monthdatestrStrings[i]); // 对应的横轴}return linedatasetByMonth;}


按季度统计的数据绑定:

/** * 按季度统计 * @return */@SuppressWarnings("null")public DefaultCategoryDataset createDatasetByQuarter() {DefaultCategoryDataset linedatasetByQuarter = new DefaultCategoryDataset();// 曲线名称String series = "市场交易统计"; // series指的就是报表里的那条数据线/*********************************获取一个月的日期****************************************///获取当前年份  Calendar cal = Calendar.getInstance();// 横轴名称(列名称)  int  monthInt=cal.get(Calendar.MONTH)+1; //获取当前月份// 横轴名称(列名称)  String  monthString=String.valueOf(monthInt);  String  yearString=String.valueOf(cal.get(Calendar.YEAR)); //获取当前年份    String[] time = new String[3];   String[] monthdatestrStrings =new String[3];  switch (monthInt) {        case 1:        case 2:        case 3:               String[] timeValue = { "1", "2", "3" };        for (int i = 0; i < timeValue.length; i++) {        time[i] = timeValue[i];monthdatestrStrings[i] =monthString+"-"+timeValue[i];}            break;            //对于2月份需要判断是否为闰年        case 4:        case 5:        case 6:        String[] timeValue1 = { "4", "5", "6" };            for (int i = 0; i < timeValue1.length; i++) {                        time[i] = timeValue1[i];    monthdatestrStrings[i] =yearString+"-"+timeValue1[i];            }                break;                                        case 7:        case 8:        case 9:        String[] timeValue2 = { "7", "8", "9" };        for (int i = 0; i < timeValue2.length; i++) {        time[i] = timeValue2[i];monthdatestrStrings[i] =yearString+"-"+timeValue2[i];}            break;        case 10:        case 11:        case 12:        String[] timeValue3 = { "10", "11", "12" };        for (int i = 0; i < timeValue3.length; i++) {        time[i] = timeValue3[i];monthdatestrStrings[i] =yearString+"-"+timeValue3[i];}        break;  }/***********************************获取一个月的日期结束**************************************/  // 年度交易情况  List purchaseinfonList = new ArrayList();purchaseinfonList = tenant_purchaseinfoService.findResultListByQuarter(yearString,time[0],time[2] );int listlen = purchaseinfonList.size(); // 从数据库中查询出来的数据长度int monthlen = time.length; // 月份的长度int Dvalue = monthlen - listlen;//list 中的某条数据放到数组中double[] arrList=new double[time.length];String[] monthdate =new String[monthdatestrStrings.length];// 取出日期for (int i = 0; i < monthlen; i++) {if (listlen < i + 1) {monthdate[i] = "";} else {Map map = (Map) purchaseinfonList.get(i);monthdate[i] = map.get("month").toString();}}// 取出总数for (int j = 0; j < listlen; j++) {for (int i = 0; i < monthlen; i++) {if (monthdate[j].equals(time[i])) {Map map = (Map) purchaseinfonList.get(j);arrList[i] = (Double)map.get("purchaseCount");}}}// 添加数据值for (int i = 0; i < time.length; i++) {linedatasetByQuarter.addValue(arrList[i], series, // 值monthdatestrStrings[i]); // 对应的横轴}return linedatasetByQuarter;}


按年统计的数据绑定:

/** * 按年统计 * @return */@SuppressWarnings("null")public DefaultCategoryDataset createDatasetByYear() {DefaultCategoryDataset linedatasetByYear = new DefaultCategoryDataset();// 曲线名称String series = "市场交易统计"; // series指的就是报表里的那条数据线String[] time = new String[12];String[] month = new String[12];//获取当前年份  Calendar cal = Calendar.getInstance();// 横轴名称(列名称)  String  year=String.valueOf(cal.get(Calendar.YEAR));  System.out.println(cal.get(Calendar.YEAR));  System.out.println(year);  //设置1年12个月,为从数据库中取出每个月对应的统计数据String[] timeValue = { "1", "2", "3", "4", "5", "6", "7", "8","9", "10", "11", "12" };for (int i = 0; i < timeValue.length; i++) {time[i] = timeValue[i];month[i] =year+"-"+timeValue[i];}// 年度交易情况  List purchaseinfonList = new ArrayList();purchaseinfonList = tenant_purchaseinfoService.findResultListByYearOrMonth("%c","%Y", year);int listlen = purchaseinfonList.size(); // 从数据库中查询出来的数据长度int monthlen = time.length; // 月份的长度int Dvalue = monthlen - listlen;//list 中的某条数据放到数组中double[] arrList=new double[time.length];String[] monthdate = new String[12];// 取出月份for (int i = 0; i < monthlen; i++) {if (listlen < i + 1) {monthdate[i] = "";} else {Map map = (Map) purchaseinfonList.get(i);monthdate[i] = map.get("month").toString();}}// 取出总数for (int j = 0; j < listlen; j++) {for (int i = 0; i < monthlen; i++) {if (monthdate[j].equals(time[i])) {Map map = (Map) purchaseinfonList.get(j);arrList[i] = (Double)map.get("purchaseCount");}}}// 添加数据值for (int i = 0; i < time.length; i++) {linedatasetByYear.addValue(arrList[i], series, // 值month[i]); // 对应的横轴}return linedatasetByYear;}

刚开始做的时候,遇到的问题不少,感觉是一头乱麻,后来把问题分解分解再分解,一个个来解决,最后所有的问题都不再是问题了。

0 0
原创粉丝点击