------------------------------------------------------------------------------------------
jfreechart文檔居然是收費(fèi)的,在網(wǎng)上找了好多資料都是針對(duì)1。0之前的版本的,好入容易找到一個(gè)1.0下面可以用的
package com.meetexpo.cms.backend.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.RenderingHints;
import java.io.PrintWriter;
import javax.servlet.http.HttpSession;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.labels.CategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
public class CategoryItemChart {
public static String generateBarChart(
HttpSession session,
PrintWriter pw,
int w, int h) {
String filename = null;
try {
CategoryDataset dataset=createDataset();
JFreeChart chart=ChartFactory.createBarChart(
"世界傻瓜大獎(jiǎng)賽",//圖表標(biāo)題
"比賽場(chǎng)次",//X軸標(biāo)題
"傻瓜程度",//Y軸標(biāo)題
dataset,//數(shù)據(jù)集合
PlotOrientation.VERTICAL,//圖表顯示方向(水平、垂直)
true,//是否使用圖例
false,//是否使用工具提示
false//是否為圖表增加URL
);
/*------------配置圖表屬性--------------*/
// 1,設(shè)置整個(gè)圖表背景顏色
chart.setBackgroundPaint(Color.yellow);
/*------------設(shè)定Plot參數(shù)-------------*/
CategoryPlot plot=chart.getCategoryPlot();
// 2,設(shè)置詳細(xì)圖表的顯示細(xì)節(jié)部分的背景顏色
plot.setBackgroundPaint(Color.PINK);
// 3,設(shè)置垂直網(wǎng)格線顏色
plot.setDomainGridlinePaint(Color.black);
//4,設(shè)置是否顯示垂直網(wǎng)格線
plot.setDomainGridlinesVisible(true);
//5,設(shè)置水平網(wǎng)格線顏色
plot.setRangeGridlinePaint(Color.yellow);
//6,設(shè)置是否顯示水平網(wǎng)格線
plot.setRangeGridlinesVisible(true);
/*---------將所有數(shù)據(jù)轉(zhuǎn)換為整數(shù)形式---------*/
final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
/*---------設(shè)置是否在柱圖的狀態(tài)條上顯示邊框----*/
CategoryItemRenderer renderer = (CategoryItemRenderer) plot.getRenderer();
BarRenderer render=(BarRenderer) plot.getRenderer();
render.setItemMargin(0.1);
/*---------設(shè)置狀態(tài)條顏色的深淺漸變-----------*/
GradientPaint gp0 = new GradientPaint(
0.0f, 0.0f, new Color(255,200,80),
0.0f, 0.0f, new Color(255,255,40)
);
GradientPaint gp1 = new GradientPaint(
0.0f, 0.0f, new Color(50,255,50),
0.0f, 0.0f, new Color(100,255,100)
);
GradientPaint gp2 = new GradientPaint(
0.0f, 0.0f, Color.red,
0.0f, 0.0f, new Color(255,100,100)
);
GradientPaint gp3 = new GradientPaint(
0.0f, 0.0f, new Color(108,108,255),
0.0f, 0.0f, new Color(150, 150, 200)
);
renderer.setSeriesPaint(0, gp0);
renderer.setSeriesPaint(1, gp1);
renderer.setSeriesPaint(2, gp2);
renderer.setSeriesPaint(3, gp3);
/*
*
* 解決柱狀體與圖片邊框的間距問(wèn)題
*
*
* */
/*------設(shè)置X軸標(biāo)題的傾斜程度----*/
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setCategoryLabelPositions(
CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 6.0)
);
/*------設(shè)置柱狀體與圖片邊框的左右間距--*/
domainAxis.setLowerMargin(0.01);
domainAxis.setUpperMargin(0.01);
/*------設(shè)置柱狀體與圖片邊框的上下間距---*/
ValueAxis rAxis = plot.getRangeAxis();
rAxis.setUpperMargin(0.15);
rAxis.setLowerMargin(0.15);
/*---------設(shè)置每一組柱狀體之間的間隔---------*/
render.setItemMargin(0.0);
/*
*
* 解決柱狀體與圖片邊框的間距問(wèn)題
*
*
* */
/*
*
*
* 解決JFREECHART的中文顯示問(wèn)題
*
*
* */
/*----------設(shè)置消除字體的鋸齒渲染(解決中文問(wèn)題)--------------*/
chart.getRenderingHints().put(
RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF
);
/*----------設(shè)置標(biāo)題字體--------------------------*/
TextTitle textTitle = chart.getTitle();
textTitle.setFont(new Font("黑體", Font.PLAIN, 20));
/*------設(shè)置X軸坐標(biāo)上的文字-----------*/
domainAxis.setTickLabelFont(new Font("sans-serif",Font.PLAIN,11));
/*------設(shè)置X軸的標(biāo)題文字------------*/
domainAxis.setLabelFont(new Font("宋體",Font.PLAIN,12));
/*------設(shè)置Y軸坐標(biāo)上的文字-----------*/
rAxis.setTickLabelFont(new Font("sans-serif",Font.PLAIN,12));
/*------設(shè)置Y軸的標(biāo)題文字------------*/
rAxis.setLabelFont(new Font("黑體",Font.PLAIN,12));
/*---------設(shè)置柱狀體上的顯示的字體---------*/
renderer.setItemLabelGenerator(new LabelGenerator(0.0));
renderer.setItemLabelFont(new Font("宋體",Font.PLAIN,12));
renderer.setItemLabelsVisible(true);
/*
*
*
* 解決JFREECHART的中文顯示問(wèn)題
*
*
* */
/*------得到chart的保存路徑----*/
ChartRenderingInfo info = new ChartRenderingInfo(new
StandardEntityCollection());
filename = ServletUtilities.saveChartAsPNG(chart, w, h, info, session);
/*------使用printWriter將文件寫出----*/
ChartUtilities.writeImageMap(pw, filename, info,true);
pw.flush();
}
catch (Exception e) {
System.out.println("Exception - " + e.toString());
e.printStackTrace(System.out);
filename = "public_error_500x300.png";
}
return filename;
}
/*-------------設(shè)置柱狀體頂端的數(shù)據(jù)顯示--------------*/
static class LabelGenerator implements CategoryItemLabelGenerator {
private double threshold;
public LabelGenerator(double threshold) {
this.threshold = threshold;
}
public String generateLabel(CategoryDataset dataset,
int row,int column) {
String result = null;
final Number value = dataset.getValue(row, column);
if (value != null) {
final double v = value.doubleValue();
if (v > this.threshold) {
result = value.toString();
}
}
return result;
}
public String generateRowLabel(CategoryDataset dataset,
int row){
return null;
}
public String generateColumnLabel(CategoryDataset dataset,
int column){
return null;
}
}
/*-----------數(shù)據(jù)集合封裝-------------*/
private static CategoryDataset createDataset(){
String s1="笨笨";
String s2="蛋蛋";
String s3="傻傻";
String s4="瓜瓜";
String c1="第一場(chǎng)";
String c2="第二場(chǎng)";
String c3="第三場(chǎng)";
String c4="第四場(chǎng)";
String c5="第五場(chǎng)";
/*-------------封裝圖表使用的數(shù)據(jù)集-------------*/
DefaultCategoryDataset dataset=new DefaultCategoryDataset();
dataset.setValue(1.0,s1,c1);
dataset.setValue(2.0,s1,c2);
dataset.setValue(3.0,s1,c3);
dataset.setValue(4.0,s1,c4);
dataset.setValue(5.0,s1,c5);
dataset.setValue(5.0,s2,c1);
dataset.setValue(4.0,s2,c2);
dataset.setValue(3.0,s2,c3);
dataset.setValue(2.0,s2,c4);
dataset.setValue(1.0,s2,c5);
dataset.setValue(1.0,s3,c1);
dataset.setValue(2.0,s3,c2);
dataset.setValue(3.0,s3,c3);
dataset.setValue(2.0,s3,c4);
dataset.setValue(1.0,s3,c5);
dataset.setValue(1.0,s4,c1);
dataset.setValue(2.0,s4,c2);
dataset.setValue(3.0,s4,c3);
dataset.setValue(4.0,s4,c4);
dataset.setValue(5.0,s4,c5);
return dataset;
}
}
JSP代碼如下:
<%@ page contentType="text/html;charset=GBK"%>
<%@ page import="java.io.PrintWriter"%>
<%@ page import="com.meetexpo.cms.backend.util.CategoryItemChart;"%>
<html>
<head>
<title>
</title>
<%
//以下部分為圖象輸出
String fileName=CategoryItemChart.generateBarChart(session,new PrintWriter(out),580,250);
String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + fileName;
%>
</head>
<body bgcolor="#ffffff">
<table width="580" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
<img src="<%= graphURL %>" width=580 height=250 border=0
>
</td>
</tr>
</table>
</body>
</html>
類包是jcommon-1.0.0.jar和jfreechart-1.0.0.jar
-------------------------------------------------------------------------------------------
用JFreeChart畫統(tǒng)計(jì)分析柱狀圖 |
源作者:未知 人氣:28605 |
|
我們介紹使用 JFreeChart 生成柱狀圖,首先從一個(gè)最簡(jiǎn)單的例子開始。 一 最簡(jiǎn)單的例子 為了降低門檻,讓大家心理有個(gè)底,先介紹一個(gè)簡(jiǎn)單的不能再簡(jiǎn)單的例子,圖片中的各類屬性都采用默認(rèn)值。 <%@ page contentType="text/html;charset=GBK"%><BR> <%@ page import="org.jfree.chart.ChartFactory,<BR> org.jfree.chart.JFreeChart,<BR> org.jfree.chart.plot.PlotOrientation,<BR> org.jfree.chart.servlet.ServletUtilities,<BR> org.jfree.data.DefaultCategoryDataset"%><BR> <% <BR> DefaultCategoryDataset dataset = new DefaultCategoryDataset();<BR> dataset.addValue(300, "廣州", "蘋果");<BR> dataset.addValue(200, "廣州", "梨子");<BR> dataset.addValue(500, "廣州", "葡萄");<BR> dataset.addValue(340, "廣州", "芒果");<BR> dataset.addValue(280, "廣州", "荔枝");<BR> JFreeChart chart = ChartFactory.createBarChart3D("水果銷量統(tǒng)計(jì)圖", "水果", "銷量",dataset, PlotOrientation.VERTICAL, false, false, false);<BR> String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session);<BR> String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;<BR> %> <IMG height=300 src="<%= graphURL %>" width=500 useMap="#<%= filename %>" border=0> 這個(gè) JSP 程序運(yùn)行的結(jié)果如下圖
 圖 一
二 柱狀圖高級(jí)特性 上面的程序簡(jiǎn)單,但生成的柱狀圖也很簡(jiǎn)單。更多的時(shí)候,我們可能需要不同的效果。org.jfree.chart.ChartFactory 這個(gè)工廠類有createBarChart,createStackedBarChart,createBarChart3D,createStackedBarChart3D這幾個(gè)工廠方法創(chuàng)建不同類型的柱狀圖。關(guān)于這四個(gè)方法的 JFreeChart 的 Java Doc API 文檔有詳細(xì)說(shuō)明,比較重要的是 PlotOrientation.VERTICAL 讓平行柱垂直顯示,而 PlotOrientation.HORIZONTAL 則讓平行柱水平顯示。 幾個(gè)對(duì)柱狀圖影響較大的幾個(gè)類,它們分別是: org.jfree.chart.axis.CategoryAxis org.jfree.chart.axis.ValueAxis org.jfree.chart.renderer.BarRenderer org.jfree.chart.renderer.BarRenderer3D 我們還是以實(shí)例來(lái)說(shuō)明這幾個(gè)類,先來(lái)假設(shè)一個(gè)需要統(tǒng)計(jì)的數(shù)據(jù)表:
|
北京 |
上海 |
廣州 |
成都 |
深圳 |
蘋果 |
672 |
766 |
223 |
540 |
126 |
梨子 |
325 |
521 |
210 |
340 |
106 |
葡萄 |
332 |
256 |
523 |
240 |
526 |
根據(jù)上表數(shù)據(jù),首先構(gòu)造 CategoryDataset, 這里不再使用上面簡(jiǎn)單例子里面的 DefaultCategoryDataset 類,而是 DatasetUtilities 更有效的構(gòu)造 CategoryDataset,如下列代碼:
double[][] data = new double[][] {{672, 766, 223, 540, 126}, {325, 521, 210, 340, 106}, {332, 256, 523, 240, 526} }; String[] rowKeys = {"蘋果","梨子","葡萄"}; String[] columnKeys = {"北京","上海","廣州","成都","深圳"}; CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);
用上面的 dataset 生成的 3D 柱狀圖
 圖 二
org.jfree.chart.axis.CategoryAxis CategoryAxis domainAxis = plot.getDomainAxis(); //設(shè)置 columnKey 是否垂直顯示 domainAxis.setVerticalCategoryLabels(true); //設(shè)置距離圖片左端距離 domainAxis.setLowerMargin(0.1); //設(shè)置距離圖片右端距離 domainAxis.setUpperMargin(0.1); //設(shè)置 columnKey 是否間隔顯示 domainAxis.setSkipCategoryLabelsToFit(true); plot.setDomainAxis(domainAxis); 上面代碼產(chǎn)生的效果如下圖,注意與圖二的區(qū)別。
 圖 三
org.jfree.chart.axis.ValueAxis
ValueAxis rangeAxis = plot.getRangeAxis(); //設(shè)置最高的一個(gè)柱與圖片頂端的距離 rangeAxis.setUpperMargin(0.15); //設(shè)置最低的一個(gè)柱與圖片底端的距離 //rangeAxis.setLowerMargin(0.15); plot.setRangeAxis(rangeAxis);
上面代碼產(chǎn)生的效果如下圖,注意與圖二的區(qū)別。
 圖 四
org.jfree.chart.renderer.BarRenderer3D
BarRenderer3D renderer = new BarRenderer3D(); renderer.setBaseOutlinePaint(Color.BLACK); //設(shè)置 Wall 的顏色 renderer.setWallPaint(Color.gray); //設(shè)置每種水果代表的柱的顏色 renderer.setSeriesPaint(0, new Color(0, 0, 255)); renderer.setSeriesPaint(1, new Color(0, 100, 255)); renderer.setSeriesPaint(2, Color.GREEN); //設(shè)置每種水果代表的柱的 Outline 顏色 renderer.setSeriesOutlinePaint(0, Color.BLACK); renderer.setSeriesOutlinePaint(1, Color.BLACK); renderer.setSeriesOutlinePaint(2, Color.BLACK); //設(shè)置每個(gè)地區(qū)所包含的平行柱的之間距離 renderer.setItemMargin(0.1); //顯示每個(gè)柱的數(shù)值,并修改該數(shù)值的字體屬性 renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator()); renderer.setItemLabelFont(new Font("黑體",Font.PLAIN,12)); renderer.setItemLabelsVisible(true); 上面代碼產(chǎn)生的效果如下圖,注意與圖二的區(qū)別。
 圖 五
補(bǔ)充兩個(gè)有用的方法 補(bǔ)充 org.jfree.chart.plot.CategoryPlot 的兩個(gè)方法,這兩個(gè)方法對(duì)所有類型的圖表都有作用,因?yàn)樵谇懊鏇]有介紹,這里補(bǔ)充一下。
//設(shè)置地區(qū)、銷量的顯示位置 plot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT); plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
上面代碼產(chǎn)生的效果如下圖,注意與圖二的區(qū)別。
 圖 六
