介绍:
JFreeChart是JAVA平台上的一个开放的图表绘制类库。它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计。JFreeChart可生成饼图(pie charts)、柱状图(bar charts)、散点图(scatter plots)、时序图(time series)、甘特图(Gantt charts)等等多种图表,并且可以产生PNG和JPEG格式的输出,还可以与PDF和EXCEL关联。
获取:
JFreeChart 是JFreeChart公司在开源网站SourceForge.net上的一个项目,该公司的主要产品有如下:
1.JFreeReport :报表解决工具
2.JFreeChart:Java 图形解决方案(Application/Applet/Servlet/Jsp)
3.JCommon :JFreeReport和JFreeChart的公共类库
4.JFreeDesigner :JFreeReport的报表设计工具
我们可以从jfree官方网站上获取最新版本和相关资料(但是jfree的document需要40美金才能获取),
官方网站:http://www.jfree.org/index.html
功能介绍:
JFreeChart 目前是最好的java图形解决方案,基本能够解决目前的图形方面的需求,主要包括如下几个方面:
pie charts (2D and 3D) :饼图(平面和立体)
bar charts (regular and stacked, with an optional 3D effect) :柱状图
line and area charts :曲线图
scatter plots and bubble charts
time series, high/low/open/close charts and candle stick charts :时序图
combination charts :复合图
Pareto charts :排列图
Gantt charts :甘特图
wind plots, meter charts and symbol charts :符号表图
wafer map charts ( 态图表,饼图(二维和三维) , 柱状图 ( 水平,垂直),线图,点图,时间变化图,甘特图, 股票行情图,混和图, 温度计图, 刻度图等常用商用图表)
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: 用于生成图象的帮助提示,不同类型图表对应不同类型的工具提示类
配置安装:
如图所示:从官网下载下来工具包之后,解压之后的结构如图所示。
lib文件夹中是所需的jar包。source文件夹中是源码,需要看的话,可以添加到eclipse中查看。
新建一个项目,将jfreechart-1.0.1.jar, jcommon-1.0.0.jar, gunjaxp.jar 这三个包添加到你的项目中就OK了。
代码编写:
用JFreeChart生成的各种图表,可以直接保存成为本地的一个图片(.jpeg .png等格式),也可以直接显示到图形用户界面, 还可以显示在jsp网页上。下面我只介绍前两种方法!
大体上分为一下几个步骤:
(1)建立Dataset。将你所想要显示的数据都放到这个库中。
(2)建立JFreeChart对象。将你的dataset填入到这个对象中。
(3)设置各种JFreeChart的属性和效果。通过它提供的各种方法和接口设置相关的属性。
(4)生成图表,然后按照个人的需求进行执行。
个人感觉这几个步骤类似于C#中的数据绑定,不知网友们如何看呢?!
先以柱状图为例,下面看代码:
[java] view plaincopy
package chart.demo02;
import java.awt.Font;
import java.awt.RenderingHints;
import java.io.FileOutputStream;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
public class BarChartDemo {
public static void main(String[] args) {
// 1. 得到数据
CategoryDataset dataset = getDataSet();
// 2. 构造chart
JFreeChart chart = ChartFactory.createBarChart3D(
"水果产量图", // 图表标题
"水果", // 目录轴的显示标签--横轴
"产量", // 数值轴的显示标签--纵轴
dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、
true, // 是否显示图例(对于简单的柱状图必须
false, // 是否生成工具
false // 是否生成URL链接
);
// 3. 处理chart中文显示问题
processChart(chart);
// 4. chart输出图片
writeChartAsImage(chart);
// 5. chart 以swing形式输出
ChartFrame pieFrame = new ChartFrame("XXX", chart);
pieFrame.pack();
pieFrame.setVisible(true);
}
/**
* 获取一个演示用的组合数据集对象
*
* @return
*/
private static CategoryDataset getDataSet() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(100, "北京", "苹果");
dataset.addValue(120, "上海", "苹果");
dataset.addValue(160, "广州", "苹果");
dataset.addValue(210, "北京", "梨子");
dataset.addValue(220, "上海", "梨子");
dataset.addValue(230, "广州", "梨子");
dataset.addValue(330, "北京", "葡萄");
dataset.addValue(340, "上海", "葡萄");
dataset.addValue(340, "广州", "葡萄");
dataset.addValue(420, "北京", "香蕉");
dataset.addValue(430, "上海", "香蕉");
dataset.addValue(400, "广州", "香蕉");
dataset.addValue(510, "北京", "荔枝");
dataset.addValue(530, "上海", "荔枝");
dataset.addValue(510, "广州", "荔枝");
return dataset;
}
/**
* 解决图表汉字显示问题
*
* @param chart
*/
private static void processChart(JFreeChart chart) {
CategoryPlot plot = chart.getCategoryPlot();
CategoryAxis domainAxis = plot.getDomainAxis();
ValueAxis rAxis = plot.getRangeAxis();
chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
TextTitle textTitle = chart.getTitle();
textTitle.setFont(new Font("宋体", Font.PLAIN, 20));
domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11));
domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
rAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12));
rAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));
// renderer.setItemLabelGenerator(new LabelGenerator(0.0));
// renderer.setItemLabelFont(new Font("宋体", Font.PLAIN, 12));
// renderer.setItemLabelsVisible(true);
}
/**
* 输出图片
*
* @param chart
*/
private static void writeChartAsImage(JFreeChart chart) {
FileOutputStream fos_jpg = null;
try {
fos_jpg = new FileOutputStream("D:\\test\\fruit.jpg");
ChartUtilities.writeChartAsJPEG(fos_jpg, 1, chart, 400, 300, null);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
fos_jpg.close();
} catch (Exception e) {
}
}
}
}
效果图如下:
接下来看其他的图表的生成:
饼状图:
[java] view plaincopy
public void createPieChart() {
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("苹果", 250);
dataset.setValue("桔子", 350);
dataset.setValue("梨子", 200);
dataset.setValue("香蕉", 50);
dataset.setValue("荔枝", 150);
JFreeChart chart = ChartFactory.createPieChart("水果产量比率图", dataset,
true, true, true);
Plot cp = chart.getPlot();
cp.setBackgroundPaint(ChartColor.WHITE); // 背景色设置
// ChartFrame frame = new ChartFrame("水果产量比率图 ", chart, true);
// frame.pack();
// frame.setVisible(true);
try {
ChartUtilities.saveChartAsPNG(new File("D:\\test\\PieChart.png"),
chart, 800, 500);
} catch (IOException e) {
e.printStackTrace();
}
}
3D饼状图:
[java] view plaincopy
public void createPieChart3D() {
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("苹果", 250);
dataset.setValue("桔子", 350);
dataset.setValue("梨子", 200);
dataset.setValue("香蕉", 50);
dataset.setValue("荔枝", 150);
JFreeChart chart = ChartFactory.createPieChart3D("水果产量比率图", dataset,
true, true, true);
PiePlot3D plot = (PiePlot3D) chart.getPlot();
// 设置开始角度
plot.setStartAngle(150D);
// 设置方向为"顺时针方向"
plot.setDirection(Rotation.CLOCKWISE);
// 设置透明度,0.5F为半透明,1为不透明,0为全透明
plot.setForegroundAlpha(1F);
// 没有数据的时候显示的内容
plot.setNoDataMessage("无数据显示");
// 背景色设置
plot.setBackgroundPaint(ChartColor.WHITE);
// ChartFrame frame = new ChartFrame("水果产量比率图 ", chart, true);
// frame.pack();
// frame.setVisible(true);
try {
ChartUtilities.saveChartAsPNG(new File("D:\\test\\PieChart3D.png"),
chart, 800, 500);
} catch (IOException e) {
e.printStackTrace();
}
}
柱状图:
[java] view plaincopy
public void createColumnChart() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(100, "北京", "苹果");
dataset.addValue(100, "上海", "苹果");
dataset.addValue(100, "广州", "苹果");
dataset.addValue(200, "北京", "梨子");
dataset.addValue(200, "上海", "梨子");
dataset.addValue(200, "广州", "梨子");
dataset.addValue(300, "北京", "葡萄");
dataset.addValue(300, "上海", "葡萄");
dataset.addValue(300, "广州", "葡萄");
dataset.addValue(400, "北京", "香蕉");
dataset.addValue(400, "上海", "香蕉");
dataset.addValue(400, "广州", "香蕉");
dataset.addValue(500, "北京", "荔枝");
dataset.addValue(500, "上海", "荔枝");
dataset.addValue(500, "广州", "荔枝");
JFreeChart chart = ChartFactory.createBarChart("水果产量图", "水量", "产量",
dataset, PlotOrientation.VERTICAL, true, true, true);
CategoryPlot cp = chart.getCategoryPlot();
cp.setBackgroundPaint(ChartColor.WHITE); // 背景色设置
cp.setRangeGridlinePaint(ChartColor.GRAY); // 网格线色设置
// ChartFrame frame=new ChartFrame ("水果产量图 ",chart,true);
// frame.pack();
// frame.setVisible(true);
try {
ChartUtilities.saveChartAsPNG(new File("D:\\test\\ColumnChart.png"),
chart, 800, 500);
} catch (IOException e) {
e.printStackTrace();
}
}
折线图:
[java] view plaincopy
public void createLineChart() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(100, "北京", "苹果");
dataset.addValue(200, "上海", "苹果");
dataset.addValue(300, "广州", "苹果");
dataset.addValue(400, "北京", "梨子");
dataset.addValue(500, "上海", "梨子");
dataset.addValue(600, "广州", "梨子");
dataset.addValue(700, "北京", "葡萄");
dataset.addValue(800, "上海", "葡萄");
dataset.addValue(900, "广州", "葡萄");
dataset.addValue(800, "北京", "香蕉");
dataset.addValue(700, "上海", "香蕉");
dataset.addValue(600, "广州", "香蕉");
dataset.addValue(500, "北京", "荔枝");
dataset.addValue(400, "上海", "荔枝");
dataset.addValue(300, "广州", "荔枝");
JFreeChart chart = ChartFactory.createLineChart("水果产量图 ", "水果", "产量",
dataset, PlotOrientation.VERTICAL, true, true, true);
CategoryPlot cp = chart.getCategoryPlot();
cp.setBackgroundPaint(ChartColor.WHITE); // 背景色设置
cp.setRangeGridlinePaint(ChartColor.GRAY); // 网格线色设置
// ChartFrame frame=new ChartFrame ("水果产量图 ",chart,true);
// frame.pack();
// frame.setVisible(true);
try {
ChartUtilities.saveChartAsPNG(new File("D:\\test\\LineChart.png"),
chart, 800, 500);
} catch (IOException e) {
e.printStackTrace();
}
}
3D折线图:
[java] view plaincopy
public void createLineChart3D() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(300, "北京", "苹果");
dataset.addValue(100, "上海", "苹果");
dataset.addValue(900, "广州", "苹果");
dataset.addValue(200, "北京", "梨子");
dataset.addValue(200, "上海", "梨子");
dataset.addValue(700, "广州", "梨子");
dataset.addValue(300, "北京", "葡萄");
dataset.addValue(300, "上海", "葡萄");
dataset.addValue(300, "广州", "葡萄");
dataset.addValue(400, "北京", "香蕉");
dataset.addValue(800, "上海", "香蕉");
dataset.addValue(400, "广州", "香蕉");
dataset.addValue(100, "北京", "荔枝");
dataset.addValue(500, "上海", "荔枝");
dataset.addValue(500, "广州", "荔枝");
JFreeChart chart = ChartFactory.createLineChart3D("水果产量图 ", "水果", "产量",
dataset, PlotOrientation.VERTICAL, true, true, true);
CategoryPlot cp = chart.getCategoryPlot();
cp.setBackgroundPaint(ChartColor.WHITE); // 背景色设置
cp.setRangeGridlinePaint(ChartColor.GRAY); // 网格线色设置
// ChartFrame frame=new ChartFrame ("水果产量图 ",chart,true);
// frame.pack();
// frame.setVisible(true);
try {
ChartUtilities.saveChartAsPNG(new File("D:\\test\\LineChart3D.png"),
chart, 800, 500);
} catch (IOException e) {
e.printStackTrace();
}
}