用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
- 用Jfreechar 实现基于web 的折线图
- jfreechar做好的折线+曲线图
- (四)JFreeChar 折线图
- 使用Jfreechar 实现基于web 的2D/3D饼图
- jfreeChar 绘制图表(含柱状图、折线图、饼状图)
- 用web chart控件实现折线,柱状,扇形图
- Android 折线图的实现
- MPAndroidChart实现的折线图
- HighCharts 折线图的实现
- 对jfreechar的使用健康图(1)
- 基于VML与HTML5 Canva实现的跨浏览器饼图与折线图
- 基于SpringMVC框架使用ECharts3.0实现折线图,柱状图,饼状图,的绘制(上篇)
- 基于折线生成平行线的C#算法实现
- 用eCharts实现折线图的一些总结
- asp.net[2.0] 用Web Chart 实现折线、柱状、扇形图
- asp.net[2.0] 用Web Chart 实现折线、柱状、扇形图
- WebChart实现折线,柱状,扇形图--web chart控件
- 用JFreeChart实现基于Web的柱状图
- final关键字有何作用
- NTP--将本主机设置为NTP时钟源,供本机或其他主机使用
- cache使用
- puppy linux 安装到u盘
- 第十三周上机项目五2.3
- 用Jfreechar 实现基于web 的折线图
- 第十三周OJ任务逆序输出
- 第十三周项目6-体验文件操作(实战-改编english.dat)
- 《Linux设备驱动程序》——PCI驱动程序
- 查看LINUX中什么时间,谁在连接命令
- java.lang.NoSuchMethodError: org.springframework.core.GenericTypeResolver.resolveTypeArguments
- 第十三周项目五—字符串的复制之去空格
- asp.net用户自定义控件的方法
- 第13周项目5(1)-统计字母'A'出现的次数