我们这里直接在数据库中把我们上文中生成的数据,取出来放到TimeSeries中,然后我们用jfreechart的工厂生成我们想要的曲线图,
TradeLogServiceImpl tradeService = (TradeLogServiceImpl) ctx.getBean("testtrade"); // user online MapuserPeak = 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传输到页面上去生成图片.