JfreeChart常用图形实现

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;  
	    }
}

运行结果:

柱状图

复杂柱状图

非3D的折线图

3D的折线图

时序图

饼状图

你可能感兴趣的:(JfreeChart常用图形实现)