JFreeChart 学习笔记

目录

JfreeChart 的核心对象

制图对象

JFreeChart类是一个制图对象,它代表着一种制图类型。如:创建一个柱形图,首先需要创建一个柱形图的制图对象JFreeChart;创建一个饼形图,需要创建个饼形图的制图对象JFreeChart,在制图过程中,只有在创建制图对象JFreeChart后,才可以生成实际的图片。

在JFreeChart类中,可以设置所生成图片的边界、字体、背景、透明度等属性,其常用方法及说明如表1所示。

方法 说明
public void setAntiAlias(boolean flag) 设置字体模糊边界
public void setBackgroudImage(Image image) 设置背景图片
public void setBackgroundImageAlignment(int alignment) 设置背景图片对齐方式,其参数常量定义在org.jfree.ui.Align类中
public void setBackgroundImageAlpha(float alpha) 设置背景图片透明度
public void setBackgroundPaint(Paint paint) 设置背景颜色
public void setBorderPaint(Paint paint) 设置边界线条颜色
public void setBorderVisible(boolean visible) 设置边界线条是否可见

制图工厂对象

在生成图形报表时,制图对象JFreeChart是必不可少的对象,它可以直接通过new关键字进行实例化,也可以通过制图工厂ChartFacroty类进行实例化。当使用new关键字进行实例化时,需要设置大量的属性信息,因为JFreeChart组件提供图表的种类很多,对于每一种图表都进行特殊的设置,非常繁琐。所以在使用过程中,一般都使用制图工厂ChartFacroty类进行创建。

制图工厂ChartFacroty是一个抽象类,它不能被实例化,但此类之中提供创建各种制图对象的方法,如创建柱形图对象、区域图对象、饼形图对象、折线图对象等方法,这些方法都是静态的方法,可直接创建JFreeChart对象,并且是属于某一种具体的图表类型的JFreeChart对象,其使用非常方便,它的常用方法及说明如表1所示。

表1 ChartFactory 类常用方法及其说明

图表类型 方法 说明
柱形图 public static JFreeChart createBarChart() 创建一个常规的柱形图对象
public static JFreeChart createBarChart3D() 创建一个3D效果的柱形图对象
饼形图 public static JFreeChart createPieChart() 创建一个常规的饼形图对象
public static JFreeChart createPieChart3D() 创建一个3D 效果的饼形图对象
区域图 public static JFreeChart createAreaChart() 创建一个常规的区域图对象
折线图 public static JFreeChart createLineChart() 创建一个常规的折线图对象
public static JFreeChart createLineChart3D() 创建一个3D 效果的折线图对象
时序图 public static JFeeChart createTimeSeriesChart() 创建一个常规的时序图对象

除表1中所列的方法外,ChartFacroty类还有很多创建各种类型制图对象的方法,在此不一一进行罗列。在ChartFacroty类中,对于同种类型的制图对象提供一个或多个方法,如表20.1中的所示的常规制图对象与3D效果的制图对象的方法。可见,制图工厂ChartFacroty类为创建制图对象提供了多个灵活的方法。
ChartFacroty类可以理解为是一个生产制图对象JFreeChart的工厂,当需要用到某一种类型的制图对象时,通过此工厂进行获取。

例如:

JFreeChart chart=ChartFactory.createPieChart3D(
                      "饼形图",        //图表的标题
                      initPieData() , //饼形图的数据集对象
                      true ,  //是否显示图列
                      true ,  //是否显示提示文
                      false);  //是否生成超链接

上述代码通过ChartFactory类的createPieChart3D()方法,创建了一个3D效果的饼形图JFreeChart对象。

数据集合对象

在JFreeChart组件的图形报表技术应用中,绘制一个图表需要一定的数据,JFreeChart组件通过提供的数据进行计算并绘制出图表信息。由于在数据的分析计算中并不是单一的数值,所以绘制图表要为JFreeChart组件提供数据集合。

数据集合对象是用于装载绘制图表所需要的数据集。在JFreeChart组件中,针对不同图表类型提供了不同的数据集合对象,它们所具有的作用也是不同的。本节内容将以常用的数据集合对象为例,来讲解JFreeChart中的数据集合对象,在学习JFreeChart数据集合对象前,先来了解一下常用数据集合对象之间的关系,其类图如图1所示。

