在工作中,我們常常碰到需要在網頁上繪制統計圖的例子。其實實現的辦法有很多,我們可以親自編寫全部圖形生成代碼,比如用flash,或者用svg,這樣做代碼量很大,還容易出錯,很煩的。也可以利用現成的java統計圖表庫。例如用jclass(http://java.quest.com/jclass/jclass.shtml),可是這玩藝卻是要收費的。對於我們這種崇尚open source的程序員來說,有沒有一個開源的統計圖形庫呢。有,它就是www.jfree.org推出的jfreechart包,它從柱形圖,餅形圖,到雷達圖,蠟燭圖等等無所不包,可以在c/s,b/s,甚至是實時環境都能一顯身手。最關鍵的是它是open source!我在這裡給出一個在網頁上繪制餅形圖的簡單例子。
1、到www.jfree.org下載一個最新的java庫,置jfreechart.jar和jcommon.jar.jar於classpath中
2、編寫一個java bean,用來生成餅形圖。(GSPieChart.java)
package gov.gwssi.tax.nspg.datadisposal;
import java.awt.Insets;
import java.awt.Image;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Locale;
import java.text.NumberFormat;
import javax.servlet.http.HttpSession;
import org.jfree.data.*;
import org.jfree.chart.*;
import org.jfree.chart.axis.*;
import org.jfree.chart.renderer.VerticalBarRenderer;
import org.jfree.chart.renderer.StandardXYItemRenderer;
import org.jfree.chart.plot.*;
import org.jfree.chart.entity.*;
import org.jfree.chart.tooltips.*;
import org.jfree.chart.urls.*;
import org.jfree.chart.servlet.*;
import java.awt.Font;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author jagie
* @version 1.0
*/
public class GSPieChart
{
public static void main(String[] args)
{
Long[] testData =
{
new Long(10), new Long(20), new Long(30), new Long(40)
} ;
generatePieChart(testData, "", null, new PrintWriter(System.out), 580, 250);
}
/**
* 生成圖像文件
* @param datas Long[]數組
* @param targetUrl 點餅形圖上的扇形,定向到的url
* @param session httpsession
* @param pw PrintWriter
* @param w 生成的圖的寬度
* @param h 生成的圖的高度
* @return 生成的圖像文件的路徑
*/
public static String generatePieChart
(Long[] datas, String targetUrl,
HttpSession session,
PrintWriter pw, int w, int h)
{
String filename = null;
try
{
DefaultPieDataset data = new DefaultPieDataset();
data.setValue("正常納稅人", datas[0]);
data.setValue("異常納稅人", datas[1]);
data.setValue("數據不全納稅人", datas[2]);
data.setValue("未處理納稅人", datas[3]);
// Create the chart object
Pie3DPlot plot = new Pie3DPlot(data);
plot.setInsets(new Insets(0, 5, 5, 5));
plot.setForegroundAlpha(0.6f);
plot.setSectionLabelType(plot.NO_LABELS);
plot.setURLGenerator(new StandardPieURLGenerator(targetUrl, "type"));
plot.setToolTipGenerator(new StandardPieToolTipGenerator());
JFreeChart chart = new JFreeChart("數據處理結果統計圖", JFreeChart.DEFAULT_TITLE_FONT, plot, true);
chart.setTitle(new TextTitle("數據處理結果統計圖", new Font("黑體", Font.BOLD, 15)));
StandardLegend sl = (StandardLegend) chart.getLegend();
sl.setItemFont(new Font("黑體", Font.TRUETYPE_FONT, 12));
chart.setBackgroundPaint(new java.awt.Color(254, 254, 141));
// 因為jfreechart把生成的png文件保存在系統的臨時文件夾中,你需要在適當的
//時候調用session.removeAttribute("JFreeChart_Deleter"),這樣可以保證png文
//件被刪除掉
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
filename = ServletUtilities.saveChartAsPNG(chart, w, h, info, session);
// Write the image map to the PrintWriter
ChartUtilities.writeImageMap(pw, filename, info); pw.flush();
} catch (Exception e)
{
System.out.println("Exception - " + e.toString());
e.printStackTrace(System.out);
filename = "public_error_500x300.png";
}
return filename;
}
}
3、在一個jsp文件中使用這個javabean來生成圖像,以下是代碼片斷
java代碼
<%
//以下部分為圖象輸出
String argetUrl="../servlet/gov.gwssi.tax.nspg.controlservlet.GSMainControlServlet?id="+sid;Long[] datas={normals,new Long(totalAbnormal),dataLacks,notProcesses};
String filename=GSPieChart.generatePieChart(datas,targetUrl,session,new PrintWriter(out),580,250);
String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;
%>
html代碼
<!-- pie chart -->
<table width="580" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
<img src="<%= graphURL %>" width=580 height=250 border=0 usemap="#<%=filename %>">
</td>
</tr>
</table>
4、在web.xml中配置jfreechart的圖像生成的servlet
<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>
以上就是在b/s中使用jfreechart的大體步驟,在你下載的jfreechart的sample文件夾中找到jfreechart-sample.war文件中也有類似的例子,只不過復雜一些。
最後,希望這篇文章能對你有所啟發。如有錯誤之處,歡迎批評指正。