最近对jfreechat制作图形报表进行了总结,将一些要点记录下来,以备不时之需!
JFreeChart是JAVA平台上的一个开放的图表绘制类库。它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计。JFreeChart可生成饼图(pie charts)、柱状图(bar charts)、散点图(scatter plots)、时序图(time series)、甘特图(Gantt charts)等等多种图表,并且可以产生PNG和JPEG格式的输出,还可以与PDF和EXCEL关联。
关联jar包
jfreechart-1.0.11.jar、jcommon-1.0.14.jar
spring与jfreechart结合开发
web.xml
<servlet>
<servlet-name>DisplayChart</servlet-name>
<servlet-class>
org.jfree.chart.servlet.DisplayChart
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayChart</servlet-name>
<url-pattern>/servlet/DisplayChart</url-pattern>
</servlet-mapping>
当然,这里的URL前缀可以自己设置!
JFreeChartUtils。这里以折线图为例:
public static String createLineChart(HttpSession session,
CategoryDataset dataset, String title, String xtitle,
String ytitle, int width, int height, PrintWriter pw) {
String filename = "";
JFreeChart jfreechart = ChartFactory.createLineChart(title, xtitle,
ytitle, dataset, PlotOrientation.VERTICAL, true, true, true);
jfreechart.setTitle(new TextTitle(title,
new Font("黑体", Font.ITALIC, 20)));// 重新设置图表标题,改变字体
jfreechart.getTitle().setFont(new Font("黑体", Font.ITALIC, 20)); // 解决标题乱码
jfreechart.setBackgroundPaint(Color.white); // 设定背景色为白色
CategoryPlot plot = (CategoryPlot) jfreechart.getPlot(); // 获得
plot.setBackgroundPaint(Color.lightGray); // 设定图表数据显示部分背景色
plot.setDomainGridlinePaint(Color.white); // 横坐标网格线白色
plot.setDomainGridlinesVisible(true); // 网格线
plot.setRangeGridlinePaint(Color.white); // 纵坐标网格线白色
plot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D)); // 设定坐标轴与图表数据显示部分距离
CategoryAxis categoryAxis = plot.getDomainAxis();// 取得横轴
categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);// 设置分类标签以45度角倾斜
Font font = new Font("宋体", Font.BOLD, 16);
categoryAxis.setLabelFont(font);// 设置横轴显示标签的字体
categoryAxis.setTickLabelFont(font); // 解决横坐标乱码
NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();// 取得纵轴
numberAxis.setLabelFont(font);// 设置纵轴显示标签的字体
numberAxis.setTickLabelFont(font); // 解决纵坐标乱码
numberAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());// 使纵坐标的最小单位格为整数
numberAxis.setAutoRangeIncludesZero(true);
StandardEntityCollection sec = new StandardEntityCollection();
ChartRenderingInfo info = new ChartRenderingInfo(sec);
try {
filename = ServletUtilities.saveChartAsPNG(jfreechart, width,
height, info, session);
ChartUtilities.writeImageMap(pw, filename, info, false);
pw.flush();
} catch (IOException e) {
e.printStackTrace();
}
return filename;
}
这里需要说明的是关于中文乱码的问题,其实很简单,只要设置相应的字体就好了!有很多朋友对 ChartUtilities.writeImageMap(pw, filename, info, false); 这句代码有些疑惑,这里结合页面代码进行说明!
jsp代码:
<img src="${file}" border=0 usemap="#${filename}">
生成的页面源码:
<map id="jfreechart-62526.png" name="jfreechart-62526.png">
<area shape="poly" coords="727,43,733,43,733,49,727,49,727,43,727,43" title="(在线用户数, 07-26 11:55) = 44" alt="" href="index.html?series=%E5%9C%A8%E7%BA%BF%E7%94%A8%E6%88%B7%E6%95%B0&category=07-26+11%3A55"/>
<area .... />
</map>
<img src="/gameCenter/servlet/DisplayChart?filename=jfreechart-62526.png" border=0 usemap="#jfreechart-62526.png">
可以注意到img的usemap标签是关键点!usemap 属性将图像定义为客户端图像映射。图像映射指的是带有可点击区域的图像。详细资料请参考
img的usemap标签。如而生成的页面代码中<map>......</map>部分正是ChartUtilities.writeImageMap(pw, filename, info, false);所生成!这样当你鼠标移动到生成的图标的某一个部分时,就会显示对应的title,点击会跳转到相应的url等。
当然这里也会出现中文乱码的问题,解决办法也很简单,只要在response中做下编码设置就OK了!
response.setContentType("text/html;charset=UTF-8");
Writer out = response.getWriter();
PrintWriter pw=new PrintWriter(out);