DataSet JFreeChart 数据集合对象

Dataset接口是数据集合的核心对象,从图1可以看出,所有数据集合对象都直接或间接的实现了此接口。图中类名以Abstract开头的类均为抽象,它们并不能实例化,但为其子类提供公共属性与方法,其中DefaultCategoryDataset类、DefaultPieDataset类、XYSeriesCollection类与TimeSeriesCollection类为经常用到的数据集合对象,其说明如表1所示。

表1 常用数据集合对象 及说明

数据集合对象 说明
DefaultCategoryDataset类 默认的类别数据集合对象,可用于创建柱形图、区域图数据集合等
DefaultPieDataset类 默认的饼形图数据集合对象,可用于创建饼形图数据集合
XYSeriesCollection类 描述坐标轴序列类型的数据集合,可用于创建折线图等数据集合
TimeSeriesCollection类 描述时间序列的数据集合,可用于创建时序图等数据集合

数据集合是数据集的封装对象,在JFreeChart组件的使用中,绘制每一种图形都需要用到数据集合对象。图1中只介绍了常用的数据集合关系,除了这些数据集合外,JFreeChart还针对不同图表各类提供了同的数据集合,由于篇幅原因,并进行一一介绍,其使用方法请参阅JFreeChart组件的API文档。

例如:

DefaultCategoryDataset dataset=new DefaultCategoryDataset(); //创建数据集合dataSet.addValue(100,"长春","土豆");  //向数据集合中添加数据

上述代码创建一个DefaultCategoryDataset类型的数据集合,并调用addValue()方法向数据集合中添加一个数据。

绘图区对象

通过数据集合所生成数据图表,可以通过绘图区对象进行属性设置,例如背景色、透明度等样式。绘图区对象是JFreeChart组件中的一个重要对象,它由Plot类定义,使用过程中可以通过此类进行设置绘图区属性及样式,其常用方法及说明如表1所示。

表1 Plot 类常用方法及说明

方法 说明
public void setBackgroundImage(Image image) 设置数据区的背景图片
public void setBackgroundImageAlignment(int alignment) 设置数据区的背景图片对齐方式(参数常量在org.jfree.ui.Align类中定义)
public void setBackgroundAlpha(float alpha) 设置数据区的背景透明度,范围在0.0~1.0间
public void setForegroundAlpha(float alpha) 设置数据区的前景透明度,范围在0.0~1.0间
public void setDataAreaRatio(double ratio) 设置数据区占整个图表区的百分比
public void setOutLinePaint(Paint paint) 设置数据区的边界线条颜色
public void setNoDataMessage(String message) 设置没有数据时显示的消息

JFreeChart所能生成的图形报表是多种多样的,仅仅一个Plot类并不能满足绘图区样式的设置,在对不同类型图形的设置中,可以通过Plot的子类进行实现,其常用子类的类图如图1所示。

Plot类

PiePlot 类

PiePlot类是Plot类的子类,主要用于描述PieDataset数据集合类型的图表,通常使用此类来绘制一个饼形图,其常用方法及说明如表2所示。

表2 PiePlot 类常用方法及说明

方法 说明
public void setDataset(PieDataset dataset) 设置绘制图表所需要的数据集合
public void setDataset(PieDataset dataset) 设置绘制图表所需要的数据集合
public void setCircular(boolean flag) 设置饼形图是否一定是正圆
public void setStartAngle(double angle) 设置饼形图的初始角度
public void setDirection(Rotation direction) 设置饼形图的旋转方向
public void setExplodePercent(int section,double percent) 设置抽取图表的部分及距离
public void setLabelFont(Font font) 设置分类标签字体(3D效果下无效)
public void setLabelPaint(Paint paint) 设置分类标签字体颜色(3D效果下无效)
CategoryPlot 类

CategoryPlot类主要用于描述CategoryDataset数据集合类型的图表,是Plot类的子类,它支持折线图、区域图等,其常用方法及说明如表3所示。

表3 CategoryPlot 类常用方法及说明

方法 说明
public void setDataset(PieDataset dataset) 设置绘制图表所需要的数据集合
public void setColumnRenderingOrder(SortOrder order) 设置数据分类的排序方式
public void setAxisOffset(Spacer offset) 设置坐标轴到数据区的间距
public void setOrientation(PlotOrientation orientation) 设置数据区的方向(横向或纵向)
public void setDomainAxis(CategoryAxis axis) 设置数据区的分类轴
public void setRangeAxis(ValueAxis axis) 设置数据区的数据轴
public void addAnnotation(CategoryAnnotation annotation) 设置数据区的注释
XYPlot 类

XYPlot类是Plot类的子类,主要用于描述XYDataset数据集合类型的图表,此类可以具有0或多个数据集合,并且每一个数据集合可以也一个渲染对象相关联,其常用方法及说明如表4所示。

表4 XYPlot 类常用方法及说明

方法 说明
public ValueAxis getDomainAxis 返回X轴
public ValueAxis getRangeAxis() 返回Y轴
public void setDomainAxis(ValueAxis axis) 设置X轴
public void setRangeAxis(ValueAxis axis) 设置Y轴

坐标轴对象

在JFreeChart组件中,涉及到坐标轴类型的图表,其样式与属性由坐标轴对象Axis类进行控制,此类是坐标轴对象的父类,其常用方法及说明如表1所示。

表1 Axis 类常用方法及说明

方法 说明
public void setVisible(boolean flag) 设置坐标轴是否可见
public void setAxisLinePaint(Paint paint) 设置坐标轴线条颜色,此设置在3D效果下无效
public void setAxisLineVisible(boolean visible) 设置坐标轴线条是否可见
public void setLabel(String label) 设置坐标轴标题
public void setLabelFont(Font font) 设置坐标轴标题字体
public void setLabelPaint(Paint paint) 设置坐标轴标题颜色
public void setLabelAngle(double angle) 设置坐标轴标题旋转角度

JFreeChart组件针对不同类型的图表对象,提供了不同类型的坐标轴对象,由Axis类的子类进行扩展,其常用子类的类图如图1所示。

Axis类

CategoryAxis 类

CategoryAxis类是Axis类的子类,主要用于对分类轴的相关属性进行设置,其常用方法及说明如表2所示。

表2 CategoryAxis类常用方法及说明

方法 说明
public void setCategoryMargin(double margin) 设置分类轴边距
public void setLowerMargin(double margin) 设置分类轴下边距或左边距
public void setUpperMargin(double margin) 设置分类轴上边距或右边距
public void setVerticalCategoryLabels(boolean flag) 设置分类轴标题是否旋转到垂直
public void setMaxCategoryLabelWidthRatio(float ratio) 设置分类轴分类标签的最大宽度
ValueAxis 类

ValueAxis类是Axis类的子类,主要用于对数据轴的相关属性进行设置,它还是NumberAxis类与DateAxis类的父类,其常用方法及说明如表3所示。

表3 ValueAxis 类常用方法及说明

方法 说明
public void setAutoRange(boolean auto) 设置数据轴数据范围是否为自动
public void setFixedAutoRange(double length) 设置数据轴固定数据范围
public void setInverted(boolean flag) 设置数据轴是否反向
public void setLowerMargin(double margin) 设置分类轴下边距或左边距
public void setUpperMargin(double margin) 设置分类轴上边距或右边距
public void setLowerBound(double min) 设置数据轴上的显示最小值
public void setUpperBound(double max) 设置数据轴上的显示最大值
NumberAxis 类

NumberAxis类主要用于对数值类型数据轴的相关属性进行设置,是ValueAxis类的子类,其常用方法及说明如表4所示。

表4 CategoryPlot 类常用方法及说明

方法 说明
public void setAutoRangeIncludesZero(boolean flag) 设置是否强制在自动选择的数据范围中包含0
public void setAutoRangeStickyZero(boolean flag) 设置是否强制在整个数据轴中包含0,即使0不在数据范围中
public void setNumberFormatOverride(NumberFormat formatter) 设置数据轴数据标签的显示格式
DateAxis 类

DateAxis类主要用于对日期轴的相关属性进行设置,是ValueAxis类的子类,其常用方法及说明如表5所示。

表5 CategoryPlot 类常用方法及说明

方法 说明
public void setMaximumDate(Date maximumDate) 设置日期轴上的最小日期
Public void setMinimumDate(Date minimumDate) 设置日期轴上的最大日期
public void setDateFormatOverride(DateFormat formatter) 设置日期轴日期标签的显示格式
public void setTickUnit(DateTickUnit unit) 设置日期轴的日期标签

图片渲染对象

图片渲染对象用于渲染和显示图表,它在图表的显示效果方面起着很大的作用。在JFreeChart组件中,渲染对象定义为AbstractRenderer类,此类是所有渲染对象的父类,但它是一个抽象类,其常用方法及说明如表1所示。

Axis 类

在图片渲染对象中,JFreeChart组件同样对AbstractRenderer类进行了扩展,在使用过程中可根据实际需要,选择合适的AbstractRenderer类的子类对象。

JFreeChart 的应用

如何获取图片

JFreeChart组件能够生成.jpeg、.png格式的图片,其输出方式可以直接存储在硬盘之中,也可以交给JFreeChart组件进行管理。在Web项目的应用中,所生成的图形报表一般均为动态图表,如果对每次生成的图表都进行直接存储,将会产生大量的垃圾文件,时间长久将要做一定清理工作。因此,由JFreeChart组件管理所生成的图片是一个不错的选择,它不仅可以提供图片的路径,而且在查看图片后,JFreeChart组件自动做出清理工作。

JFreeChart组件提供了一个Servlet文件用于获取生成的图片,此Servlet文件存在于JFreeChart组件包中,所以在使用过程中,需要将其配置到Web.xml文件中,其配置方法如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
      http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
     <servlet>
         <servlet-name>DisplayChart</servlet-name>
         <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
     <servlet-mapping>
            <servlet-name>DisplayChart</servlet-name>
            <url-pattern>/servlet/DisplayChart</url-pattern>
      </servlet-mapping>   
</web-app> 

ServletUtilities类的saveChartAsJPEG()方法进行生成,它返回一个.jpeg格式的图片名称。

public static String saveChartAsJPEG(JFreeChart chart ,int width,int height ,HttpSession session )throws IOException 

参数的说明:

chart :制图对象JFreeChartford
width:所生成图片的宽度
height:所生成图片的高度
session”HttpSession对象

通过此方法生成图片后,调用已注册的JFreeChart提供的Servlet类DisplayChart,即可获取到图片的相对路径。
例如:在Jsp页面中获取图片。

<%
         String fileName = ServletUtilities.saveChartAsJPEG(ChartUtil.createChart(), 450, 300, session);
      String graphURL = request.getContextPath() + "/DisplayChart?filename=" + fileName;
%>

上述代码生成了一个宽为450、高为300的图片,其文件名fileName,它的路径为graphURL,通过此路径即可对所生成的图片进行访问。

创建数据集合与JFreeChart 实例

通过DefaultCategoryDataset数据集合对象创建柱形图制图对象,其关键代码如下:

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 CharUtil {
   
    //创建数据集合 
    public static CategoryDataset createDataSet(){
        DefaultCategoryDataset dataSet=new DefaultCategoryDataset();  //实例化DefaultCategoryDataset对象
        dataSet.addValue(500, "JAVA图书", "J2SE类"); //向数据集合中添加数据
        dataSet.addValue(100, "JAVA图书", "JAVAME类");
        dataSet.addValue(900, "JAVA图书", "J2EE类");
        return dataSet;
    }
    //创建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;
    }
}

ChartUtil类是一个自定义的制图工具类,其中createDataSet()方法用于创建柱形图所需要的数据集合,它返回CategoryDataset对象。CreateChart()用于创建制图对象JFreeChart,在此方法中通过ChartFactory对象的createBarChart3D()方法创建一个3D效果的柱形图对象,并将其返回。

DisplayChart进行获取图片,实例中在index.jsp页面中输出图片,其关键代码如下:

<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>
<%@ page import="org.jfree.chart.servlet.ServletUtilities,com.lyq.util.ChartUtil"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>Java图书销量统计</title>
  </head>
  <body>
    <%
               String fileName = ServletUtilities.saveChartAsJPEG(ChartUtil.createChart(),450,300,session);
               String graphURL = request.getContextPath() + "/DisplayChart?filename=" + fileName;
    %>
    <img src="<%=graphURL%>" border="1">
  </body>
</html>

ServletUtilities类的saveChartAsJPEG()方法进行生成,它返回一个.jpeg格式的图片名称。
在输出图片之前,首先要生成JFreeChart组件所绘制的图片,此操作通过调用ServletUtilities类的saveChartAsJPEG()方法进行生成,它返回一个.jpeg格式的图片名称。

在获取此图片名称后,通过代码“request.getContextPath() + “/DisplayChart?filename=” + fileName”即可获取到图片的路径.

图表相关属性的设置

通常情况下,为了使所生成图片美观、大方,需要对所生成的图片进行一定的设置,如制图对象设置、绘图区设置、坐标轴设置及图片渲染等。


import java.awt.Font;
import java.awt.Image;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.VerticalAlignment;
/**
 * 自定义绘图工具类
 * @author Li Yong Qiang
 */
public class ChartUtil {
   

/*实例中首先创建数据集合对象DefaultCategoryDataset,并添加四个季度的销量数据,其关键代码如下:*/
    /**
     * 创建数据集合
     * @return CategoryDataset对象
     */
    public static CategoryDataset createDataSet() {
        //实例化DefaultCategoryDataset对象
        DefaultCategoryDataset dataSet = new DefaultCategoryDataset();
        //添加第一季度数据
        dataSet.addValue(6000, "第一季度", "J2SE类");
        dataSet.addValue(3000, "第一季度", "J2ME类");
        dataSet.addValue(12000, "第一季度", "J2EE类");
        //添加第二季度数据
        dataSet.addValue(8000, "第二季度", "J2SE类");
        dataSet.addValue(4000, "第二季度", "J2ME类");
        dataSet.addValue(6000, "第二季度", "J2EE类");
        //添加第三季度数据
        dataSet.addValue(5000, "第三季度", "J2SE类");
        dataSet.addValue(4000, "第三季度", "J2ME类");
        dataSet.addValue(8000, "第三季度", "J2EE类");
        //添加第四季度数据
        dataSet.addValue(8000, "第四季度", "J2SE类");
        dataSet.addValue(2000, "第四季度", "J2ME类");
        dataSet.addValue(9000, "第四季度", "J2EE类");
        return dataSet;
    }
/*   createDataSet()方法定义在ChartUtil类中,它是一个自定义的制图工具类。在此类中,还包含创建制图对象的方法createChart(),用于柱形图对象,其关键代码如下:                       */
    /**
     * 创建JFreeChart对象
     * @return JFreeChart对象
     */

    public static JFreeChart createChart() {
        //通过ChartFactory创建JFreeChart
        JFreeChart chart = ChartFactory.createBarChart3D(
                "JAVA图书销量统计",           //图表标题
                "JAVA图书",                   //横轴标题
                "销量(本)",                //纵轴标题
                createDataSet(),            //数据集合 
                PlotOrientation.VERTICAL,   //图表方向
                true,                       //是否显示图例标识
                false,                      //是否显示tooltips
                false);                     //是否支持超链接
        //背景图片
        Image image = null;
        try {
            //创建背景图片
            image = ImageIO.read(ChartUtil.class.getResource("test.JPG"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        //设置标题字体
        chart.getTitle().setFont(new Font("隶书",Font.BOLD,25));
        //设置图例类别字体
        chart.getLegend().setItemFont(new Font("宋体",Font.PLAIN,12));
        chart.setBorderVisible(true);   //设置显示边框
        //实例化TextTitle对象
        TextTitle subTitle = new TextTitle("2009年Java类图书全国销量统计(J2SE、J2ME、J2EE)");
        //设置居中显示
        subTitle.setVerticalAlignment(VerticalAlignment.BOTTOM);
        chart.addSubtitle(subTitle);    //添加子标题
        //获取绘图区对象
        CategoryPlot plot = chart.getCategoryPlot();
        plot.setForegroundAlpha(0.8F);  //设置绘图区前
  • 7
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值