日志统计平台3之Jfreechart显示篇

阅读更多
jfreechart功能十分强大了,在我们平台中用到了柱图和曲线图,下面我就来讲讲这两种图,先讲曲线图,由于客户要看到每日的分钟走势图,所以就像股票的分时一样,我们要把每一天中每一分钟内的在线用户及访问量还有它们分别出现的峰值标示出来.由于是分钟走势啊,所以我们就用到了jfreechart中的TimeSeries,首先要用它来创建dataset,如果对jfreechart不了解的用户,自行去看guide手册,画图要分三步来进行,一,创建dataset,二,创建chart,三,生成图片
我们这里直接在数据库中把我们上文中生成的数据,取出来放到TimeSeries中,然后我们用jfreechart的工厂生成我们想要的曲线图,
TradeLogServiceImpl tradeService = (TradeLogServiceImpl) ctx.getBean("testtrade");
			// user online
			Map userPeak = new HashMap();
			List list = tradeService.getUserOnline(start);
			if (list.size() != 0) {
				TimeSeries s1 = new TimeSeries("分钟在线用户", Minute.class);
				for (int i = 0; i < list.size(); i++) {

					TradeUserOnline userOnline = (TradeUserOnline) list.get(i);
					s1.addOrUpdate(/*add(*/new Minute(userOnline.getOnlinetime()), userOnline.getOnlinecount());
					userPeak.put(userOnline.getOnlinecount(), userOnline.getOnlinetime());
				}

				Object[] objs = userPeak.keySet().toArray();
				java.util.Arrays.sort(objs);

				userPeakValue = (Integer) objs[objs.length - 1];
				userTime = userPeak.get(userPeakValue);
				dataset.addSeries(s1);
			} else {
				logger.error(start+" 没有交易在线用户数据");
			}
			logger.info(start+" userPeakValue=" + userPeakValue);
			logger.info(start+" userTime=" + userTime);
JFreeChart chart = ChartFactory.createTimeSeriesChart(start + " 每分钟在线用户走势图", // 图表标题
					"时间", // 目录轴的显示标签
					"用户数", // 数值轴的显示标签
					dataset, // 数据集
					true, // 是否显示图例()
					false, // 是否生成工具
					false // 是否生成URL链接
					);


上面我们就生成了分钟在线用户的dataset,然后生成分钟在线用户的时间序列.peakvalue是峰值,peaktime是峰值出现的时间.我们下面会用这两个去做注释.
if (userPeakValue != null && accessPeakValue != null && accessTime != null && userTime != null) {
		        Font font = new Font("SansSerif", Font.BOLD, 12);
				// 添加在线用户注释
				XYTextAnnotation userAnn = new XYTextAnnotation(userPeakValue + " 峰值时间:\n\r" + format(userTime), userTime.getTime(), userPeakValue);
				userAnn.setFont(font);
				userAnn.setTextAnchor(TextAnchor.HALF_ASCENT_LEFT);
				plot.addAnnotation(userAnn);

注意上面XYTextAnnotation 的构造方法,jfreechartAPI里后面两个参数是double,double,这里我们将时间系列的时间转化为long型的秒来用作domain axis,int型的值做为峰值,其实都是强制转化为double.这里一定要注意domain axis,我一开始陷入误区,以为timeseries的无法实现注释呢,后来经架构师一点拔,才悟出来的.:=(
生成图片的时候,我们可以将domain axis的日期格式化一下,
			DateAxis axis = (DateAxis) plot.getDomainAxis();
			axis.setDateFormatOverride(new SimpleDateFormat("yyyy-MM-dd HH:mm"));

生成jfreechart图的最后一步是: 将chart用流输出到jsp页面上展示啊
用到jfreechart的类
//流的目的地,chart,及图片的宽和高
ChartUtilities.writeChartAsPNG(response.getOutputStream(), chart, width, height);

好了,时间系列图就完成了.下面我们来说下柱图
柱图用CategoryDataset来保存数据集合,一般用
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		for (int i = 0; i < list.size(); i++) {

			TradelogsCommon log = (TradelogsCommon) list.get(i);
			String y = log.getOperatingresults();
			if (y.equals("Y")) {
				y = "成功";
			} else if (y.equals("N")) {
				y = "失败";
			}
			dataset.setValue(log.getOperatenumbers(), y, log
					.getSalesdepcodename().getSalesdepname());
		}


数据集合生成了然后再用chart工厂来生成柱图
JFreeChart chart = ChartFactory.createBarChart3D(start
					+ " 按时间点 " + opt + "操作 访问量统计图", // 图表标题
					"XXXX", // 目录轴的显示标签
					"访问量", // 数值轴的显示标签
					dataset, // 数据集
					PlotOrientation.VERTICAL, // 图表方向:水平、垂直
					true, // 是否显示图例(对于简单的柱状图必须是false)
					false, // 是否生成工具
					false // 是否生成URL链接
					);
.............

			ChartUtilities.writeChartAsPNG(response.getOutputStream(), chart,
					width, height);

最后还是用流将chart传输到页面上去生成图片.

你可能感兴趣的:(jfreechart,JSP)