三 完整范例 前面都是一些代碼片段,現(xiàn)在把這些片段組合成一個(gè)完整范例。 <DIV class=code> <%@ page contentType="text/html;charset=GBK"%> <%@ page import="java.awt.Color, java.awt.Font, org.jfree.chart.ChartFactory, org.jfree.chart.JFreeChart, org.jfree.chart.plot.PlotOrientation, org.jfree.chart.servlet.ServletUtilities, org.jfree.data.CategoryDataset, org.jfree.data.DatasetUtilities, org.jfree.chart.plot.CategoryPlot, org.jfree.chart.axis.CategoryAxis, org.jfree.chart.axis.ValueAxis, org.jfree.chart.renderer.BarRenderer3D, org.jfree.chart.labels.StandardCategoryItemLabelGenerator, org.jfree.chart.axis.AxisLocation"%> <% double[][] data = new double[][] { {672, 766, 223, 540, 126}, {325, 521, 210, 340, 106}, {332, 256, 523, 240, 526} }; String[] rowKeys = {"蘋果","梨子","葡萄"}; String[] columnKeys = {"北京","上海","廣州","成都","深圳"}; CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data); JFreeChart chart = ChartFactory.createBarChart3D("水果銷量圖統(tǒng)計(jì)",null,null,dataset, PlotOrientation.VERTICAL,true,false,false); chart.setBackgroundPaint(Color.WHITE); CategoryPlot plot = chart.getCategoryPlot(); CategoryAxis domainAxis = plot.getDomainAxis(); domainAxis.setVerticalCategoryLabels(false); plot.setDomainAxis(domainAxis); ValueAxis rangeAxis = plot.getRangeAxis(); //設(shè)置最高的一個(gè) Item 與圖片頂端的距離 rangeAxis.setUpperMargin(0.15); //設(shè)置最低的一個(gè) Item 與圖片底端的距離 rangeAxis.setLowerMargin(0.15); <BR>plot.setRangeAxis(rangeAxis); BarRenderer3D renderer = new BarRenderer3D(); renderer.setBaseOutlinePaint(Color.BLACK); //設(shè)置 Wall 的顏色<BR> renderer.setWallPaint(Color.gray); //設(shè)置每種水果代表的柱的顏色 renderer.setSeriesPaint(0, new Color(0, 0, 255)); renderer.setSeriesPaint(1, new Color(0, 100, 255)); renderer.setSeriesPaint(2, Color.GREEN); //設(shè)置每個(gè)地區(qū)所包含的平行柱的之間距離 renderer.setItemMargin(0.1); //顯示每個(gè)柱的數(shù)值,并修改該數(shù)值的字體屬性<BR> renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator()); renderer.setItemLabelsVisible(true); plot.setRenderer(renderer); //設(shè)置柱的透明度<BR> plot.setForegroundAlpha(0.6f); //設(shè)置地區(qū)、銷量的顯示位置<BR> plot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT); plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT); String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session); String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename; %s> <img src="<%= graphURL %>" width=500 height=300 border=0 usemap="#<%= filename %>"> </DIV> 看看程序運(yùn)行的結(jié)果吧:
 圖 七
三 總結(jié)
我只介紹了少量的方法,更多的請(qǐng)參考 JFreeChart 的 Java Doc API 文檔和 Sample Code。
|
|
--------------------------------------------------------------------------------------------
使用JFreeChart增強(qiáng)Java繪圖功能
 |
|
在給用戶演示軟件產(chǎn)品時(shí),我們往往發(fā)現(xiàn)客戶最初更感興趣的是我們程序的用戶界面,而不是程序的功能本身。也正因如此,圖形用戶界面的應(yīng)用程序一經(jīng)出現(xiàn)即廣受歡迎,界面友好的Windows操作系統(tǒng)雖然性能很不穩(wěn)定、安全漏洞百出,仍有無(wú)數(shù)用戶有怨無(wú)悔地追隨就是一個(gè)典型的例子。計(jì)算機(jī)編程技術(shù)發(fā)展到今天,遇到數(shù)據(jù)展示時(shí)人們已不滿足于枯燥的列表方式,而更喜歡色彩豐富、一目了然的的圖形效果。于是,在許多軟件產(chǎn)品中會(huì)涉及到制圖功能。
本文將介紹是一組功能強(qiáng)大、靈活易用的Java制圖API——JFreeChart,使用JFreeChart我們可以極大地增強(qiáng)Java應(yīng)用程序的高級(jí)制圖功能,生成多種通用性的圖表,包括餅圖、柱狀圖、折線圖、甘特圖等。對(duì)于要在Swing或Web應(yīng)用程序中加入自制圖表的Java開發(fā)者而言,JFreeChart無(wú)疑是一種理想的選擇。
下面以生成最常用的餅圖(Pie Chart)為例,介紹一下使用JFreeChart制圖的基本過(guò)程:
一.獲取JFreeChart最新版本 JFreeChart為開放源碼自由軟件,可以到下述網(wǎng)址免費(fèi)下載:http://www.jfree.org/jfreechart/,目前最新版本為v1.0.0-pre2版,下載并解壓縮后,將其中包含的下述兩個(gè).jar文件加入到計(jì)算機(jī)編譯和運(yùn)行環(huán)境的環(huán)境變量CLASSPATH中:jcommon-1.0.0-pre2.jar,jfreechart-1.0.0-pre2.jar。
二.開發(fā)Java Application,使用JFreeChart API實(shí)現(xiàn)創(chuàng)建餅圖的功能,源代碼如下: 源文件:PieChart.java import java.io.*; import java.awt.*; import org.jfree.chart.*; import org.jfree.chart.title.TextTitle; import org.jfree.data.general.*;
public class PieChart{ public static void main(String[] args){ String title = "夢(mèng)澤科技員工學(xué)歷情況統(tǒng)計(jì)"; DefaultPieDataset piedata = new DefaultPieDataset(); piedata.setValue("大專", 8.1); piedata.setValue("大學(xué)", 27.6); piedata.setValue("碩士", 53.2); piedata.setValue("博士及以上", 19.2); piedata.setValue("大專以下", 1.9); JFreeChart chart = ChartFactory.createPieChart(title, piedata, true, true, true); chart.setTitle(new TextTitle(title, new Font("宋體", Font.BOLD, 25))); chart.addSubtitle(new TextTitle("最后更新日期:2005年5月19日", new Font("楷書", Font.ITALIC, 18))); chart.setBackgroundPaint(Color.white); try { ChartUtilities.saveChartAsJPEG(new File("PieChart.jpg"), chart, 360, 300); } catch (IOException exz) { System.out.print("....Cant′t Create image File"); } } }
三.編譯運(yùn)行上述源程序,生成的餅圖文件"PieChart.jpg"效果如下:

