初步走进JfreeChar,被它里面各种各样的图表所吸引,自认为即美观又使用
1. JFreeChart简介
JFreeChart
是开放源代码站点
SourceForge.net
上的一个
JAVA
项目,它主要用来生成各种各样的图表,这些图表包括:饼图、柱状图
(
普通柱状图以及堆栈柱状图
)
、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。这些不同式样的图表基本上可以满足目前的需求。
2. JFreeChart的获取
JFreeChart
是
JFreeChart
公司在开源网站
SourceForge.net
上的一个项目。我们可以从
jfree
官方网站上获取最新版本和相关资料
。
获取地址:http://www.jfree.org/jfreechart/index.html(同时可以获得简明介绍)。
3.JFreeChart的核心类库
JFreeChart
的核心包包括
org.jfree.chart,org.jfree.data
。其中前者是图集主要与图形本身有关,后者是数据集与图形显示的数据有关。
核心类主要有:
org.jfree.chart.JFreeChart
:图表对象,任何类型的图表的最终表现形式都是在该对象中进行一些属性的定制。
JFreeChart
引擎本身提供了一个工厂类用于创建不同类型的图表对象
org.jfree.data.category.XXXDataSet: 数据集对象,用于提供显示图表所用的数据。根据不同类型的图表对应着很多类型的数据集对象类
org.jfree.chart.plot.XXXPlot :图表区域对象,基本上这个对象决定着什么样式的图表,创建该对象的时候需要 Axis 、 Renderer 以及数据集对象的支持
org.jfree.chart.axis.XXXAxis :用于处理图表的两个轴:纵轴和横轴
org.jfree.chart.render.XXXRender :负责如何显示一个图表对象
org.jfree.chart.urls.XXXURLGenerator: 用于生成 Web 图表中每个项目的鼠标点击链接
XXXXXToolTipGenerator: 用于生成图象的帮助提示,不同类型图表对应不同类型的工具提示类
org.jfree.data.category.XXXDataSet: 数据集对象,用于提供显示图表所用的数据。根据不同类型的图表对应着很多类型的数据集对象类
org.jfree.chart.plot.XXXPlot :图表区域对象,基本上这个对象决定着什么样式的图表,创建该对象的时候需要 Axis 、 Renderer 以及数据集对象的支持
org.jfree.chart.axis.XXXAxis :用于处理图表的两个轴:纵轴和横轴
org.jfree.chart.render.XXXRender :负责如何显示一个图表对象
org.jfree.chart.urls.XXXURLGenerator: 用于生成 Web 图表中每个项目的鼠标点击链接
XXXXXToolTipGenerator: 用于生成图象的帮助提示,不同类型图表对应不同类型的工具提示类
原理图如下:
4. JFreeChart的配置安装
解压
jfreechart-1.0.6.zip
到指定位置,并把解压包中的三个
jar
包:
jfreechart-1.0.6.jar
、
jcommon-1.0.10.jar
、
gnujaxp.jar
拷贝到相应的位置。如果是
Application
开发,需把上述三个文件拷贝到
%JAVA_HOME%/LIB
中,同时在环境变量
CLASSPATH
中加入;如果是
WEB
开发,需要把上述三个文件拷贝到应用程序的
WEB-INF/lib
目录下。加上第三个
jar
包有时
web.xml
会报错,这时要么把它去掉,要么在
web.xml
中做以下配置便可:
<servlet>
<servlet-name>DisplayChart</servlet-name>
<servlet-class>org.jfree.chart.
servlet.DisplayChart</servlet-class>
</servlet>
5. JFreeChart的应用举例
按照上面的配置搭建好环境后,来测试一下饼图和柱状图的形成。
(1)
测试饼图(
PieChart.java
)
该程序通过编写一个普通的
java
类来测试一下
pie charts (2D and 3D)
饼图(平面和立体)的形成。代码如下:
public class PieChart {
public JFreeChart getChart(){
// 1 创建Dataset,用数据源中的数据填充
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("短信", new Double(10));
dataset.setValue("上网", new Double(20));
dataset.setValue("本地通话", new Double(30));
dataset.setValue("长途", new Double(50));
// 2 创建图表主对象JFreechart
JFreeChart chart = ChartFactory.createPieChart3D("话费统计", dataset, true,
true, true);
chart.setBackgroundPaint(Color.pink);
chart.setBorderVisible(true);
//设置图型为3D状的
//PiePlot3D plot = (PiePlot3D) chart.getPlot();
//获得图表显示对象
PiePlot plot = (PiePlot) chart.getPlot();
/** 图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数
* 值, {2} 表示所占比例 ,小数点后两位
*
*/
plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
"{0}={1}占{2}", new DecimalFormat("00.0"), new DecimalFormat("0.00%")));
// 图例显示百分比:自定义方式, {0} 表示选项, {2} 表示数值
plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator(
"{0}={2}", new DecimalFormat("00.0"), new DecimalFormat(
"0.00%")));
//分离图形,只对平面图有效,立体的不可以
//plot.setExplodePercent("长途", 0.4);
//设置指定块的颜色
plot.setSectionPaint("长途",Color.ORANGE);
// 指定图片的透明度(0.0-1.0)
plot.setForegroundAlpha(0.5f);
plot.setLabelFont(new Font("sim-hei",Font.ITALIC,14));
plot.setSectionOutlineStroke(new BasicStroke(1f));
plot.setSectionOutlinesVisible(false);
plot.setBackgroundPaint(Color.white);
return chart;
}
public static void main(String[] args) {
PieChart p = new PieChart();
JFreeChart chart = p.getChart();
// 3 显示在GUI上
ChartFrame frame = new ChartFrame("话费", chart);
frame.pack();
frame.setVisible(true);
// 3 显示在图片上
// try {
// ChartUtilities.saveChartAsJPEG(new File("d://t.jpg"), chart, 700,
// 700);
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
}
运行结果如下所示:
(2)
测试柱状图(
BarChart.java
)
该程序也是通过编写一个普通的
java
类来测试一下如何利用
JFreeChart
来形成
bar charts
柱状图。代码如下:
public class BarChart {
public JFreeChart getChart() {
String s1 = "java";
String s2 = "c++";
String s3 = "c#";
String c1 = "2001";
String c2 = "2002";
String c3 = "2003";
String c4 = "2004";
// 1 创建Dataset,用数据源中的数据填充
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.setValue(10, s1, c1);
dataset.setValue(14, s1, c2);
dataset.setValue(16, s1, c3);
dataset.setValue(18, s1, c4);
dataset.setValue(-18, s2, c1);
dataset.setValue(14, s2, c2);
dataset.setValue(8, s2, c3);
dataset.setValue(3, s2, c4);
dataset.setValue(-4, s3, c1);
dataset.setValue(7, s3, c2);
dataset.setValue(9, s3, c3);
dataset.setValue(10, s3, c4);
// 2 创建JFreechart对象
JFreeChart chart = ChartFactory.createBarChart("progaming", "year",
"account", dataset, PlotOrientation.VERTICAL, true, true, true);
CategoryPlot plot = (CategoryPlot) chart.getPlot();
plot.setDomainGridlinesVisible(true);
plot.setDomainGridlinePaint(Color.red);
plot.setRangeGridlinePaint(Color.blue);
plot.setRangeGridlinesVisible(true);
plot.setBackgroundPaint(Color.gray);
//设置纵轴的刻度
NumberAxis naxis = (NumberAxis) plot.getRangeAxis();
naxis.setRange(new Range(-40, 40));
naxis.setTickUnit(new NumberTickUnit(10))
//设置图形的宽度
CategoryAxis caxis = plot.getDomainAxis();
caxis.setUpperMargin(0.3);
caxis.setFixedDimension(0.3);
BarRenderer render = (BarRenderer)plot.getRenderer();
CategoryItemLabelGenerator ge = new StandardCategoryItemLabelGenerator("{2}",new DecimalFormat("00.0%"));
render.setItemLabelGenerator(ge);
CategoryToolTipGenerator cc = new StandardCategoryToolTipGenerator("{0}-{1}",new DecimalFormat("0.00%"));
render.setToolTipGenerator(cc);
return chart;
}
public static void main(String[] args) {
BarChart p = new BarChart();
JFreeChart chart = p.getChart();
// 3 显示在GUI上
ChartFrame frame = new ChartFrame("", chart);
frame.pack();
frame.setVisible(true);
}
}
运行结果如下图所示:
注:
JFreeChart
的功能比较强大,还有很多细节问题需要进一步研究。