一:jfreechart介紹
jfreechart是一個免費創建圖片的java工具.可以創建如下圖形:
餅圖(pie charts;)
曲線圖(line charts )
柱狀圖(horizontal/vertical bar charts)
甘特圖(Gantt charts; )
XY plots and scatter plots;
time series, high/low/open/close charts and candle stick charts;
combination charts;
Pareto charts;
bubble charts;
wind plots, meter charts and symbol charts;
從以下地址可以看到jfreechart可以創建的圖形類型
http://www.jfree.org/jfreechart/samples.html
sourceforge有一個基於jfreechart的項目Cewolf可以很方便的在jsp/servlet中創建圖片
jfreechart目前(2003-05-08)版本為0.98
希望得到詳細的信息或下載jfreechart請訪問如下站點:
http://www.jfree.org/jfreechart/
二:特別說明:
jfreechart是一個開源項目,但是文檔是需要40美金去購買的。
還有一個很重要的問題,jfreechart如果使用中文,他使用的默認字體
顯示出來的中文會很模糊,你可能需要修改源代碼。
下面我就舉幾個簡單的例子說明一下如何使用jfreechart創建圖片
在開發中有可能會導入以下的類
import com.jrefinery.chart.ChartFactory;
import com.jrefinery.chart.ChartUtilities;
import com.jrefinery.chart.JFreeChart;
import com.jrefinery.chart.TextTitle;
import com.jrefinery.chart.axis.NumberAxis;
import com.jrefinery.chart.plot.CategoryPlot;
import com.jrefinery.chart.plot.PiePlot;
import com.jrefinery.data.Day;
import com.jrefinery.data.DefaultCategoryDataset;
import com.jrefinery.data.DefaultPieDataset;
import com.jrefinery.data.TimeSeries;
import com.jrefinery.data.TimeSeriesCollection;
import com.jrefinery.data.TimeSeriesDataPair;
在0.98以後包由com.jrefinery.*改變為:org.jfree
三:創建餅圖
//圖片標題
String title = "空調2002年市場占有率";
//設定數據源
DefaultPieDataset piedata = new DefaultPieDataset();
//第一個參數為名稱,第二個參數是double數
piedata.setValue("聯想", 27.3);
piedata.setValue("長城", 12.2);
piedata.setValue("海爾", 5.5);
piedata.setValue("美的", 17.1);
piedata.setValue("松下", 9.0);
piedata.setValue("科龍", 19.0);
//創建JFreeChart,都使用ChartFactory來創建JFreeChart,很標准的工廠設計模式
JFreeChart chart =
ChartFactory.createPieChart(title, piedata, true, true, true);
//設定圖片標題
chart.setTitle(new TextTitle(title, new Font("隸書", Font.ITALIC, 15)));
//chart.addSubtitle(new TextTitle("2002財年分析", new Font("隸書", Font.ITALIC, 12)));
//設定背景
chart.setBackgroundPaint(Color.white);
//chart.s
//餅圖使用一個PiePlot
PiePlot pie = (PiePlot)chart.getPlot();
//pie.setSectionLabelType(PiePlot.NAME_AND_PERCENT_LABELS);
pie.setSectionLabelType(PiePlot.NAME_AND_VALUE_LABELS);
//設定顯示格式(名稱加百分比或數值)
pie.setPercentFormatString("#,###0.0#%");
//設定百分比顯示格式
pie.setBackgroundPaint(Color.white);
pie.setSectionLabelFont(new Font("黑體", Font.TRUETYPE_FONT, 12));
//設定背景透明度(0-1.0之間)
pie.setBackgroundAlpha(0.6f);
//設定前景透明度(0-1.0之間)
pie.setForegroundAlpha(0.90f);
//輸出文件到指定目錄
String rfname = MathUtil.getRoundCode(12) + ".jpeg";
String fileName = "d:/test/" + rfname;
try {
//可以保存文件為jpg或png格式。
ChartUtilities.saveChartAsJPEG(new File(fileName), 100, chart, 600, 600);
//第一個參數為文件名
//第二個參數質量
//第三個參數為哪個chart創建圖片
//第四個寬度
//第五個高度
} catch (IOException exz) {
System.out.print("....Cant't Create image File");
}
其實使用JFreeChart創建圖片很簡單,不同的的圖片類型區別在於設置數據集
四:創建曲線圖
// create a default chart based on some sample data...
//曲線圖標題
String title = "趨勢分析";
//曲線圖X軸提示
String domain = "月份走勢";
//曲線圖Y軸提示
String range = "應收余額";
//曲線圖自標題
String subtitleStr = "2003財年分析";
//創建時間數據源
//每一個TimeSeries在圖上是一條曲線
TimeSeries ca = new TimeSeries("用友");
for (int i = 1999; i < 2005; i++) {
for (int mon = 0; mon < 12; mon++) {
//ca.add(new Month(mon + 1, i), new Double(500 + Math.random() * 100));
//TimeSeriesDataPair是一個時間點的數值體現
ca.add(
new TimeSeriesDataPair(
new Day(1, mon + 1, i),
new Double(500 + Math.random() * 100)));
}
}
TimeSeries ibm = new TimeSeries("金碟");
for (int i = 1999; i < 2005; i++) {
for (int mon = 0; mon < 12; mon++) {
//ibm.add(new Month(mon+1,i),new Double(400-Math.random()*100));
ibm.add(
new TimeSeriesDataPair(
new Day(1, mon + 1, i),
new Double(400 - Math.random() * 100)));
}
}
TimeSeries king = new TimeSeries("東軟");
for (int i = 1999; i < 2005; i++) {
for (int mon = 0; mon < 12; mon++) {
//ibm.add(new Month(mon+1,i),new Double(400-Math.random()*100));
king.add(
new TimeSeriesDataPair(
new Day(1, mon + 1, i),
new Double(300 - Math.random() * 100)));
}
}
//時間曲線數據集合
TimeSeriesCollection dataset = new TimeSeriesCollection();
dataset.addSeries(ca);
dataset.addSeries(ibm);
dataset.addSeries(king);
//dataset.addSeries(jpy);
//dataset.addSeries(mav);
//時間曲線元素
JFreeChart chart =
ChartFactory.createTimeSeriesChart(
title,
domain,
range,
dataset,
true,
true,
false);
// then customise it a little...
TextTitle subtitle =
new TextTitle(subtitleStr, new Font("黑體", Font.BOLD, 12));
chart.addSubtitle(subtitle);
chart.setTitle(new TextTitle(title, new Font("隸書", Font.ITALIC, 15)));
//pie.setSeriesLabelFont(new Font("黑體", Font.BOLD, 15));
chart.setBackgroundPaint(
new GradientPaint(0, 0, Color.white, 0, 1000, Color.blue));
//sysout
//輸出文件到指定目錄
String rfname = MathUtil.getRoundCode(22) + ".jpeg";
String fileName = "d:/test/" + rfname;
try {
//for
//System.out.println();
ChartUtilities.saveChartAsJPEG(new File(fileName), 100, chart, 600, 600);
// log.info("....Create image File:" + fileName);
} catch (IOException exz) {
System.out.print("....Cant't Create image File");
}
五:創建柱狀圖
String title = "柱狀圖測試";
String domain = "單位比較";
String range = "數值";
//CategoryDataset data = DemoDatasetFactory.createCategoryDataset();
DefaultCategoryDataset data = new DefaultCategoryDataset();
for (int r = 0; r < 5; r++) {
String rowKey = "單位 [" + (r + 1)+"]" ;
//第一層循環:分析對象
for (int c = 0; c < 6; c++) {
//第二層循環:分析對象在時間點上的數據
String columnKey = "2001年" + (c + 1) + "月";
data.addValue(new Double(r * c + 5), rowKey, columnKey);
}
}
JFreeChart chart =
ChartFactory.createVerticalBarChart(
title,
domain,
range,
data,
true,
true,
false);
// then customise it a little...
chart.setBackgroundPaint(
new GradientPaint(0, 0, Color.white, 1000, 0, Color.red));
chart.setTitle(new TextTitle(title, new Font("隸書", Font.ITALIC, 15)));
CategoryPlot plot = (CategoryPlot)chart.getPlot();
plot.setForegroundAlpha(0.9f);
plot.setValueLabelFont(new Font("黑體", Font.TRUETYPE_FONT, 12));
//plot.setSectionLabelFont(new Font("黑體", Font.TRUETYPE_FONT, 12));
//注意以下代碼
NumberAxis verticalAxis = (NumberAxis)plot.getRangeAxis();
verticalAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
// 輸出文件到指定目錄
String rfname = MathUtil.getRoundCode(22) + "b.jpeg";
String fileName = "d:/test/" + rfname;
try {
ChartUtilities.saveChartAsJPEG(new File(fileName), 100, chart, 600, 600);
// log.info("....Create image File:" + fileName);
} catch (IOException exz) {
System.out.print("....Cant't Create image File");
}
六:結束語
個人感覺JFreeChart可以滿足大部分圖片創建的需要,美中不足的是:對字體的設置做的不夠好,特別是使用中文的時候字體很不清晰。因為這個原因建議你自己去修改他的源代碼,最好使用properties文件去設置字體.還有就是文檔要錢所以要多花點時間去看源代碼。或多上社區.因為時間等原因我只介紹了三種圖片的創建,其他類型的圖片可以參考jfreechart提供的例子。