JFreeChart是JAVA平台上的一个开放的图表绘制类库。它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计。JFreeChart可生成饼图(pie charts)、柱状图(bar charts)、散点图(scatter plots)、时序图(time series)、甘特图(Gantt charts)等等多种图表,并且可以产生PNG和JPEG格式的输出,还可以与PDF和EXCEL关联。
从官方下载到相应的文件后,解压缩后,将jfreechart-1.0.11.jar、jcommon-1.0.14.jar导入到应用中,就可以进行相关的开发。最好下载1.0之间的版本,官方提供了demo。开发文档需要收费的,所以还是在网上查阅相关资料。本例中实现了简单柱状图,复杂柱状图,非3D的折线图,3D的折线图,时序图,饼状图等图。
JSP代码:
<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>
<%@ page import="org.jfree.chart.servlet.ServletUtilities,
com.lyq.util.*"%>
JFreeChart各种图
柱状图
<%
String fileName1 = ServletUtilities.saveChartAsJPEG(ZhuzhuangChart.createChart(),500,300,session);
String graphURL1 = request.getContextPath()+ "/DisplayChart?filename=" + fileName1;
%>
复杂柱状图
<%
String fileName2 = ServletUtilities.saveChartAsJPEG(BarChartDemo.createChart(),500,300,session);
String graphURL2 = request.getContextPath()+ "/DisplayChart?filename=" + fileName2;
%>
非3D的折线图
<%
String fileName3 = ServletUtilities.saveChartAsJPEG(LineChart.createChart(false),500,300,session);
String graphURL3 = request.getContextPath()+ "/DisplayChart?filename=" + fileName3;
%>
3D的折线图
<%
String fileName4 = ServletUtilities.saveChartAsJPEG(LineChart.createChart(true),500,300,session);
String graphURL4 = request.getContextPath()+ "/DisplayChart?filename=" + fileName4;
%>
时序图
<%
String fileName5 = ServletUtilities.saveChartAsJPEG(TimeSeriesChart.createChart(),800,600,session);
String graphURL5 = request.getContextPath()+ "/DisplayChart?filename=" + fileName5;
%>
饼状图
<%
String fileName6 = ServletUtilities.saveChartAsJPEG(PieChart.createChart(),500,300,session);
String graphURL6 = request.getContextPath()+ "/DisplayChart?filename=" + fileName6;
%>
简单柱状图生成java代码:
package com.lyq.util;
import java.awt.Font;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
public class ZhuzhuangChart {
/**
* 创建数据集合
* @return CategoryDataset对象
*/
public static CategoryDataset createDataSet() {
//实例化DefaultCategoryDataset对象
DefaultCategoryDataset dataSet = new DefaultCategoryDataset();
//向数据集合中添加数据
dataSet.addValue(500, "JAVA图书", "J2SE类");
dataSet.addValue(100, "JAVA图书", "J2ME类");
dataSet.addValue(900, "JAVA图书", "J2EE类");
return dataSet;
}
/**
* 创建JFreeChart对象
* @return JFreeChart对象
*/
public static JFreeChart createChart() {
StandardChartTheme standardChartTheme =
new StandardChartTheme("CN"); //创建主题样式
standardChartTheme.setExtraLargeFont(new
Font("隶书", Font.BOLD, 20)); //设置标题字体
standardChartTheme.setRegularFont(new Font
("宋体", Font.PLAIN, 15)); //设置图例的字体
standardChartTheme.setLargeFont(new Font
("宋体", Font.PLAIN, 15)); //设置轴向的字体
ChartFactory.setChartTheme(standardChartTheme); //设置主题样式
//通过ChartFactory创建JFreeChart
JFreeChart chart = ChartFactory.createBarChart3D(
"JAVA图书销量统计", //图表标题
"JAVA图书", //横轴标题
"销量(本)", //纵轴标题
createDataSet(), //数据集合
PlotOrientation.VERTICAL, //图表方向
false, //是否显示图例标识
false, //是否显示tooltips
false); //是否支持超链接
return chart;
}
}
复杂柱状图生成JAVA代码:
package com.lyq.util;
import java.awt.Color;
import java.awt.Font;
import java.io.*;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.chart.*;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.*;
import org.jfree.chart.title.TextTitle;
/**
* 该类用于演示最简单的柱状图生成
* @author Winter Lau
*/
public class BarChartDemo {
public static JFreeChart createChart(){
CategoryDataset dataset = getDataSet2();
JFreeChart chart = ChartFactory.createBarChart3D(
"水果产量图", // 图表标题
"水果", // 目录轴的显示标签
"产量", // 数值轴的显示标签
dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true, // 是否显示图例(对于简单的柱状图必须是false)
false, // 是否生成工具
false // 是否生成URL链接
);
configFont(chart);//字体配置方法(解决中文乱码问题)
return chart;
}
/**
* 获取一个演示用的简单数据集对象
* @return
*/
private static CategoryDataset getDataSet() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(100, null, "苹果");
dataset.addValue(200, null, "梨子");
dataset.addValue(300, null, "葡萄");
dataset.addValue(400, null, "香蕉");
dataset.addValue(500, null, "荔枝");
return dataset;
}
/**
* 获取一个演示用的组合数据集对象
* @return
*/
private static CategoryDataset getDataSet2() {
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, "广州", "荔枝");
return dataset;
}
//字体配置方法(解决中文乱码问题)
private static void configFont(JFreeChart chart) {
// 配置字体
Font xfont = new Font("宋体", Font.BOLD, 12);// X轴
Font yfont = new Font("宋体", Font.BOLD, 12);// Y轴
Font kfont = new Font("宋体", Font.BOLD, 12);// 底部
Font titleFont = new Font("隶书", Font.BOLD, 25); // 图片标题
CategoryPlot plot = chart.getCategoryPlot();// 图形的绘制结构对象
// 图片标题
chart.setTitle(new TextTitle(chart.getTitle().getText(), titleFont));
// 底部
chart.getLegend().setItemFont(kfont);
// X 轴
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setLabelFont(xfont);// 轴标题
domainAxis.setTickLabelFont(xfont);// 轴数值
domainAxis.setTickLabelPaint(Color.BLUE); // 字体颜色
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.STANDARD); // 横轴上的label斜显示
// Y 轴
ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setLabelFont(yfont);
rangeAxis.setLabelPaint(Color.BLUE); // 字体颜色
rangeAxis.setTickLabelFont(yfont);
}
}
折线图java代码:
package com.lyq.util;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.util.Random;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
public class LineChart {
//字体
private static final Font PLOT_FONT = new Font("宋体", Font.BOLD, 15);
/**
* 创建数据集合
* @return CategoryDataset对象
*/
public static CategoryDataset createDataSet() {
//图例名称
String[] line = { "杀毒软件一", "杀毒软件二", "杀毒软件三" };
//类别
String[] category = { "2004年","2005年","2006年", "2007年", "2008年" };
Random random = new Random(); //实例化Random对象
//实例化DefaultCategoryDataset对象
DefaultCategoryDataset dataSet = new DefaultCategoryDataset();
//使用循环向数据集合中添加数据
for (int i = 0; i < line.length; i++) {
for (int j = 0; j < category.length; j++) {
dataSet.addValue(100000 + random.nextInt(100000), line[i],
category[j]);
}
}
return dataSet;
}
/**
* 生成制图对象
* @param is3D 是否为3D效果
* @return JFreeChart对象
*/
public static JFreeChart createChart(boolean is3D) {
JFreeChart chart = null;
if(is3D){
chart = ChartFactory.createLineChart3D(
"2004-2008年优秀杀毒软件杀毒数量统计", //图表标题
"杀毒软件", //X轴标题
"查杀病毒数量", //Y轴标题
createDataSet(), //绘图数据集
PlotOrientation.VERTICAL, //绘制方向
true, //显示图例
true, //采用标准生成器
false //是否生成超链接
);
}else{
chart = ChartFactory.createLineChart(
"2004-2008年优秀杀毒软件杀毒数量统计", //图表标题
"杀毒软件", //X轴标题
"查杀病毒数量", //Y轴标题
createDataSet(), //绘图数据集
PlotOrientation.VERTICAL, //绘制方向
true, //是否显示图例
true, //是否采用标准生成器
false //是否生成超链接
);
}
//设置标题字体
chart.getTitle().setFont(new Font("隶书", Font.BOLD, 23));
//设置图例类别字体
chart.getLegend().setItemFont(new Font("宋体", Font.BOLD, 15));
chart.setBackgroundPaint(new Color(255,255,255)); //设置背景色
//获取绘图区对象
CategoryPlot plot = chart.getCategoryPlot();
plot.getDomainAxis().setLabelFont(PLOT_FONT);
//设置横轴字体
plot.getDomainAxis().setTickLabelFont(PLOT_FONT);
//设置坐标轴标尺值字体
plot.getRangeAxis().setLabelFont(PLOT_FONT);
//设置纵轴字体
plot.setBackgroundPaint(Color.WHITE);
//设置绘图区背景色
plot.setRangeGridlinePaint(Color.RED);
//设置水平方向背景线颜色
plot.setRangeGridlinesVisible(true);
//设置是否显示水平方向背景线,默认值为true
plot.setDomainGridlinePaint(Color.RED);
//设置垂直方向背景线颜色
plot.setDomainGridlinesVisible(true);
//设置是否显示垂直方向背景线,默认值为false
//获取折线对象
LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot
.getRenderer();
BasicStroke realLine = new BasicStroke(//设置实线
5.0f,
BasicStroke.CAP_SQUARE, //端点风格
BasicStroke.JOIN_MITER); //折点风格 ;
float dashes[] = { 8.0f }; //定义虚线数组
BasicStroke brokenLine = new BasicStroke(
5.0f, //线条粗细
BasicStroke.CAP_SQUARE, //端点风格
BasicStroke.JOIN_MITER, //折点风格
8.f, //折点处理办法
dashes, //虚线数组
0.0f); //虚线偏移量
renderer.setSeriesStroke(1, brokenLine); //利用虚线绘制
renderer.setSeriesStroke(2, brokenLine);//利用虚线绘制
renderer.setSeriesStroke(3, realLine);//利用实线绘制
return chart;
}
}
饼状图java代码:
package com.lyq.util;
import java.awt.Font;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
public class PieChart {
public static JFreeChart createChart(){
PieDataset dataset = getDataSet();
JFreeChart chart = ChartFactory.createPieChart3D("CD类别对照图", // 主标题
dataset, // 图形需要的数据
true, // 图例
false, // 是否在图表上显示提示
false); // 该图形是否产生url连接
// 获取图表对象 plot(图形的绘制结构)
PiePlot3D piePlot3D = (PiePlot3D) chart.getPlot();
/*
* 产生饼图上个的数字和百分比 {0}:{1}({2}) {0} : dataset.setValue("摇滚乐", 8);值中的"摇滚乐" {1} : dataset.setValue("摇滚乐", 8);值中的"8" {2} : 该值占用的百分比
*/
String labelFormat = "{0}:{1}({2})";
piePlot3D.setLabelGenerator(new StandardPieSectionLabelGenerator(labelFormat));
piePlot3D.setLabelFont(new Font("黑体", Font.PLAIN, 18));
// 处理乱码
// 处理主标题
chart.getTitle().setFont(new Font("黑体", Font.PLAIN, 18));
// 处理子标题
chart.getLegend().setItemFont(new Font("黑体", Font.PLAIN, 18));
// 设置饼图上的中文字体 放置乱码
piePlot3D.setLabelFont(new Font("黑体", Font.PLAIN, 18));
return chart;
}
private static PieDataset getDataSet() {
DefaultPieDataset dataset = new DefaultPieDataset();
/*
* 摇滚乐 8 外国歌曲 1 民乐 6 流行音乐 6
*/
dataset.setValue("摇滚乐", 8);
dataset.setValue("外国歌曲", 1);
dataset.setValue("民乐", 6);
dataset.setValue("流行音乐", 6);
return dataset;
}
}
时序图java源代码:
package com.lyq.util;
import java.awt.Color;
import java.awt.Font;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.axis.DateTickUnitType;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.time.Day;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
public class TimeSeriesChart {
//字体
private static final Font PLOT_FONT = new Font("黑体", Font.ITALIC , 18);
/**
* 创建数据集合
* @return XYDataset对象
*/
public static XYDataset createDataset() {
//实例化TimeSeries对象
TimeSeries timeseries = new TimeSeries("Data");
Day day = new Day(1, 1, 2008); //实例化Day
double d = 3000D;
//添加一年365天的数据
for (int i = 0; i < 365; i++) {
d = d + (Math.random() - 0.5) * 10; //创建随机数据
timeseries.add(day, d); //向数据集合中添加数据
day = (Day) day.next();
}
//创建TimeSeriesCollection集合对象
TimeSeriesCollection timeSeriesCollection =new TimeSeriesCollection(timeseries);
//返回数据集合对象
return timeSeriesCollection;
}
/**
* 生成制图对象
* @return JFreeChart对象
*/
public static JFreeChart createChart(){
//创建时序图对象
JFreeChart chart = ChartFactory.createTimeSeriesChart(
"编程词典全国销量统计", //标题
"销售月份", //时间轴标签
"销量(份)", //数据轴标签
createDataset(), //数据集合
false, //是否显示图例标识
false, //是否显示tooltips
false); //是否支持超链接
//设置标题字体
chart.getTitle().setFont(new Font("隶书", Font.BOLD, 26));
//设置背景色
chart.setBackgroundPaint(new Color(252,175,134));
XYPlot plot = chart.getXYPlot(); //获取图表的绘制属性
plot.setDomainGridlinesVisible(false); //设置网格不显示
//获取时间轴对象
DateAxis dateAxis = (DateAxis) plot.getDomainAxis();
dateAxis.setLabelFont(PLOT_FONT); //设置时间轴字体
//设置时间轴标尺值字体
dateAxis.setTickLabelFont(new Font("宋体",Font.PLAIN,12));
dateAxis.setLowerMargin(0.0); //设置时间轴上显示的最小值
//获取数据轴对象
ValueAxis valueAxis = plot.getRangeAxis();
valueAxis.setLabelFont(PLOT_FONT); //设置数据字体
DateFormat format = new SimpleDateFormat("MM月份"); //创建日期格式对象
//创建DateTickUnit对象
DateTickUnit dtu = new DateTickUnit(DateTickUnitType.DAY,29,format);
dateAxis.setTickUnit(dtu); //设置日期轴的日期标签
return chart;
}
}
运行结果: