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.*"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>JFreeChart各种图</title> </head> <body> <center> <h1>柱状图</h1> <% String fileName1 = ServletUtilities.saveChartAsJPEG(ZhuzhuangChart.createChart(),500,300,session); String graphURL1 = request.getContextPath()+ "/DisplayChart?filename=" + fileName1; %> <img src="<%=graphURL1%>" border="1"> <h1>复杂柱状图</h1> <% String fileName2 = ServletUtilities.saveChartAsJPEG(BarChartDemo.createChart(),500,300,session); String graphURL2 = request.getContextPath()+ "/DisplayChart?filename=" + fileName2; %> <img src="<%=graphURL2%>" border="1"> <h1>非3D的折线图</h1> <% String fileName3 = ServletUtilities.saveChartAsJPEG(LineChart.createChart(false),500,300,session); String graphURL3 = request.getContextPath()+ "/DisplayChart?filename=" + fileName3; %> <img src="<%=graphURL3%>" border="1"> <h1>3D的折线图</h1> <% String fileName4 = ServletUtilities.saveChartAsJPEG(LineChart.createChart(true),500,300,session); String graphURL4 = request.getContextPath()+ "/DisplayChart?filename=" + fileName4; %> <img src="<%=graphURL4%>" border="1"> <h1>时序图</h1> <% String fileName5 = ServletUtilities.saveChartAsJPEG(TimeSeriesChart.createChart(),800,600,session); String graphURL5 = request.getContextPath()+ "/DisplayChart?filename=" + fileName5; %> <img src="<%=graphURL5%>" border="1"> <h1>饼状图</h1> <% String fileName6 = ServletUtilities.saveChartAsJPEG(PieChart.createChart(),500,300,session); String graphURL6 = request.getContextPath()+ "/DisplayChart?filename=" + fileName6; %> <img src="<%=graphURL6%>" border="1"> </center> </body> </html>
简单柱状图生成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; } }
运行结果: