用Jfreechar 实现基于web 的折线图

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

用Jfreechar 实现基于web 的折线图_第1张图片

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

	/**
	 * 绘图
	 * @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;
	}
	

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

你可能感兴趣的:(用Jfreechar 实现基于web 的折线图)