關(guān)于上述應(yīng)用程序使用的JFreeChart API,可查閱JFreeChart提供的在線API文檔,以獲取更詳細(xì)的信息,其URL為http://www.jfree.org/jfreechart/javadoc/。讀者可嘗試參照上述例程、并借助于API 文檔創(chuàng)建其他類型的圖表。 需要說(shuō)明的是,JFreeChart雖是一個(gè)開源(open source)項(xiàng)目——API可以免費(fèi)下載、API文檔可以免費(fèi)在線查閱,其官方開發(fā)教程卻是要花錢(US$39.95)購(gòu)買的,相關(guān)URL為 http://www.object-refinery.com/jfreechart/guide.html。
|
|
--------------------------------------------------------------------------------------------
類名
|
類的作用以及簡(jiǎn)單描述
|
JFreeChart
|
圖表對(duì)象,任何類型的圖表的最終表現(xiàn)形式都是在該對(duì)象進(jìn)行一些屬性的定制。JFreeChart引擎本身提供了一個(gè)工廠類用于創(chuàng)建不同類型的圖表對(duì)象
|
XXXXXDataset
|
數(shù)據(jù)集對(duì)象,用于提供顯示圖表所用的數(shù)據(jù)。根據(jù)不同類型的圖表對(duì)應(yīng)著很多類型的數(shù)據(jù)集對(duì)象類。常用的數(shù)據(jù)集對(duì)象有:柱狀圖數(shù)據(jù)集對(duì)象DefaultCategoryDataset、餅圖數(shù)據(jù)集對(duì)象DefauldPieDataset和曲線圖數(shù)據(jù)集對(duì)象DefaultTableXYDataset
|
XXXXXPlot
|
圖表區(qū)域?qū)ο螅旧线@個(gè)對(duì)象決定著什么樣式的圖表,創(chuàng)建該對(duì)象的時(shí)候需要Axis、Renderer以及數(shù)據(jù)集對(duì)象的支持。常用的Plot對(duì)象有:柱狀圖CategoryPlot、餅圖PiePlot和曲線圖XYPlot。
|
XXXXXAxis
|
用于處理圖表的兩個(gè)軸:縱軸和橫軸。常用的有NumberAxis數(shù)據(jù)軸,DateAxis日期軸。
|
XXXXXRenderer
|
負(fù)責(zé)如何顯示一個(gè)圖表對(duì)象。常用的Renderer有DefaultCategoryItemRenderer 柱狀圖顯示器StandardXYItemRenderer曲線圖顯示器。餅圖的Renderer
|
XXXXXURLGenerator
|
用于生成Web圖表中每個(gè)項(xiàng)目的鼠標(biāo)點(diǎn)擊鏈接。常用的URLCenerator有StandardCategoryURLGenerator StandardPieURLGenerator StandardXYURLGenerator
|
XXXXXToolTipGenerator
|
用于生成圖象的幫助提示,不同類型圖表對(duì)應(yīng)不同類型的工具提示類。常用的有:StandardXYToolTipGenerator StandardCategoryToolTipGenerator StandardPieItemLabelGenerator
|
一般的創(chuàng)建圖表的過(guò)程為:
1. 從數(shù)據(jù)庫(kù)里讀取數(shù)據(jù)
2. 將數(shù)據(jù)保存到圖表對(duì)應(yīng)的數(shù)據(jù)集對(duì)象中
3. 創(chuàng)建坐標(biāo)軸對(duì)象
4. 創(chuàng)建Renderer對(duì)象
5. 創(chuàng)建Plot對(duì)象
6. 創(chuàng)建JfreeChart對(duì)象
7. 生成圖片文件(或者二進(jìn)制流)
以JfreeChart提供的Web應(yīng)用的例子來(lái)說(shuō)明一下以上幾個(gè)步驟:
一.柱圖。
public static String generateBarChart(Date hitDate, HttpSession session, PrintWriter pw) {
String filename = null;
try {
// Retrieve list of WebHits
WebHitDataSet whDataSet = new WebHitDataSet();
ArrayList list = whDataSet.getDataBySection(hitDate);//獲得數(shù)據(jù)集
// Throw a custom NoDataException if there is no data
if (list.size() == 0) {
System.out.println("No data has been found");
throw new NoDataException();
}
// Create and populate a CategoryDataset
Iterator iter = list.listIterator();
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
while (iter.hasNext()) {
WebHit wh = (WebHit)iter.next();
dataset.addValue(new Long(wh.getHitCount()), "Hits", wh.getSection());
}//將數(shù)據(jù)集保存到
Dataset對(duì)象
// Create the chart object
CategoryAxis categoryAxis = new CategoryAxis("");
ValueAxis valueAxis = new NumberAxis("");//創(chuàng)建坐標(biāo)軸
BarRenderer renderer = new BarRenderer();//創(chuàng)建Renderer
renderer.setItemURLGenerator(new StandardCategoryURLGenerator("xy_chart.jsp","series","section"));//創(chuàng)建URLGenerator.再不需要連接的情況下將第一個(gè)參數(shù)設(shè)置成"###"就可以了
renderer.setToolTipGenerator(new StandardCategoryToolTipGenerator());//創(chuàng)建提示標(biāo)簽
Plot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, renderer);//創(chuàng)建圖表區(qū)域?qū)ο?/p>
JFreeChart chart = new JFreeChart("", JFreeChart.DEFAULT_TITLE_FONT, plot, false);
chart.setBackgroundPaint(java.awt.Color.white);//創(chuàng)建圖表
// Write the chart image to the temporary directory
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());//該工具類上面沒有介紹,在鼠標(biāo)移動(dòng)到圖片時(shí)顯示提示信息是用Map實(shí)現(xiàn)的,這些Map是用該類生成的。
filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, info, session);//保存圖表為文件
// Write the image map to the PrintWriter
ChartUtilities.writeImageMap(pw, filename, info);//生成
Map信息。這些信息寫在
pw的輸出流中,這里的輸出流就是
Response.out。也就是直接輸出到頁(yè)面了
pw.flush();
} catch (NoDataException e) {
System.out.println(e.toString());
filename = "public_nodata_500x300.png";
} catch (Exception e) {
System.out.println("Exception - " + e.toString());
e.printStackTrace(System.out);
filename = "public_error_500x300.png";
}
return filename;
}
二.圖表顯示:
<%
......
String filename = WebHitChart.generateBarChart(dDate, session, new PrintWriter(out));//獲得圖片的文件名。注意該語(yǔ)句寫在jsp文件(bar_chart.jsp)的開頭,而用out的封裝類作為參數(shù),訪問(wèn)該頁(yè)面后可以看到生成Map熱點(diǎn)的內(nèi)容輸出再該頁(yè)面的開頭部分。也就是說(shuō)最好是把這幾句話寫在頁(yè)面有輸出之前。
String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;//顯示圖片的Servlet全路徑名,另外文件名作為該Servlet的參數(shù)
......
%>
......
<img src="<%= graphURL %>" width=500 height=300 border=0 usemap="#<%= filename %>">
src指定了servlet的全路徑名,usermap指定了使用的熱點(diǎn)。
該Servlet必須在WEB-INF/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>
該Servlet的作用就是將圖片文件的二進(jìn)制流數(shù)據(jù)寫道response的輸出流中,在客戶端也就顯示成了圖片。
---------------------------------------------------------------------------------------------
封裝FreeChart的Bean
FreeChart.java
package com.function;
/*基于JFreeChart 1.0.0 Pre2.jar*/
import java.io.*;
import java.awt.Font;
import java.awt.Color;
import java.text.SimpleDateFormat;
import java.text.DecimalFormat;
import java.util.Calendar;
import javax.servlet.http.HttpSession;
import org.jfree.data.*;
import org.jfree.chart.*;
//數(shù)據(jù)集
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.IntervalCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.data.xy.TableXYDataset;
import org.jfree.data.xy.XYZDataset;
import org.jfree.data.xy.IntervalXYDataset;
import org.jfree.data.xy.WindDataset;
import org.jfree.data.general.WaferMapDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.OHLCDataset;
import org.jfree.data.xy.SignalsDataset;
import org.jfree.data.statistics.BoxAndWhiskerXYDataset;
//數(shù)據(jù)集輔助
import org.jfree.data.time.Day;
import org.jfree.data.time.Hour;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
//圖集
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.MultiplePiePlot;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.chart.plot.XYPlot;
//表現(xiàn)形式集
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.renderer.category.StackedBarRenderer;
import org.jfree.chart.renderer.category.StackedBarRenderer3D;
import org.jfree.chart.renderer.category.StackedAreaRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.renderer.category.LineRenderer3D;
import org.jfree.chart.renderer.category.WaterfallBarRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
//標(biāo)簽
import org.jfree.chart.labels.StandardPieItemLabelGenerator;
//刻度
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.axis.SegmentedTimeline;
import org.jfree.chart.axis.TickUnit;
import org.jfree.chart.axis.TickUnits;
import org.jfree.chart.axis.TickUnitSource;
//通用
import org.jfree.data.general.DatasetUtilities;
//常量
import org.jfree.chart.axis.AxisLocation;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.util.TableOrder;
public class FreeChart
{
/*定義各類圖表所需的Dataset*/
private DefaultCategoryDataset vDefaultCategoryDataset=null;
private CategoryDataset vCategoryDataset=null;
private DefaultPieDataset vDefaultPieDataset=null;
private PieDataset vPieDataset=null;
private XYDataset vXYDataset=null;
private TableXYDataset vTableXYDataset=null;
private XYZDataset vXYZDataset=null;
private IntervalXYDataset vIntervalXYDataset=null;
private WindDataset vWindDataset=null;
private WaferMapDataset vWaferMapDataset=null;
private IntervalCategoryDataset vIntervalCategoryDataset=null;
private OHLCDataset vOHLCDataset=null;
private SignalsDataset vSignalsDataset=null;
private BoxAndWhiskerXYDataset vBoxAndWhiskerXYDataset=null;
/*定義各類圖表所需的Dataset輔助*/
TimeSeries vTimeSeries=null;
TimeSeriesCollection vTimeSeriesCollection=null;
/*定義圖表*/
private JFreeChart vFreeChart=null;
private JFreeChart vFreeChartExtend=null;
/*映射圖片的路徑名稱*/
private String strFileName=null;
/*定義效果*/
private CategoryPlot vCategoryPlot=null;
private PiePlot vPiePlot=null;
private MultiplePiePlot vMultiplePiePlot=null;
private PiePlot3D vPiePlot3D=null;
private XYPlot vXYPlot=null;
private StandardPieItemLabelGenerator vStandardPieItemLabelGenerator=null;
/*定義刻度*/
private NumberAxis vNumberAxis=null;
private DateAxis vDateAxis=null;
private CategoryAxis vCategoryAxis=null;
private ValueAxis vValueAxis=null;
private SegmentedTimeline vSegmentedTimeline=null;
private BarRenderer vBarRenderer=null;
private BarRenderer3D vBarRenderer3D=null;
private StackedBarRenderer vStackedBarRenderer=null;
private StackedBarRenderer3D vStackedBarRenderer3D=null;
private StackedAreaRenderer vStackedAreaRenderer=null;
private LineAndShapeRenderer vLineAndShapeRenderer=null;
private LineRenderer3D vLineRenderer3D=null;
private WaterfallBarRenderer vWaterfallBarRenderer=null;
private XYItemRenderer vXYItemRenderer=null;
//是否啟用效果模式
private boolean bRender=false;
/*定義靜態(tài)數(shù)據(jù)*/
private String[] strItemArray=null;
private String[] strMultipleItemArray=null;
private String[] strCategoryArray=null;
private String[] strDataArray=null;
private String[] strMultipleDataArray=null;
private double[][] iMultipleDataArray=null;
/**/
public static String[] vChartTypeArray={"餅圖","分離型餅圖","三維餅圖","復(fù)合餅圖","三維分離型餅圖","簇狀柱形圖","三維簇狀柱形圖","堆積柱形圖","三維堆積柱形圖","面積圖","三維面積圖","折線圖","三維折線圖","三維曲面圖","三維柱形圖","雷達(dá)圖","散點(diǎn)圖","百分比堆積面積圖","三維百分比堆積面積圖","折線散點(diǎn)圖","面積散點(diǎn)圖","時(shí)間序列圖","三維柱形圓錐圖","盤高-盤低-收盤圖","開盤-盤高-盤低-收盤圖","曲面圖(俯視框架圖)","氣泡圖","簇狀條形圖","數(shù)據(jù)點(diǎn)折線圖","無(wú)數(shù)據(jù)點(diǎn)折線散點(diǎn)圖","無(wú)數(shù)據(jù)點(diǎn)平滑線散點(diǎn)圖"};
public String strTimeAxis="";
public void FreeChart()
{
}
public void createDataset(String strMultipleItemList,String strCategoryList,String strMultipleDataList)
{
strMultipleItemArray=strMultipleItemList.split(",");
strCategoryArray=strCategoryList.split(",");
strMultipleDataArray=strMultipleDataList.split("#");
iMultipleDataArray=new double[strCategoryArray.length][strMultipleItemArray.length];
java.text.SimpleDateFormat vSimpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
java.text.SimpleDateFormat vSimpleDateFormatToday=new SimpleDateFormat("yyyy-MM-");
java.util.Date vItemDate=null;
java.util.Date vTodayDate=null;
Day vDay=null;
vTodayDate=new java.util.Date();
vTimeSeriesCollection=new TimeSeriesCollection();
vTimeSeriesCollection.setDomainIsPointsInTime(false);
for(int mIndex=0;mIndex<strMultipleDataArray.length;mIndex++)
{
String[] strElementArray=strMultipleDataArray[mIndex].split(",");
if(strTimeAxis.equals("Hour"))
{
vTimeSeries=new TimeSeries(strCategoryArray[mIndex],Hour.class);
}
else
{
vTimeSeries=new TimeSeries(strCategoryArray[mIndex],Day.class);
}
//vTimeSeries.clear();
for(int nIndex=0;nIndex<strElementArray.length;nIndex++)
{
iMultipleDataArray[mIndex][nIndex]=Double.parseDouble(strElementArray[nIndex]);
try
{
//vItemDate=vSimpleDateFormat.parse(vSimpleDateFormatToday.format(vTodayDate)+String.valueOf(nIndex+1));
vItemDate=vSimpleDateFormat.parse(strMultipleItemArray[nIndex]);
if(strTimeAxis.equals("Hour"))
{
vDay=new Day(vItemDate.getDate(),1+vItemDate.getMonth(),1900+vItemDate.getYear());
vTimeSeries.add(new Hour(vItemDate.getHours(),vDay),Double.parseDouble(strElementArray[nIndex]));
}
else
{
vTimeSeries.add(new Day(vItemDate.getDate(),1+vItemDate.getMonth(),1900+vItemDate.getYear()),Double.parseDouble(strElementArray[nIndex]));
}
}
catch(Exception e)
{System.out.println(e.getMessage());}
}
vTimeSeriesCollection.addSeries(vTimeSeries);
}
try
{
vCategoryDataset=DatasetUtilities.createCategoryDataset(strCategoryArray,strMultipleItemArray,iMultipleDataArray);
vPieDataset=DatasetUtilities.createPieDatasetForColumn(vCategoryDataset,0);
vPieDataset=DatasetUtilities.createPieDatasetForRow(vCategoryDataset,0);
//vWaferMapDataset=(WaferMapDataset)vCategoryDataset;
vTableXYDataset=(TableXYDataset)vTimeSeriesCollection;
vIntervalXYDataset=(IntervalXYDataset)vTimeSeriesCollection;
vXYDataset=(XYDataset)vTimeSeriesCollection;
/*
vXYZDataset=(XYZDataset)vTimeSeriesCollection;
//vWaferMapDataset=(WaferMapDataset)vTimeSeriesCollection;
vWindDataset=(WindDataset)vTimeSeriesCollection;
vOHLCDataset=(OHLCDataset)vTimeSeriesCollection;
vSignalsDataset=(SignalsDataset)vTimeSeriesCollection;
vBoxAndWhiskerXYDataset=(BoxAndWhiskerXYDataset)vTimeSeriesCollection;
*/
}
catch(Exception e)
{}
}
public void createDataset(String strItemList,String strDataList)
{
vDefaultCategoryDataset=new DefaultCategoryDataset();
vDefaultPieDataset=new DefaultPieDataset();
strItemArray=strItemList.split(",");
strDataArray=strDataList.split(",");
for(int kIndex=0;kIndex<strItemArray.length;kIndex++)
{
vDefaultCategoryDataset.addValue(Double.parseDouble(strDataArray[kIndex])," ",strItemArray[kIndex]);
vDefaultPieDataset.setValue(strItemArray[kIndex],Double.parseDouble(strDataArray[kIndex]));
}
}
public DefaultCategoryDataset getDefaultCategoryDataset()
{
return this.vDefaultCategoryDataset;
}
public CategoryDataset getCategoryDataset()
{
return this.vCategoryDataset;
}
public DefaultPieDataset getDefaultPieDataset()
{
return this.vDefaultPieDataset;
}
public PieDataset getPieDataset()
{
return this.vPieDataset;
}
public XYDataset getXYDataset()
{
return this.vXYDataset;
}
public TableXYDataset getTableXYDataset()
{
return this.vTableXYDataset;
}
public XYZDataset getXYZDataset()
{
return this.vXYZDataset;
}
public IntervalXYDataset getIntervalXYDataset()
{
return this.vIntervalXYDataset;
}
public WindDataset getWindDataset()
{
return this.vWindDataset;
}
public WaferMapDataset getWaferMapDataset()
{
return this.vWaferMapDataset;
}
public IntervalCategoryDataset getIntervalCategoryDataset()
{
return this.vIntervalCategoryDataset;
}
public OHLCDataset getOHLCDataset()
{
return this.vOHLCDataset;
}
public SignalsDataset getSignalsDataset()
{
return this.vSignalsDataset;
}
public BoxAndWhiskerXYDataset getBoxAndWhiskerXYDataset()
{
return this.vBoxAndWhiskerXYDataset;
}
/*
iChartType:圖表類型
*/
public void createChart(int iChartType,String strFreeChartInfo,String strFreeChartXInfo,String strFreeChartYInfo)
{
switch(iChartType)
{
case 1:
vFreeChart=ChartFactory.createPieChart(strFreeChartInfo,this.getPieDataset(),true,false,false);
try
{
vPiePlot=(PiePlot)vFreeChart.getPlot();
if(vPiePlot!=null)
{
if(bRender)
{
if(strItemArray.length>0)
{
for(int iIndex=0;iIndex<strItemArray.length;iIndex++)
{
//指定Section色彩
vPiePlot.setSectionPaint(iIndex,new Color(0,0+iIndex*(255/strItemArray.length),255));
//指定Section輪廓線顏色
vPiePlot.setSectionOutlinePaint(0,Color.BLACK);
}
}
}
//指定Section標(biāo)簽格式
vStandardPieItemLabelGenerator=new StandardPieItemLabelGenerator("{1}");
vPiePlot.setLabelGenerator(vStandardPieItemLabelGenerator);
//
vPiePlot.setForegroundAlpha(0.5f);
}
}
catch(Exception e)
{}
break;
case 2:
vFreeChart=ChartFactory.createPieChart(strFreeChartInfo,this.getPieDataset(),this.getPieDataset(),0,false,true,false,false,false,false);
try
{
vPiePlot=(PiePlot)vFreeChart.getPlot();
if(vPiePlot!=null)
{
if(bRender)
{
if(strItemArray.length>0)
{
for(int iIndex=0;iIndex<strItemArray.length;iIndex++)
{
//指定Section色彩
vPiePlot.setSectionPaint(iIndex,new Color(0,0+iIndex*(255/strItemArray.length),255));
//指定Section輪廓線顏色
vPiePlot.setSectionOutlinePaint(0,Color.BLACK);
}
//抽取指定塊
vPiePlot.setExplodePercent(0,1.00);
}
}
//指定Section標(biāo)簽格式
vStandardPieItemLabelGenerator=new StandardPieItemLabelGenerator("{1}");
vPiePlot.setLabelGenerator(vStandardPieItemLabelGenerator);
vPiePlot.setForegroundAlpha(0.5f);
}
}
catch(Exception e)
{}
break;
case 3:
vFreeChart=ChartFactory.createMultiplePieChart(strFreeChartInfo,this.getCategoryDataset(),TableOrder.BY_ROW,true,false,false);
try
{
vMultiplePiePlot=(MultiplePiePlot)vFreeChart.getPlot();
if(vMultiplePiePlot!=null)
{
vFreeChartExtend=vMultiplePiePlot.getPieChart();
vPiePlot=(PiePlot)vFreeChartExtend.getPlot();
if(bRender)
{
if(strItemArray.length>0)
{
for(int iIndex=0;iIndex<strItemArray.length;iIndex++)
{
//指定Section色彩
vPiePlot.setSectionPaint(iIndex,new Color(0,0+iIndex*(255/strItemArray.length),255));
//指定Section輪廓線顏色
vPiePlot.setSectionOutlinePaint(0,Color.BLACK);
}
}
}
//指定Section標(biāo)簽格式
vStandardPieItemLabelGenerator=new StandardPieItemLabelGenerator("{1}");
vPiePlot.setLabelGenerator(vStandardPieItemLabelGenerator);
vPiePlot.setForegroundAlpha(0.5f);
}
}
catch(Exception e)
{}
break;
case 4:
vFreeChart=ChartFactory.createPieChart3D(strFreeChartInfo,this.getPieDataset(),true,false,false);
try
{
vPiePlot3D=(PiePlot3D)vFreeChart.getPlot();
if(vPiePlot!=null)
{
if(bRender)
{
if(strItemArray.length>0)
{
for(int iIndex=0;iIndex<strItemArray.length;iIndex++)
{
//指定Section色彩
vPiePlot3D.setSectionPaint(iIndex,new Color(0,0+iIndex*(255/strItemArray.length),255));
//指定Section輪廓線顏色
vPiePlot3D.setSectionOutlinePaint(0,Color.BLACK);
}
}
}
//指定Section標(biāo)簽格式
vStandardPieItemLabelGenerator=new StandardPieItemLabelGenerator("{1}");
vPiePlot3D.setLabelGenerator(vStandardPieItemLabelGenerator);
//
vPiePlot3D.setForegroundAlpha(0.8f);
}
}
catch(Exception e)
{}
break;
case 5:
vFreeChart=ChartFactory.createMultiplePieChart3D(strFreeChartInfo,this.getCategoryDataset(),TableOrder.BY_ROW,true,false,false);
try
{
vMultiplePiePlot=(MultiplePiePlot)vFreeChart.getPlot();
if(vMultiplePiePlot!=null)
{
vFreeChartExtend=vMultiplePiePlot.getPieChart();
vPiePlot3D=(PiePlot3D)vFreeChartExtend.getPlot();
if(bRender)
{
if(strItemArray.length>0)
{
for(int iIndex=0;iIndex<strItemArray.length;iIndex++)
{
//指定Section色彩
vPiePlot3D.setSectionPaint(iIndex,new Color(0,0+iIndex*(255/strCategoryArray.length),255));
//指定Section輪廓線顏色
vPiePlot3D.setSectionOutlinePaint(0,Color.BLACK);
}
}
}
//指定Section標(biāo)簽格式
vStandardPieItemLabelGenerator=new StandardPieItemLabelGenerator("{1}");
vPiePlot3D.setLabelGenerator(vStandardPieItemLabelGenerator);
//
vPiePlot3D.setForegroundAlpha(0.8f);
}
}
catch(Exception e)
{}
break;
case 6:
vFreeChart=ChartFactory.createBarChart(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getCategoryDataset(),PlotOrientation.VERTICAL,true,false,false);
try
{
vCategoryPlot=vFreeChart.getCategoryPlot();
if(vCategoryPlot!=null)
{
if(bRender)
{
vBarRenderer=new BarRenderer();
vBarRenderer.setBaseOutlinePaint(Color.GRAY);
//設(shè)置X軸代表的柱的顏色
if(strCategoryArray.length>0)
{
for(int iIndex=0;iIndex<strCategoryArray.length;iIndex++)
{
vBarRenderer.setSeriesPaint(iIndex,new Color(0,0+iIndex*(255/strCategoryArray.length),255));
vBarRenderer.setSeriesOutlinePaint(0,Color.BLACK);
}
}
vBarRenderer.setItemMargin(0.1);
vCategoryPlot.setRenderer(vBarRenderer);
//設(shè)置X軸、Y軸的顯示位置
vCategoryPlot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);
vCategoryPlot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
}
//設(shè)置柱的透明度
vCategoryPlot.setForegroundAlpha(0.5f);
}
}
catch(Exception e)
{}
break;
case 7:
vFreeChart=ChartFactory.createStackedBarChart(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getCategoryDataset(),PlotOrientation.VERTICAL,true,false,false);
try
{
vCategoryPlot=vFreeChart.getCategoryPlot();
if(vCategoryPlot!=null)
{
if(bRender)
{
vStackedBarRenderer=new StackedBarRenderer();
vStackedBarRenderer.setBaseOutlinePaint(Color.GRAY);
//設(shè)置X軸代表的柱的顏色
if(strCategoryArray.length>0)
{
for(int iIndex=0;iIndex<strCategoryArray.length;iIndex++)
{
vStackedBarRenderer.setSeriesPaint(iIndex,new Color(0,0+iIndex*(255/strCategoryArray.length),255));
vStackedBarRenderer.setSeriesOutlinePaint(0,Color.BLACK);
}
}
vCategoryPlot.setRenderer(vStackedBarRenderer);
//設(shè)置X軸、Y軸的顯示位置
vCategoryPlot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);
vCategoryPlot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
}
//設(shè)置柱的透明度
vCategoryPlot.setForegroundAlpha(0.5f);
}
}
catch(Exception e)
{}
break;
case 8:
vFreeChart=ChartFactory.createBarChart3D(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getCategoryDataset(),PlotOrientation.VERTICAL,true,false,false);
try
{
vCategoryPlot=vFreeChart.getCategoryPlot();
if(vCategoryPlot!=null)
{
if(bRender)
{
vBarRenderer3D=new BarRenderer3D();
vBarRenderer3D.setBaseOutlinePaint(Color.GRAY);
//設(shè)置X軸代表的柱的顏色
if(strCategoryArray.length>0)
{
for(int iIndex=0;iIndex<strCategoryArray.length;iIndex++)
{
vBarRenderer3D.setSeriesPaint(iIndex,new Color(0,0+iIndex*(255/strCategoryArray.length),255));
vBarRenderer3D.setSeriesOutlinePaint(0,Color.BLACK);
}
}
vBarRenderer3D.setItemMargin(0.1);
vCategoryPlot.setRenderer(vBarRenderer3D);
//設(shè)置X軸、Y軸的顯示位置
vCategoryPlot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);
vCategoryPlot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
}
//設(shè)置柱的透明度
vCategoryPlot.setForegroundAlpha(0.8f);
}
}
catch(Exception e)
{}
break;
case 9:
vFreeChart=ChartFactory.createStackedBarChart3D(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getCategoryDataset(),PlotOrientation.VERTICAL,true,false,false);
try
{
vCategoryPlot=vFreeChart.getCategoryPlot();
if(vCategoryPlot!=null)
{
if(bRender)
{
vStackedBarRenderer3D=new StackedBarRenderer3D();
vStackedBarRenderer3D.setBaseOutlinePaint(Color.GRAY);
//設(shè)置X軸代表的柱的顏色
if(strCategoryArray.length>0)
{
for(int iIndex=0;iIndex<strCategoryArray.length;iIndex++)
{
vStackedBarRenderer3D.setSeriesPaint(iIndex,new Color(0,0+iIndex*(255/strCategoryArray.length),255));
vStackedBarRenderer3D.setSeriesOutlinePaint(0,Color.BLACK);
}
}
vCategoryPlot.setRenderer(vStackedBarRenderer3D);
//設(shè)置X軸、Y軸的顯示位置
vCategoryPlot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);
vCategoryPlot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
}
//設(shè)置柱的透明度
vCategoryPlot.setForegroundAlpha(0.8f);
}
}
catch(Exception e)
{}
break;
case 10:
vFreeChart=ChartFactory.createAreaChart(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getDefaultCategoryDataset(),PlotOrientation.VERTICAL,true,false,false);
try
{
vCategoryPlot=vFreeChart.getCategoryPlot();
if(vCategoryPlot!=null)
{
if(bRender)
{
vStackedAreaRenderer=new StackedAreaRenderer();
vStackedAreaRenderer.setBaseOutlinePaint(Color.GRAY);
//設(shè)置區(qū)域顏色
if(strItemArray.length>0)
{
for(int iIndex=0;iIndex<strItemArray.length;iIndex++)
{
vStackedAreaRenderer.setSeriesPaint(iIndex,new Color(0,0+iIndex*(255/strItemArray.length),255));
vStackedAreaRenderer.setSeriesOutlinePaint(0,Color.BLACK);
}
}
vCategoryPlot.setRenderer(vStackedAreaRenderer);
//設(shè)置X軸、Y軸的顯示位置
vCategoryPlot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);
vCategoryPlot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
}
//設(shè)置區(qū)域透明度
vCategoryPlot.setForegroundAlpha(0.5f);
//背景表格線
vCategoryPlot.setDomainGridlinesVisible(true);
}
}
catch(Exception e)
{}
break;
case 11:
vFreeChart=ChartFactory.createStackedAreaChart(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getCategoryDataset(),PlotOrientation.VERTICAL,true,false,false);
try
{
vCategoryPlot=vFreeChart.getCategoryPlot();
if(vCategoryPlot!=null)
{
if(bRender)
{
vStackedAreaRenderer=new StackedAreaRenderer();
vStackedAreaRenderer.setBaseOutlinePaint(Color.GRAY);
//設(shè)置區(qū)域顏色
if(strCategoryArray.length>0)
{
for(int iIndex=0;iIndex<strCategoryArray.length;iIndex++)
{
vStackedAreaRenderer.setSeriesPaint(iIndex,new Color(0,0+iIndex*(255/strCategoryArray.length),255));
vStackedAreaRenderer.setSeriesOutlinePaint(0,Color.BLACK);
}
}
vCategoryPlot.setRenderer(vStackedAreaRenderer);
//設(shè)置X軸、Y軸的顯示位置
vCategoryPlot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);
vCategoryPlot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
}
//設(shè)置區(qū)域透明度
vCategoryPlot.setForegroundAlpha(0.5f);
}
}
catch(Exception e)
{}
break;
case 12:
vFreeChart=ChartFactory.createLineChart(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getCategoryDataset(),PlotOrientation.VERTICAL,true,false,false);
try
{
vCategoryPlot=vFreeChart.getCategoryPlot();
if(vCategoryPlot!=null)
{
vLineAndShapeRenderer=new LineAndShapeRenderer();
vLineAndShapeRenderer.setBaseOutlinePaint(Color.GRAY);
if(bRender)
{
//設(shè)置線條顏色
if(strCategoryArray.length>0)
{
for(int iIndex=0;iIndex<strCategoryArray.length;iIndex++)
{
vLineAndShapeRenderer.setSeriesPaint(iIndex,new Color(0,0+iIndex*(255/strCategoryArray.length),255));
vLineAndShapeRenderer.setSeriesOutlinePaint(0,Color.BLACK);
}
}
//設(shè)置X軸、Y軸的顯示位置
vCategoryPlot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);
vCategoryPlot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
}
vCategoryPlot.setRenderer(vLineAndShapeRenderer);
//背景表格線
vCategoryPlot.setDomainGridlinesVisible(true);
}
}
catch(Exception e)
{}
break;
case 13:
vFreeChart=ChartFactory.createLineChart3D(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getCategoryDataset(),PlotOrientation.VERTICAL,true,false,false);
try
{
vCategoryPlot=vFreeChart.getCategoryPlot();
if(vCategoryPlot!=null)
{
vLineRenderer3D=new LineRenderer3D();
vLineRenderer3D.setBaseOutlinePaint(Color.GRAY);
if(bRender)
{
//設(shè)置線面顏色
if(strCategoryArray.length>0)
{
for(int iIndex=0;iIndex<strCategoryArray.length;iIndex++)
{
vLineRenderer3D.setSeriesPaint(iIndex,new Color(0,0+iIndex*(255/strCategoryArray.length),255));
vLineRenderer3D.setSeriesFillPaint(iIndex,new Color(0,0+iIndex*(255/strCategoryArray.length),255));
vLineRenderer3D.setSeriesOutlinePaint(0,Color.BLACK);
}
}
//設(shè)置X軸、Y軸的顯示位置
vCategoryPlot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);
vCategoryPlot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
}
vCategoryPlot.setRenderer(vLineRenderer3D);
//背景表格線
vCategoryPlot.setDomainGridlinesVisible(true);
}
}
catch(Exception e)
{}
break;
case 14:
vFreeChart=ChartFactory.createGanttChart(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getIntervalCategoryDataset(),true,false,false);
break;
case 15:
vFreeChart=ChartFactory.createWaterfallChart(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getCategoryDataset(),PlotOrientation.VERTICAL,true,false,false);
try
{
vCategoryPlot=vFreeChart.getCategoryPlot();
if(vCategoryPlot!=null)
{
vWaterfallBarRenderer=new WaterfallBarRenderer();
vWaterfallBarRenderer.setBaseOutlinePaint(Color.GRAY);
if(bRender)
{
//設(shè)置柱顏色
if(strCategoryArray.length>0)
{
for(int iIndex=0;iIndex<strCategoryArray.length;iIndex++)
{
vWaterfallBarRenderer.setSeriesPaint(iIndex,new Color(0,0+iIndex*(255/strCategoryArray.length),255));
vWaterfallBarRenderer.setSeriesFillPaint(iIndex,new Color(0,0+iIndex*(255/strCategoryArray.length),255));
vWaterfallBarRenderer.setSeriesOutlinePaint(0,Color.BLACK);
}
}
//設(shè)置X軸、Y軸的顯示位置
vCategoryPlot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);
vCategoryPlot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
}
vCategoryPlot.setRenderer(vWaterfallBarRenderer);
//背景表格線
vCategoryPlot.setDomainGridlinesVisible(true);
//設(shè)置區(qū)域透明度
vCategoryPlot.setForegroundAlpha(0.5f);
}
}
catch(Exception e)
{}
break;
case 16:
vFreeChart=ChartFactory.createPolarChart(strFreeChartInfo,this.getXYDataset(),true,false,false);
break;
case 17:
vFreeChart=ChartFactory.createScatterPlot(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getXYDataset(),PlotOrientation.VERTICAL,true,false,false);
break;
case 18:
vFreeChart=ChartFactory.createXYBarChart(strFreeChartInfo,strFreeChartXInfo,false,strFreeChartYInfo,this.getIntervalXYDataset(),PlotOrientation.VERTICAL,true,false,false);
break;
case 19:
vFreeChart=ChartFactory.createXYAreaChart(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getXYDataset(),PlotOrientation.VERTICAL,true,false,false);
break;
case 20:
vFreeChart=ChartFactory.createStackedXYAreaChart(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getTableXYDataset(),PlotOrientation.VERTICAL,true,false,false);
break;
case 21:
vFreeChart=ChartFactory.createXYLineChart(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getXYDataset(),PlotOrientation.VERTICAL,true,false,false);
try
{
vXYPlot=(XYPlot)vFreeChart.getXYPlot();
if(vXYPlot!=null)
{
vXYItemRenderer=vXYPlot.getRenderer();
vXYItemRenderer.setBaseOutlinePaint(Color.GRAY);
if(bRender)
{
//設(shè)置線面顏色
if(strItemArray.length>0)
{
for(int iIndex=0;iIndex<strItemArray.length;iIndex++)
{
vXYItemRenderer.setSeriesPaint(iIndex,new Color(0,0+iIndex*(255/strItemArray.length),255));
vXYItemRenderer.setSeriesOutlinePaint(0,Color.BLACK);
}
}
//設(shè)置X軸、Y軸的顯示位置
vXYPlot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);
vXYPlot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
}
//設(shè)置線條顏色
vXYItemRenderer.setPaint(new Color(0,100,255));
vXYPlot.setRenderer(vXYItemRenderer);
//背景表格線
vXYPlot.setDomainGridlinesVisible(true);
}
}
catch(Exception e)
{}
break;
case 22:
vFreeChart=ChartFactory.createXYStepChart(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getXYDataset(),PlotOrientation.VERTICAL,true,false,false);
break;
case 23:
vFreeChart=ChartFactory.createXYStepAreaChart(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getXYDataset(),PlotOrientation.VERTICAL,true,false,false);
break;
case 24:
vFreeChart=ChartFactory.createTimeSeriesChart(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getXYDataset(),true,false,false);
try
{
vXYPlot=(XYPlot)vFreeChart.getXYPlot();
if(vXYPlot!=null)
{
vXYItemRenderer=vXYPlot.getRenderer();
vXYItemRenderer.setBaseOutlinePaint(Color.GRAY);
if(bRender)
{
//設(shè)置線面顏色
if(strItemArray.length>0)
{
for(int iIndex=0;iIndex<strItemArray.length;iIndex++)
{
vXYItemRenderer.setSeriesPaint(iIndex,new Color(0,0+iIndex*(255/strItemArray.length),255));
vXYItemRenderer.setSeriesOutlinePaint(0,Color.BLACK);
}
}
//設(shè)置X軸、Y軸的顯示位置
vXYPlot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);
vXYPlot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
//設(shè)置線條顏色
vXYItemRenderer.setPaint(new Color(0,100,255));
vXYPlot.setRenderer(vXYItemRenderer);
}
//背景表格線
vXYPlot.setDomainGridlinesVisible(true);
SimpleDateFormat vSimpleDateFormat=null;
if(strTimeAxis.equals("Hour"))
{
vSimpleDateFormat=new SimpleDateFormat("dd日HH點(diǎn)");
}
else
{
vSimpleDateFormat=new SimpleDateFormat("MM月dd日");
}
vDateAxis=(DateAxis)vXYPlot.getDomainAxis();
vDateAxis.setDateFormatOverride(vSimpleDateFormat);
}
}
catch(Exception e)
{}
break;
case 25:
vFreeChart=ChartFactory.createCandlestickChart(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getOHLCDataset(),true);
break;
case 26:
vFreeChart=ChartFactory.createHighLowChart(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getOHLCDataset(),true);
break;
case 27:
vFreeChart=ChartFactory.createHighLowChart(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getOHLCDataset(),true);
break;
case 28:
vFreeChart=ChartFactory.createSignalChart(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getSignalsDataset(),true);
break;
case 29:
vFreeChart=ChartFactory.createBubbleChart(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getXYZDataset(),PlotOrientation.VERTICAL,true,false,false);
break;
case 30:
vFreeChart=ChartFactory.createHistogram(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getIntervalXYDataset(),PlotOrientation.VERTICAL,true,false,false);
break;
case 31:
vFreeChart=ChartFactory.createBoxAndWhiskerChart(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getBoxAndWhiskerXYDataset(),true);
break;
case 32:
vFreeChart=ChartFactory.createWindPlot(strFreeChartInfo,strFreeChartXInfo,strFreeChartYInfo,this.getWindDataset(),true,false,false);
break;
case 33:
vFreeChart=ChartFactory.createWaferMapChart(strFreeChartInfo,this.getWaferMapDataset(),PlotOrientation.VERTICAL,true,false,false);
break;
default:
vFreeChart=ChartFactory.createPieChart(strFreeChartInfo,this.getPieDataset(),true,false,false);
break;
}
//圖表背景顏色
vFreeChart.setBackgroundPaint(new Color(212,234,243));
}
public JFreeChart getChart()
{
return this.vFreeChart;
}
public void createImageFile(int iWidth,int iHeight,HttpSession session)
{
try
{
java.util.Date vDate=new java.util.Date(System.currentTimeMillis());
java.text.SimpleDateFormat vSimpleDateFormat=new SimpleDateFormat("yyyyMMddHHmmss");
java.util.Date vFileDate=null;
File[] vFileList=(new File(session.getServletContext().getRealPath("/"))).listFiles();
for(int kIndex=0;kIndex<vFileList.length;kIndex++)
{
if(vFileList[kIndex].isFile())
{
if(vFileList[kIndex].getName().indexOf(".jpg")!=-1)
{
vFileDate=vSimpleDateFormat.parse(vFileList[kIndex].getName().substring(0,vFileList[kIndex].getName().length()-4));
//十分鐘前的臨時(shí)文件刪除
if(vDate.getTime()-vFileDate.getTime()>60*10*1000)
{
vFileList[kIndex].delete();
}
}
}
}
String strTime=vSimpleDateFormat.format(vDate);
strFileName=session.getServletContext().getRealPath("/")+"http://www.java-asp.net/java/200601/\\"+strTime+".jpg";
ChartUtilities.saveChartAsJPEG(new File(strFileName),100,this.getChart(),iWidth,iHeight);
strFileName="/"+getApplicationName(session.getServletContext().getRealPath("/"))+"/"+strTime+".jpg";
}
catch(Exception e)
{}
}
public String getImageFile()
{
return this.strFileName;
}
public String getApplicationName(String strRealPath)
{
String[] strAppArray=strRealPath.split("\\\\");
return strAppArray[strAppArray.length-1];
}
public boolean getRender()
{
return bRender;
}
public void setRender(boolean bRender)
{
this.bRender=bRender;
}
public String getTimeAxis()
{
return this.strTimeAxis;
}
public void setTimeAxis(String strTimeAxis)
{
this.strTimeAxis=strTimeAxis;
}
}
JSP應(yīng)用示例
<%@ page contentType="text/html; charset=gb2312"%>
<%@ page import="java.io.*"%>
<jsp:useBean id="FreeChart" scope="session" class="com.function.FreeChart"/>
<head>
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="0">
</head>
<link rel="stylesheet" type="text/css" href="/defineOA/css/default.css">
<%
//初始化
//考慮圖形中是否直接鏈接到統(tǒng)計(jì)查詢表格
String strTimeList="";
String strMultipleTimeList="";
String strCategoryList="";
String strData="";
String strMultipleData="";
strTimeList="2005-05-01 00:00:00,2005-05-02 05:00:00,2005-05-03 10:00:00,2005-05-04 15:00:00,2005-05-05 20:00:00";
strMultipleTimeList="2005-05-01 00:00:00,2005-05-02 05:00:00,2005-05-03 10:00:00,2005-05-04 15:00:00,2005-05-05 20:00:00";
strCategoryList="JSP工作量,Servlet工作量,Bean工作量";
strData="1,2,3,4,5";
strMultipleData="1,2,3,4,5#2,3,4,5,6#3,4,5,6,7";
FreeChart.createDataset(strMultipleTimeList,strCategoryList,strMultipleData);
FreeChart.createDataset(strTimeList,strData);
FreeChart.setRender(true);
FreeChart.setTimeAxis("Hour");
if(request.getParameter("ChartType")==null)
{
FreeChart.createChart(1,"默認(rèn)統(tǒng)計(jì)圖","時(shí)間軸","統(tǒng)計(jì)值軸");
}
else
{
FreeChart.createChart(Integer.parseInt(request.getParameter("ChartType")),"統(tǒng)計(jì)圖","時(shí)間軸","統(tǒng)計(jì)值軸");
}
FreeChart.createImageFile(800,400,session);
response.setHeader("Pragma","No-cache");
response.setDateHeader("Expires",0);
response.setHeader("Cache-Control","no-cache");
%>
<%
for(int iIndex=0;iIndex<FreeChart.vChartTypeArray.length;iIndex++)
{
%>
<input type=button class="GeneralButton" value="<%=FreeChart.vChartTypeArray[iIndex]%>" onclick="window.location=´/defineOA/test/chart.jsp?ChartType=<%=iIndex+1%>´;">
<%
}
%>
<br>
<fieldset>
<legend>圖表</legend>
<!--class="GeneralImage"-->
<br>
<center>
<table>
<tr>
<td style="border:1 solid #3399CC;"><img src="<%=FreeChart.getImageFile()%>"></td>
</tr>
</table>
</center>
<br>
</fieldset>
也可以將應(yīng)用繼續(xù)用Bean封裝