JFreeChart 快速指南



JFreeChart - 概述

图表是信息的图形化表示。有多种工具可用于创建不同类型的图表。JFreeChart 项目由 David Gilbert 于 2000 年 2 月创建。如今,它是 Java 开发人员中使用最广泛的图表库。

本教程将帮助您了解 JFreeChart 究竟是什么,为什么需要它,以及在基于 Java 的应用程序或独立应用程序中创建不同类型图表的各种方法。

什么是 JFreeChart?

JFreeChart 是一个用 Java 开发的开源库。它可以用于基于 Java 的应用程序中创建各种图表。使用 JFreeChart,我们可以创建所有主要的 2D 和 3D 图表类型,例如饼图、柱状图、折线图、XY 图表和 3D 图表。

为什么选择 JFreeChart?

JFreeChart 是开源且 100% 免费的,允许在商业应用程序中使用而无需任何费用。我们在此列出了一些支持您应该使用 JFreeChart 的更多理由:

  • 它附带完善的 API 文档,使其易于理解。

  • 它支持各种图表类型,例如饼图、折线图、柱状图、面积图和 3D 图表。

  • JFreeChart 易于扩展,可用于客户端和服务器端应用程序。

  • 它支持多种输出格式,例如 PNG、JPEG、PDF、SVG 等。

  • 它允许对图表进行广泛的自定义。

假设您正在开发一个应用程序,并且需要以图表的形式显示数据,并且数据本身是动态填充的。在这种情况下,使用 JFreeChart 编程以图表形式显示数据非常简单。

JFreeChart - 安装

JFreeChart 以其高效的图表创建和用户友好的安装设置而闻名。本章介绍在 Windows 和 Linux 上设置 JFreeChart 的过程。安装 JFreeChart 需要用户管理。

系统要求

JDK 1.5 或更高版本
内存 2GB RAM
磁盘空间 无最低要求
操作系统版本 Linux 或 Windows

安装 JFreeChart

安装 JFreeChart 包括以下三个步骤:

JFreeChart Steps

步骤 1:验证 Java 安装

要验证 Java 安装,请打开控制台并执行以下 java 命令:

操作系统 任务 命令
Windows 打开命令控制台 C:>java -version
Linux 打开命令终端 $java -version

如果 Java 安装正确,则两个操作系统都应该获得以下输出:

序号 操作系统和说明
1

Windows

java version "1.7.0_60" Java(TM) SE Runtime Environment (build 1.7.0_60-b19) Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)

2

Linux

java version "1.7.0_25" OpenJDK Runtime Environment (rhel2.3.10.4.el6_4-x86_64) OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode)

如果您尚未安装 Java,请从以下链接安装 Java 软件开发工具包 (SDK):

https://www.oracle.com/technetwork/java/javase/downloads/index.html

我们假设您已安装 Java 1.7.0_60 版本,然后再进行本教程。

步骤 2:设置 JAVA 环境

设置JAVA_HOME环境变量以指向 Java 安装在您机器上的基本目录位置。例如:

序号 操作系统和说明
1

Windows

将环境变量 JAVA_HOME 设置为 C:\ProgramFiles\java\jdk1.7.0_60

2

Linux

export JAVA_HOME=/usr/local/java-current

将 Java 编译器位置添加到系统路径。

序号 操作系统和说明
1

Windows

将字符串 ;C:\Program Files\Java\jdk1.7.0_60\bin 附加到系统变量 PATH 的末尾。

2

Linux

export PATH=$PATH:$JAVA_HOME/bin/

如上所述,验证命令提示符中的java -version命令。

步骤 3:安装 JFreeChart

从以下链接下载最新版本的 JFreeChart.zip:http://www.jfree.org/jfreechart/download/ 将下载的文件解压缩到任何位置,然后可以将所需的库链接到您的 Java 程序中。下图显示了目录和文件的结构:

JFreeChart

将 jfreechart-1.0.18.jar 和 jcommon-1.0.22.jar 文件的完整路径添加到 CLASSPATH,如下所示:

序号 操作系统和说明
1

Windows

将字符串“C:\ jfreechart-1.0.18\lib\ jfreechart-1.0.18.jar”和“C:\ jfreechart-1.0.18\lib\ jcommon-1.0.22.jar”附加到用户变量 CLASSPATH 的末尾

2

Linux

Export CLASSPATH=$CLASSPATH: /usr/share/jfreechart1.0.18/lib/jfreechart-1.0.18.jar: /usr/share/jfreechart-1.0.18/lib/jcommon1.0.22.jar

注意 - 为了与 MySql 数据库通信,您还需要将类路径设置为mysql-connector-java-5.0.8-bin.jar

JFreeChart - 架构

本章介绍 JFreeChart 的基本类级别和应用程序级别架构,让您了解 JFreeChart 如何与不同的类交互以及它如何在基于 Java 的应用程序中运行。

类级别架构

类级别架构解释了库中的各种类如何相互交互以创建各种类型的图表。

JFreeChart Class Level Architecture

以下是上述框图中使用的单元的详细信息:

序号 单元和说明
1

文件

包含用户输入的源,用于在文件中创建数据集。

2

数据库

包含用户输入的源,用于在数据库中创建数据集。

3

创建数据集

接受数据集并将数据集存储到数据集对象中。

4

通用数据集

此类型的数据集主要用于饼图。

5

类别数据集

此类型的数据集用于柱状图、折线图等。

6

系列数据集

此类型的数据集用于存储一系列数据并构建折线图。

7

系列集合数据集

将不同类别的系列数据集添加到系列集合数据集中。此类型的数据集用于 XY 折线图。

8

创建图表

这是执行以创建最终图表的执行方法。

9

框架/图像

图表显示在 Swing 框架上或创建图像。

应用程序级别架构

应用程序级别架构解释了 JFreeChart 库在 Java 应用程序中的位置。

JFreeChart Application Level Architecture

客户端程序接收用户数据,然后根据需求使用标准 Java 和 JFreeChart API 生成输出,输出形式可以是直接在应用程序或独立显示的框架,也可以是 JPEG 或 PNG 等图像格式。

JFreeChart - 参考 API

在本章中,我们将讨论 JFreeChart 库中一些重要的包、类和方法。在使用 JFreeChart 库创建各种图表时,这些包、类和方法最常用。

ChartFactory 类

ChartFactory 是org.jfree.chart包下的抽象类。它提供了一组用于生成标准图表的实用程序方法。

以下是一些重要方法的列表:

类构造函数

序号 说明
1

ChartFactory()

ChartFactory 类的默认构造函数。

类方法

序号 方法和说明
1

createPieChart(java.lang.String title, PieDataset dataset, boolean legend, boolean tooltips, boolean urls)

此方法使用默认设置创建饼图。它返回 JFreeChart 类型对象。

2

createPieChart3D(java.lang.String title, PieDataset dataset, boolean legend, boolean tooltips, boolean urls

此方法使用指定的数据集创建 3D 饼图。

3

createBarChart(java.lang.String title, java.lang.String categoryAxisLabel, java.lang.String valueAxisLabel, CategoryDataset dataset, PlotOrientation orientation, boolean legend, boolean tooltips, boolean urls)

参数 java.lang.String categoryAxisLabel 是放置在 X 轴上的值的标签。参数 java.lang.String valueAxisLabel 是放置在 Y 轴上的值的标签。

此方法创建一个柱状图。

4

createBarChart3D(java.lang.String title, java.lang.String categoryAxisLabel, java.lang.String valueAxisLabel, CategoryDataset dataset, PlotOrientation orientation, boolean legend, boolean tooltips, boolean urls)

此方法创建一个具有 3D 效果的柱状图。它返回 JFreeChart 类型对象。

5

createLineChart(java.lang.String title, java.lang.String categoryAxisLabel, java.lang.String valueAxisLabel, CategoryDataset dataset, PlotOrientation orientation, boolean legend, boolean tooltips, boolean urls)

此方法使用默认设置创建折线图。

6

createLineChart3D(java.lang.String title, java.lang.String categoryAxisLabel, java.lang.String valueAxisLabel, CategoryDataset dataset, PlotOrientation orientation, boolean legend, boolean tooltips, boolean urls)

此方法创建一个具有 3D 效果的折线图。

7

createXYLineChart(java.lang.String title, java.lang.String xAxisLabel, java.lang.String yAxisLabel, XYDataset dataset, PlotOrientation orientation, boolean legend, boolean tooltips, boolean urls)

此方法基于 XYDataset 创建具有默认设置的折线图。

ChartFrame 类

org.jfree.chart 包下的 ChartFrame 类提供所有与框架相关的功能和实用程序。ChartFrame 类继承自父类,例如 Frame、Window、Container 和 Component 类。

类构造函数

序号 构造函数和说明
1

ChartFrame (java.lang.Frame String, JFreeChart chart)

它构造一个框架。

2

Chart Frame (java.lang.Frame String, JFreeChart chart, boolean scrollpane)

它构造一个框架。

类方法

序号 方法和说明
1

getChartPanel()

此方法返回框架的图表面板。

ChartPanel 类

org.jfree.chart包中的 ChartPanel 类用作显示 JFreeChart 对象的 Swing GUI 组件。

类构造函数

序号 构造函数和说明
1

ChartPanel(JFreeChart chart)

此构造函数构造一个显示指定图表的panel。

2

ChartPanel(JFreeChart chart, boolean useBuffer)

此构造函数构造一个包含图表的panel。

3

ChartPanel(JFreeChart chart, boolean properties, boolean save, boolean print, boolean zoom, boolean tooltips)

此构造函数构造一个 JFreeChart 面板。

类方法

序号 方法和说明
1

setPreferredSize(java.awt.Dimension)

此方法用于使用 java.awt.Dimension 类对象作为参数设置框架大小。此方法取自 javax.swing.JComponent。

ChartUtilities 类

org.jfree.chart包中的 ChartUtilities 类提供了一组 JFreeCharts 的实用程序方法,包括将图表转换为 PNG、JPEG 等图像文件格式以及创建 HTML 图像地图的方法。

类构造函数

序号 构造函数和说明
1

ChartUtilities()

这是类的默认构造函数

类方法

序号 方法和说明
1

saveChartAsPNG(java.io.File file, JFreeChart chart, int width, int height)

此方法将图表转换为 PNG 格式并保存到指定的文件中。

2

saveChartAsJPEG(java.io.File file, JFreeChart chart, int width, int height)

此方法将图表转换为 JPEG 格式并保存到指定的文件中。

JFreeChart 类

JFreeChart 类是org.jfree.chart包下的核心类。此类提供 JFreeChart 方法来创建柱状图、折线图、饼图和 xy 图表(包括时间序列数据)。

类构造函数

序号 构造函数和说明
1

JFreeChart(Plot plot)

此构造函数基于提供的绘图创建一个新的图表。

2

JFreeChart(java.lang.String title, java.awt.Font titleFont, Plot plot, boolean createLegend)

此构造函数使用给定的标题和绘图创建一个新的图表。

3

JFreeChart(java.lang.String title, Plot plot)

此构造函数使用给定的标题和绘图创建一个新的图表。

类方法

序号 方法和说明
1

getXYPlot()

此方法将图表绘图返回为XYPlot。使用 XYPlot,我们可以在 xy 图表上进行一些实用程序操作。

PiePlot 类

此类是org.jfree.chart.plot包的一部分,并扩展了同一包中的 Plot 类。此类提供创建饼图的方法。

类构造函数

序号 构造函数和说明
1

PiePlot()

它创建一个新的绘图。

2

PiePlot(PieDataset dataset)

此方法创建一个绘图,为指定的数据集绘制饼图。

类方法

序号 方法和说明
1

setStartAngle(double angle)

此方法设置起始角度,并向所有已注册的监听器发送 PlotChangeEvent。

PiePlot3D 类

PiePlot3D 类是同包下 PiePlot 类的子类。因此,此类具有与 PiePlot 类相同的特性,只是它用于创建 3D 绘图。

类构造函数

序号 构造函数和说明
1

PiePlot3D()

此构造函数创建一个没有数据集的新实例。

2

PiePlot3D(PieDataset dataset)

此构造函数使用指定的数据集创建一个具有三维效果的饼图。

类方法

序号 方法和说明
1

setForegroundAlpha(float alpha)

此方法设置绘图的 alpha 透明度,并向所有已注册的监听器发送 PlotChangeEvent。此方法来自父 Plot 类之一。

2

setInteriorGap(double percent)

此方法设置内部间隙,并向所有已注册的监听器发送 PlotChangeEvent。它控制饼图边缘与绘图区域本身(即,显示扇区标签的区域)之间的空间。此方法来自父类 PiePlot。

PlotOrientation 类

这是一个可序列化的类,位于 **org.jfree.chart.plot** 包中,用于显示二维绘图的方向。方向可以是 **垂直** 或 **水平**。它设置 Y 轴的方向。常规绘图具有垂直的 Y 轴。

字段摘要

序号 类型 字段和描述
1 PlotOrientation **HORIZONTAL** 对于范围轴(Y 轴)为水平的绘图。
2 PlotOrientation **VERTICAL** 对于范围轴(Y 轴)为垂直的绘图。这是默认方向。

类方法

序号 方法和说明
1

isHorizontal()

如果此方向为 HORIZONTAL,则此方法返回 true,否则返回 false。

2

isVertical()

如果此方向为 VERTICAL,则此方法返回 true,否则返回 false。

XYPlot 类

这是一个通用的类,位于 **org.jfree.chart.plot** 包中,用于绘制 (x,y) 对形式的数据。此绘图可以使用实现 XYDataSet 接口的任何其他类的数据。XYPlot 使用 XYItemRenderer 绘制绘图上的每个点。

类构造函数

序号 构造函数和说明
1

XYPlot()

此构造函数创建一个没有数据集、没有轴和没有渲染器的新 XYPlot 实例。

2

**XYPlot(XYDataset dataset, ValueAxis** domainAxis, **ValueAxis** rangeAxis, **XYItemRenderer** renderer)

此构造函数使用指定的数据集、轴和渲染器创建一个新的绘图。

类方法

序号 方法和说明
1

**setRenderer(XYItemRenderer** renderer)

此方法设置主数据集的渲染器,并向所有已注册的监听器发送更改事件。

NumberAxis 类

此类位于 **org.jfree.chart.axis** 包中,可以访问任何轴的数值数据。当我们将任何轴的范围设置为默认值时,它会根据数据的范围进行调整。但是,使用 NumberAxis 类,我们可以设置域和范围轴的下边距和上边距。

类构造函数

序号 构造函数和说明
1

NumberAxis( )

这是 NumberAxis 的默认构造函数。

2

NumberAxis( java.lang.String label)

NumberAxis 构造函数在必要时使用默认值。

类方法

序号 方法和说明
1

setLowerMargin(double margin)

此方法设置轴的下边距(作为轴范围的百分比),并向所有已注册的监听器发送 **AxisChangeEvent**。此方法来自 ValueAxis 类的父类。

2

setUpperMargin(double margin)

此方法设置轴的上边距(作为轴范围的百分比),并向所有已注册的监听器发送 **AxisChangeEvent**。此方法也存在于 ValueAxis 类中。

XYLineAndShapeRenderer 类

此类位于 **org.jfree.chart.renderer.xy** 包下,负责用线连接数据点并在每个数据点处绘制形状。此渲染器类设计用于与 **XYPlot** 类一起使用。

类构造函数

序号 构造函数和描述
1

XYLineAndShapeRenderer()

此方法创建一个新的渲染器,其中线条和形状都可见。

2

**XYLineAndShapeRenderer** (boolean lines, boolean shapes)

此方法创建一个具有特定属性的新渲染器。

类方法

序号 方法和说明
1

setSeriesPaint(int series, java.awt.Paint paint)

此方法设置用于系列的绘制颜色,并向所有已注册的监听器发送 **RendererChangeEvent**。此方法来自 JFreeChart API 渲染器包中的 AbstratRenderer 抽象类。

2

setSeriesStroke(int series, java.awt.Stroke stroke)

此方法设置用于系列的笔触,并向所有已注册的监听器发送 **RendererChangeEvent**。此方法来自 AbstratRenderer 抽象类,它是此包的超类。

XYItemRenderer 通用数据集

这是一个接口,用于渲染 XYPlot 上单个 (x, y) 项目的格式。该包是 **org.Jfree.data.general**,其中包含用于定义不同类型的数据集以构建图表 的类和接口。

PieDataset

这是一个用作通用数据集的接口,其中值与键相关联。顾名思义,您可以使用此数据集为饼图提供数据。此接口扩展了 KeyedValues 和 DataSet 接口。此接口使用的方法均来自 KeyedValues、Values 和 Dataset 接口。

DefaultPieDataset 类

这是 PieDataset 接口的默认实现类。

类构造函数

序号 构造函数和说明
1

DefaultPieDataset()

此构造函数创建一个新的数据集,最初为空。

2

DefaultPieDataset(KeyedValues data)

它通过从 **KeyedValues** 实例复制数据来创建一个新的数据集。

类方法

序号 方法和描述
1

setValue(java.lang.Comparable key, double value)

此方法设置键的数据值,并向所有已注册的监听器发送 **DatasetChangeEvent**。

2

setValue(java.lang.Comparable key, java.lang.Number value)

此方法设置键的数据值,并向所有已注册的监听器发送 **DatasetChangeEvent**。

SeriesException 类

这是一个异常类。它引发了在数据集数据的时间序列中发生的异常。在出现重复或无效数据时会引发异常。时间序列不能应用重复项,并且格式必须有效。

DefaultCategoryDataset

这是 CategoryDataset 接口的默认实现类。

类构造函数

序号 构造函数和说明
1

DefaultCategoryDataset()

此构造函数创建一个新的空数据集。

类方法

序号 方法和说明
1

addValue(double value, java.lang.Comparable rowKey, java.lang.Comparable columnKey)

此方法使用可比较的键向表添加值。

2

addValue(java.lang.Number value, java.lang.Comparable rowKey, java.lang.Comparable columnKey)

此方法向表添加值。

3

setValue(double value, java.lang.Comparable rowKey, java.lang.Comparable columnKey)

此方法添加或更新表中的值,并向所有已注册的监听器发送 **DatasetChangeEvent**。

4

setValue(java.lang.Number value, java.lang.Comparable rowKey, java.lang.Comparable columnKey)

此方法添加或更新表中的值,并向所有已注册的监听器发送 **DatasetChangeEvent**。

有关各种其他方法和字段的更多信息,请参阅 JFreeChart API。

系列数据集

系列数据集由 XY 图表使用。该包是 **org.Jfree.data.xy**,其中包含属于 xy 图表的类和接口。核心接口是 XYDataset。

XYDataset

这是一个接口,可以通过它访问 (x,y) 项目形式的数据。顾名思义,您可以使用此数据集来服务 XY 图表。此接口中的某些方法来自 SeriesDateset 接口。

XYZDataset

这是一个接口,可以通过它访问 (x,y,z) 项目形式的数据。顾名思义,您可以使用此数据集来服务 XYZ 图表。此接口中的某些方法来自 SeriesDateset。

XYSeries

这是一个类,它表示 (x, y) 形式的一个或多个数据项的序列。默认情况下,系列中的项目按 x 值升序排序,并允许重复的 x 值。排序和重复默认值都可以在构造函数中更改。Y 值可以表示为 null 以表示缺失值。

类构造函数

序号 构造函数和说明
1

XYSeries(java.lang.Comparable key)

此构造函数创建一个新的空系列。

2

XYSeries(java.lang.Comparable key, boolean autoSort)

它构造一个新的空系列,自动排序标志按要求设置,并允许重复值。

3

XYSeries(java.lang.Comparable key, boolean autoSort, boolean allowDuplicateXValues)

它构造一个不包含数据的新的 xy 系列。

类方法

序号 方法和说明
1

add(double x, double y)

此方法将数据项添加到系列中。

上述方法在教程示例中使用。如果您想了解其余的方法和字段,请参阅 JFreeChart API。

XYSeriesCollection

XYSeriesCollection 类的父类包括 AbstractIntervelDataset、AbstractXYDatset、AbstractSeriesDataset 和 AbstractDataset。此类中的一些方法属于此类的父类。

类构造函数

序号 构造函数和说明
1

XYSeriesCollection()

它构造一个空数据集。

2

XYSeriesCollection(XYSeries xyseries)

它构造一个数据集并使用单个系列填充它。

类方法

序号 方法和说明
1

addSeries(XYSeries series)

此方法向集合添加一个系列,并向所有已注册的监听器发送 **DatasetChangeEvent**。

有关其余方法和字段,请参阅 JFreeChart API。

Default XYZDataset

DefaultXYZDataset 类的父类包括 AbstractIntervelDataset、AbstractXYDatset、AbstractSeriesDataset、AbstractDataset 和 AbstractXYZDataset。此类中的一些方法属于此类的父类。

类构造函数

序号 构造函数和说明
1

DefaultXYZDataset()

它构造一个空数据集。

类方法

序号 方法和说明
1

addSeries(java.lang.Comparable seriesKey, double[ ][ ] data )

此方法向集合添加一个系列,并向所有已注册的监听器发送 **DatasetChangeEvent**。

有关其余方法和字段,请参阅 JFreeChart API。

JFreeCharts 中的时间序列

该包是 **org.jfree.data.time**。此包包含用于时间相关数据的类和接口。

TimeSeries

此类表示周期值形式的数据项序列,其中周期是 RegularTimePeriod 抽象类的某个实例,例如 Time、Day、Hour、Minute 和 Second 类。

类构造函数

序号 构造函数和说明
1

TimeSeries(java.lang.Comparable name)

它创建一个新的空系列。

2

TimeSeries(java.lang.Comarable name, java.lang.String domain, java.lang.Strin range)

它创建一个不包含数据的新的时间序列。

类方法

序号 方法和说明
1

add(RegularTimePeriod period,double value)

此方法向系列添加新的数据项。

有关其余方法和字段,请参阅 JFreeChart API。

TimeSeriesCollection

这是一个用作时间序列对象集合的类。此类实现了XYDataset接口,并扩展了IntervelXYDataset接口。这使得收集序列数据对象非常方便。

类构造函数

序号 构造函数和说明
1

TimeSeriesCollection()

它构造一个空数据集,绑定到默认时区。

2

TimeSeriesCollection(TimeSeries series)

它构造一个包含单个序列(可以添加更多)的数据集,绑定到默认时区。

3

TimeSeriesCollection(TimeSeries series, java.util.TimeZone zone)

它构造一个包含单个序列(可以添加更多)的数据集,绑定到特定时区。

4

TimeSeriesCollection(java.util.TimeZone zone)

它构造一个空数据集,绑定到特定时区。

类方法

序号 方法和说明
1

addSeries(TimeSeries series)

此方法向集合添加一个系列,并向所有已注册的监听器发送 **DatasetChangeEvent**。

有关其余方法和字段,请参阅 JFreeChart API。

此类表示特定日期中的秒。此类是不可变的,这是所有RegularTimePeriod子类的要求。

类构造函数

序号 构造函数和说明
1

Second()

它基于系统日期/时间构造一个新的Second对象。

2

Second(java.util.Date time)

它根据指定的日期/时间和默认时区构造一个新实例。

3

Second(java.util.Date time, java.util.TimeZone zone, java.util.Locale locale)

它根据提供的时间和时区创建一个新的秒对象。

4

Second(int second, int minute, int hour, int day, int month, int year)

它创建一个新的秒对象。

5

Second(int second, Minute minute)

它构造一个新的Second对象。

类方法

序号 方法和说明
1

getSecond()

它返回分钟内的秒数。

2

next()

它返回当前秒之后的下一秒。

有关其余方法和字段,请参阅 JFreeChart API。

JFreeCharts中的框架

包为org.jfree.ui。这是属于JFreeChart的JCommons API的包。它包含用于为预配置图表创建框架的实用程序类。

ApplicationFrame

这是用于创建简单应用程序主框架的基类。框架侦听窗口关闭事件,并通过关闭JVM来响应。对于小型演示应用程序来说,这很好。对于企业应用程序,您需要使用更强大的工具。此类中的主要核心方法取自Component、Container、Window、Frame和Jframe类。

类构造函数

序号 构造函数和描述
1

ApplicationFrame(java.lang.String title)

它使用字符串标题创建一个应用程序框架。

此类有助于创建AWT框架。这就是为什么我们在本教程示例中使用此类作为超类的理由。

从父类中获取的方法用于打开框架、关闭框架、更改大小、更改背景或前景色以及监听器。

RefineryUtilities

这是一个与用户界面相关的实用程序方法集合类。

类方法

序号 方法和说明
1

centerFrameOnScreen(java.awt.Window frame)

它将指定的框架定位在屏幕中央。

上述方法在本教程示例中使用。有关其余方法和字段,请参阅JFreeChart API。

JFreeChart - 饼图

在饼图中,每个扇区的弧长与其代表的数量成正比。本章演示了如何使用JFreeChart从给定的业务数据集中创建饼图

业务数据

以下示例使用饼图描述手机销售情况。以下是不同手机品牌及其销量(每天单位)的列表。

序号 手机品牌 销量(每天单位)
1 Iphone 5S 20
2 三星Grand 20
3 MOTO G 40
4 诺基亚Lumia 10

基于AWT的应用程序

以下是使用上述信息创建饼图的代码。此代码可帮助您将饼图嵌入任何基于AWT的应用程序中。

import javax.swing.JPanel;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
 
public class PieChart_AWT extends ApplicationFrame {
   
   public PieChart_AWT( String title ) {
      super( title ); 
      setContentPane(createDemoPanel( ));
   }
   
   private static PieDataset createDataset( ) {
      DefaultPieDataset dataset = new DefaultPieDataset( );
      dataset.setValue( "IPhone 5s" , new Double( 20 ) );  
      dataset.setValue( "SamSung Grand" , new Double( 20 ) );   
      dataset.setValue( "MotoG" , new Double( 40 ) );    
      dataset.setValue( "Nokia Lumia" , new Double( 10 ) );  
      return dataset;         
   }
   
   private static JFreeChart createChart( PieDataset dataset ) {
      JFreeChart chart = ChartFactory.createPieChart(      
         "Mobile Sales",   // chart title 
         dataset,          // data    
         true,             // include legend   
         true, 
         false);

      return chart;
   }
   
   public static JPanel createDemoPanel( ) {
      JFreeChart chart = createChart(createDataset( ) );  
      return new ChartPanel( chart ); 
   }

   public static void main( String[ ] args ) {
      PieChart_AWT demo = new PieChart_AWT( "Mobile Sales" );  
      demo.setSize( 560 , 367 );    
      RefineryUtilities.centerFrameOnScreen( demo );    
      demo.setVisible( true ); 
   }
}

让我们将上面的Java代码保存在PieChart_AWT.java文件中,然后在命令提示符下编译并运行它:

$javac PieChart_AWT.java  
$java PieChart_AWT

如果一切正常,它将编译并运行以生成以下饼图:

JFreeChart Pie Chart

如果您不需要将图表嵌入任何应用程序中,则可以在命令提示符下创建图表图像。JFreeChart允许您将图表图像保存为JPG或PNG格式。

JPEG图像创建

让我们重写上面的示例,以从命令行生成JPEG图像。以下是JFreeChart库提供的两个API,您可以根据需要使用它们来生成PNG或JPEG图像。

  • saveChartAsPNG() - 保存PNG格式图像的API。

  • saveChartAsJPEG() - 保存JPEG格式图像的API。

import java.io.*;

import org.jfree.chart.ChartUtilities;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;

public class PieChart {
   
   public static void main( String[ ] args ) throws Exception {
      DefaultPieDataset dataset = new DefaultPieDataset( );
      dataset.setValue("IPhone 5s", new Double( 20 ) );
      dataset.setValue("SamSung Grand", new Double( 20 ) );
      dataset.setValue("MotoG", new Double( 40 ) );
      dataset.setValue("Nokia Lumia", new Double( 10 ) );

      JFreeChart chart = ChartFactory.createPieChart(
         "Mobile Sales",   // chart title
         dataset,          // data
         true,             // include legend
         true,
         false);
         
      int width = 640;   /* Width of the image */
      int height = 480;  /* Height of the image */ 
      File pieChart = new File( "PieChart.jpeg" ); 
      ChartUtilities.saveChartAsJPEG( pieChart , chart , width , height );
   }
}

让我们将上面的Java代码保存在PieChart.java文件中,然后在命令提示符下编译并运行它:

$javac PieChart.java  
$java PieChart

如果一切正常,它将编译并运行以在当前目录中创建一个名为PieChart.jpeg的JPEG图像文件。

JFreeChart - 柱状图

本章演示了如何使用JFreeChart从给定的业务数据集中创建条形图

条形图使用不同方向(水平或垂直)的条形来显示各个类别中的比较。图表的其中一个轴(域轴)显示正在比较的特定域,另一个轴(范围轴)表示离散值。

业务数据

以下示例使用条形图描述各种汽车统计数据。以下是汽车品牌及其不同特性的列表,我们将使用条形图显示这些特性:

汽车 速度 用户评分 里程 安全性
菲亚特 1.0 3.0 5.0 5.0
奥迪 5.0 6.0 10.0 4.0
福特 4.0 2.0 3.0 6.0

基于AWT的应用程序

以下是根据上述信息创建条形图的代码。此代码可帮助您将条形图嵌入任何基于AWT的应用程序中。

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.CategoryDataset; 
import org.jfree.data.category.DefaultCategoryDataset; 
import org.jfree.ui.ApplicationFrame; 
import org.jfree.ui.RefineryUtilities; 

public class BarChart_AWT extends ApplicationFrame {
   
   public BarChart_AWT( String applicationTitle , String chartTitle ) {
      super( applicationTitle );        
      JFreeChart barChart = ChartFactory.createBarChart(
         chartTitle,           
         "Category",            
         "Score",            
         createDataset(),          
         PlotOrientation.VERTICAL,           
         true, true, false);
         
      ChartPanel chartPanel = new ChartPanel( barChart );        
      chartPanel.setPreferredSize(new java.awt.Dimension( 560 , 367 ) );        
      setContentPane( chartPanel ); 
   }
   
   private CategoryDataset createDataset( ) {
      final String fiat = "FIAT";        
      final String audi = "AUDI";        
      final String ford = "FORD";        
      final String speed = "Speed";        
      final String millage = "Millage";        
      final String userrating = "User Rating";        
      final String safety = "safety";        
      final DefaultCategoryDataset dataset = 
      new DefaultCategoryDataset( );  

      dataset.addValue( 1.0 , fiat , speed );        
      dataset.addValue( 3.0 , fiat , userrating );        
      dataset.addValue( 5.0 , fiat , millage ); 
      dataset.addValue( 5.0 , fiat , safety );           

      dataset.addValue( 5.0 , audi , speed );        
      dataset.addValue( 6.0 , audi , userrating );       
      dataset.addValue( 10.0 , audi , millage );        
      dataset.addValue( 4.0 , audi , safety );

      dataset.addValue( 4.0 , ford , speed );        
      dataset.addValue( 2.0 , ford , userrating );        
      dataset.addValue( 3.0 , ford , millage );        
      dataset.addValue( 6.0 , ford , safety );               

      return dataset; 
   }
   
   public static void main( String[ ] args ) {
      BarChart_AWT chart = new BarChart_AWT("Car Usage Statistics", 
         "Which car do you like?");
      chart.pack( );        
      RefineryUtilities.centerFrameOnScreen( chart );        
      chart.setVisible( true ); 
   }
}

让我们将上面的Java代码保存在BarChart_AWT.java文件中,然后在命令提示符下编译并运行它:

$javac BarChar_AWT.java  
$java BarChart_AWT

如果一切正常,它将编译并运行以生成以下条形图:

JFree Chart

JPEG图像创建

让我们重写上面的示例,以从命令行生成JPEG图像。

import java.io.*;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.chart.ChartUtilities;

public class BarChart {
   
   public static void main( String[ ] args )throws Exception {
      final String fiat = "FIAT";
      final String audi = "AUDI";
      final String ford = "FORD";
      final String speed = "Speed";
      final String millage = "Millage";
      final String userrating = "User Rating";
      final String safety = "safety";

      final DefaultCategoryDataset dataset = new DefaultCategoryDataset( );
      dataset.addValue( 1.0 , fiat , speed );
      dataset.addValue( 3.0 , fiat , userrating );
      dataset.addValue( 5.0 , fiat , millage );
      dataset.addValue( 5.0 , fiat , safety );

      dataset.addValue( 5.0 , audi , speed );
      dataset.addValue( 6.0 , audi , userrating );
      dataset.addValue( 10.0 , audi , millage );
      dataset.addValue( 4.0 , audi , safety );

      dataset.addValue( 4.0 , ford , speed );
      dataset.addValue( 2.0 , ford , userrating );
      dataset.addValue( 3.0 , ford , millage );
      dataset.addValue( 6.0 , ford , safety );

      JFreeChart barChart = ChartFactory.createBarChart(
         "CAR USAGE STATIStICS", 
         "Category", "Score", 
         dataset,PlotOrientation.VERTICAL, 
         true, true, false);
         
      int width = 640;    /* Width of the image */
      int height = 480;   /* Height of the image */ 
      File BarChart = new File( "BarChart.jpeg" ); 
      ChartUtilities.saveChartAsJPEG( BarChart , barChart , width , height );
   }
}

让我们将上面的Java代码保存在BarChart.java文件中,然后在命令提示符下编译并运行它:

$javac BarChart.java  
$java BarChart 

如果一切正常,它将编译并运行以在当前目录中创建一个名为BarChart.jpeg的JPEG图像文件。

JFreeChart - 折线图

折线图或线形图将信息显示为一系列由直线段连接的数据点(标记)。折线图显示数据如何以相等的时间频率变化。

本章演示了如何使用JFreeChart从给定的业务数据集中创建折线图

业务数据

以下示例绘制了一条折线图,以显示从1970年开始不同年份开办的学校数量的趋势。

给定的数据如下:

年份 学校数量
1970 15
1980 30
1990 60
2000 120
2013 240
2014 300

基于AWT的应用程序

以下是根据上述信息创建折线图的代码。此代码可帮助您将折线图嵌入任何基于AWT的应用程序中。

import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;

public class LineChart_AWT extends ApplicationFrame {

   public LineChart_AWT( String applicationTitle , String chartTitle ) {
      super(applicationTitle);
      JFreeChart lineChart = ChartFactory.createLineChart(
         chartTitle,
         "Years","Number of Schools",
         createDataset(),
         PlotOrientation.VERTICAL,
         true,true,false);
         
      ChartPanel chartPanel = new ChartPanel( lineChart );
      chartPanel.setPreferredSize( new java.awt.Dimension( 560 , 367 ) );
      setContentPane( chartPanel );
   }

   private DefaultCategoryDataset createDataset( ) {
      DefaultCategoryDataset dataset = new DefaultCategoryDataset( );
      dataset.addValue( 15 , "schools" , "1970" );
      dataset.addValue( 30 , "schools" , "1980" );
      dataset.addValue( 60 , "schools" ,  "1990" );
      dataset.addValue( 120 , "schools" , "2000" );
      dataset.addValue( 240 , "schools" , "2010" );
      dataset.addValue( 300 , "schools" , "2014" );
      return dataset;
   }
   
   public static void main( String[ ] args ) {
      LineChart_AWT chart = new LineChart_AWT(
         "School Vs Years" ,
         "Numer of Schools vs years");

      chart.pack( );
      RefineryUtilities.centerFrameOnScreen( chart );
      chart.setVisible( true );
   }
}

让我们将上面的Java代码保存在LineChart_AWT.java文件中,然后在命令提示符下编译并运行它:

$javac LineChart_AWT.java  
$java LineChart_AWT 

如果一切正常,它将编译并运行以生成以下折线图:

JFreeChart Line Chart

JPEG图像创建

让我们重写上面的示例,以从命令行生成JPEG图像。

import java.io.*;

import org.jfree.chart.JFreeChart; 
import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartUtilities; 
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;

public class LineChart {

   public static void main( String[ ] args ) throws Exception {
      DefaultCategoryDataset line_chart_dataset = new DefaultCategoryDataset();
      line_chart_dataset.addValue( 15 , "schools" , "1970" );
      line_chart_dataset.addValue( 30 , "schools" , "1980" );
      line_chart_dataset.addValue( 60 , "schools" , "1990" );
      line_chart_dataset.addValue( 120 , "schools" , "2000" );
      line_chart_dataset.addValue( 240 , "schools" , "2010" ); 
      line_chart_dataset.addValue( 300 , "schools" , "2014" );

      JFreeChart lineChartObject = ChartFactory.createLineChart(
         "Schools Vs Years","Year",
         "Schools Count",
         line_chart_dataset,PlotOrientation.VERTICAL,
         true,true,false);

      int width = 640;    /* Width of the image */
      int height = 480;   /* Height of the image */ 
      File lineChart = new File( "LineChart.jpeg" ); 
      ChartUtilities.saveChartAsJPEG(lineChart ,lineChartObject, width ,height);
   }
}

让我们将上面的Java代码保存在LineChart.java文件中,然后在命令提示符下编译并运行它:

$javac LineChart.java  
$java LineChart

如果一切正常,它将编译并执行以在当前目录中创建一个名为LineChart.jpeg的JPEG图像文件。

JFreeChart - XY 图表

XY图表(散点图)基于一个数据序列,该序列由一个X值和Y值的列表组成。每个值对(X,Y)都是坐标系中的一个点。这里,一个值决定水平(X)位置,另一个值决定垂直(Y)位置。本章演示了如何使用JFreeChart从给定的业务数据集中创建XY图表

业务数据

考虑一个示例,我们想为所有主要浏览器创建XY图表。这里,从不同类别的人员那里收集了不同的性能分数,如下所示:

火狐 类别(X) 分数(Y)
1.0 1.0
2.0 4.0
3.0 3.0
Chrome 类别(X) 分数(Y)
1.0 4.0
2.0 5.0
3.0 6.0
IE 类别(X) 分数(Y)
3.0 4.0
4.0 5.0
5.0 4.0

基于AWT的应用程序

以下是根据上述信息创建XY图表的代码。此代码可帮助您将XY图表嵌入任何基于AWT的应用程序中。

import java.awt.Color; 
import java.awt.BasicStroke; 

import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.data.xy.XYDataset; 
import org.jfree.data.xy.XYSeries; 
import org.jfree.ui.ApplicationFrame; 
import org.jfree.ui.RefineryUtilities; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.chart.ChartFactory; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.data.xy.XYSeriesCollection; 
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;

public class XYLineChart_AWT extends ApplicationFrame {

   public XYLineChart_AWT( String applicationTitle, String chartTitle ) {
      super(applicationTitle);
      JFreeChart xylineChart = ChartFactory.createXYLineChart(
         chartTitle ,
         "Category" ,
         "Score" ,
         createDataset() ,
         PlotOrientation.VERTICAL ,
         true , true , false);
         
      ChartPanel chartPanel = new ChartPanel( xylineChart );
      chartPanel.setPreferredSize( new java.awt.Dimension( 560 , 367 ) );
      final XYPlot plot = xylineChart.getXYPlot( );
      
      XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer( );
      renderer.setSeriesPaint( 0 , Color.RED );
      renderer.setSeriesPaint( 1 , Color.GREEN );
      renderer.setSeriesPaint( 2 , Color.YELLOW );
      renderer.setSeriesStroke( 0 , new BasicStroke( 4.0f ) );
      renderer.setSeriesStroke( 1 , new BasicStroke( 3.0f ) );
      renderer.setSeriesStroke( 2 , new BasicStroke( 2.0f ) );
      plot.setRenderer( renderer ); 
      setContentPane( chartPanel ); 
   }
   
   private XYDataset createDataset( ) {
      final XYSeries firefox = new XYSeries( "Firefox" );          
      firefox.add( 1.0 , 1.0 );          
      firefox.add( 2.0 , 4.0 );          
      firefox.add( 3.0 , 3.0 );          
      
      final XYSeries chrome = new XYSeries( "Chrome" );          
      chrome.add( 1.0 , 4.0 );          
      chrome.add( 2.0 , 5.0 );          
      chrome.add( 3.0 , 6.0 );          
      
      final XYSeries iexplorer = new XYSeries( "InternetExplorer" );          
      iexplorer.add( 3.0 , 4.0 );          
      iexplorer.add( 4.0 , 5.0 );          
      iexplorer.add( 5.0 , 4.0 );          
      
      final XYSeriesCollection dataset = new XYSeriesCollection( );          
      dataset.addSeries( firefox );          
      dataset.addSeries( chrome );          
      dataset.addSeries( iexplorer );
      return dataset;
   }

   public static void main( String[ ] args ) {
      XYLineChart_AWT chart = new XYLineChart_AWT("Browser Usage Statistics",
         "Which Browser are you using?");
      chart.pack( );          
      RefineryUtilities.centerFrameOnScreen( chart );          
      chart.setVisible( true ); 
   }
}

让我们将上面的Java代码保存在XYLineChart_AWT.java文件中,然后在命令提示符下编译并运行它:

$javac XYLineChart_AWT.java  
$java XYLineChart_AWT 

如果一切正常,它将编译并运行以生成以下XY图表:

JFreeChart XY Chart

JPEG图像创建

让我们重写上面的示例,以从命令行生成JPEG图像。

import java.io.*;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.data.xy.XYSeries;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.chart.ChartUtilities; 

public class XYLineChart_image {

   public static void main( String[ ] args )throws Exception {
      final XYSeries firefox = new XYSeries( "Firefox" );
      firefox.add( 1.0 , 1.0 );
      firefox.add( 2.0 , 4.0 );
      firefox.add( 3.0 , 3.0 );
      
      final XYSeries chrome = new XYSeries( "Chrome" );
      chrome.add( 1.0 , 4.0 );
      chrome.add( 2.0 , 5.0 );
      chrome.add( 3.0 , 6.0 );
      
      final XYSeries iexplorer = new XYSeries( "InternetExplorer" );
      iexplorer.add( 3.0 , 4.0 );
      iexplorer.add( 4.0 , 5.0 );
      iexplorer.add( 5.0 , 4.0 );
      
      final XYSeriesCollection dataset = new XYSeriesCollection( );
      dataset.addSeries( firefox );
      dataset.addSeries( chrome );
      dataset.addSeries( iexplorer );

      JFreeChart xylineChart = ChartFactory.createXYLineChart(
         "Browser usage statastics", 
         "Category",
         "Score", 
         dataset,
         PlotOrientation.VERTICAL, 
         true, true, false);
      
      int width = 640;   /* Width of the image */
      int height = 480;  /* Height of the image */ 
      File XYChart = new File( "XYLineChart.jpeg" ); 
      ChartUtilities.saveChartAsJPEG( XYChart, xylineChart, width, height);
   }
}

让我们将上面的Java代码保存在XYLineChart_image.java文件中,然后在命令提示符下编译并运行它:

$javac XYLineChart_image.java  
$java XYLineChart_image

如果一切正常,它将编译并运行以在当前目录中创建一个名为XYLineChart.jpeg的JPEG图像文件。

JFreeChart - 3D饼图/条形图

3D图表是以三维格式显示的图表。您可以使用这些图表来提供更好的显示和清晰的信息。3D饼图与饼图相同,此外还具有不错的3D效果。可以通过添加一些额外的代码来实现3D效果,这些代码将负责在饼图中创建3D效果。

3D饼图

考虑以下示例,以使用3D饼图说明手机销售情况。以下是不同手机品牌及其销量(每天单位)的列表。

序号 手机品牌 销量(每天单位)
1 Iphone 5S 20
2 三星Grand 20
3 MOTO G 40
4 诺基亚Lumia 10

以下是根据上述信息创建3D饼图的代码。此代码可帮助您将饼图嵌入任何基于AWT的应用程序中。

import java.io.*; 

import org.jfree.chart.ChartFactory; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.plot.PiePlot3D; 
import org.jfree.data.general.DefaultPieDataset; 
import org.jfree.chart.ChartUtilities;

public class PieChart3D {

   public static void main( String[ ] args )throws Exception {
      DefaultPieDataset dataset = new DefaultPieDataset( );             
      dataset.setValue( "IPhone 5s" , new Double( 20 ) );             
      dataset.setValue( "SamSung Grand" , new Double( 20 ) );             
      dataset.setValue( "MotoG" , new Double( 40 ) );             
      dataset.setValue( "Nokia Lumia" , new Double( 10 ) ); 

      JFreeChart chart = ChartFactory.createPieChart3D( 
         "Mobile Sales" ,  // chart title                   
         dataset ,         // data 
         true ,            // include legend                   
         true, 
         false);

      final PiePlot3D plot = ( PiePlot3D ) chart.getPlot( );             
      plot.setStartAngle( 270 );             
      plot.setForegroundAlpha( 0.60f );             
      plot.setInteriorGap( 0.02 );             
      int width = 640;   /* Width of the image */             
      int height = 480;  /* Height of the image */                             
      File pieChart3D = new File( "pie_Chart3D.jpeg" );                           
      ChartUtilities.saveChartAsJPEG( pieChart3D , chart , width , height );   
   }
}

让我们将上面的Java代码保存在PieChart3D.java文件中,然后在命令提示符下编译并运行它:

$javac PieChart3D.java  
$java PieChart3D 

如果一切正常,它将编译并运行以创建一个名为PieChart3D.jpeg的JPEG图像文件,其中包含以下3D饼图:

JFreeChart PieChart3D

3D条形图

3D条形图与条形图相同,此外还具有不错的3D效果。可以通过添加一些额外的代码来实现3D效果,这些代码将负责在条形图中创建3D效果。考虑以下示例,该示例使用3D条形图描述各种汽车统计数据。以下是汽车品牌及其不同特性的列表,我们将使用条形图显示这些特性:

汽车 速度 用户评分 里程 安全性
菲亚特 1.0 3.0 5.0 5.0
奥迪 5.0 6.0 10.0 4.0
福特 4.0 2.0 3.0 6.0

以下代码根据上述信息创建3D条形图。此代码可帮助您将条形图嵌入任何基于AWT的应用程序中。

import java.io.*; 

import org.jfree.chart.ChartFactory; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.data.category.DefaultCategoryDataset; 
import org.jfree.chart.ChartUtilities; 

public class BarChart3D {
   
   public static void main( String[ ] args )throws Exception {
      final String fait = "FAIT";              
      final String audi = "AUDI";              
      final String ford = "FORD";              
      final String speed = "Speed";              
      final String popular = "Popular";              
      final String mailage = "Mailage";              
      final String userrating = "User Rating";              
      final String safety = "safety";        
      final DefaultCategoryDataset dataset = new DefaultCategoryDataset( ); 

      dataset.addValue( 1.0 , fait , speed );              
      dataset.addValue( 4.0 , fait , popular );              
      dataset.addValue( 3.0 , fait , userrating );              
      dataset.addValue( 5.0 , fait , mailage );              
      dataset.addValue( 5.0 , fait , safety );              
      
      dataset.addValue( 5.0 , audi , speed );              
      dataset.addValue( 7.0 , audi , popular );              
      dataset.addValue( 6.0 , audi , userrating );              
      dataset.addValue( 10.0 , audi , mailage );              
      dataset.addValue( 4.0 , audi , safety ); 
      
      dataset.addValue( 4.0 , ford , speed );              
      dataset.addValue( 3.0 , ford , popular );              
      dataset.addValue( 2.0 , ford , userrating );              
      dataset.addValue( 3.0 , ford , mailage );              
      dataset.addValue( 6.0 , ford , safety );                 
      
      JFreeChart barChart = ChartFactory.createBarChart3D(
         "Car Usage Statistics",             
         "Category",             
         "Score",             
         dataset,            
         PlotOrientation.VERTICAL,             
         true, true, false);
         
      int width = 640; /* Width of the image */              
      int height = 480; /* Height of the image */                              
      File barChart3D = new File( "barChart3D.jpeg" );                            
      ChartUtilities.saveChartAsJPEG( barChart3D, barChart, width, height);
   }
}

让我们将上面的Java代码保存在BarChart3D.java文件中,然后在命令提示符下编译并运行它:

$javac BarChart3D.java  
$java BarChart3

如果您的环境一切正常,它将编译并运行,创建一个包含以下3D条形图的JPEG图像文件BarChart3D.jpeg

JFreeChart 3D Bar Chart

JFreeChart - 气泡图

本章演示如何使用JFreeChart根据给定的业务数据创建气泡图。气泡图以三维方式显示信息。气泡绘制在(x, y)坐标相交的位置。气泡的大小被视为X轴和Y轴的范围或数量。

业务数据

让我们考虑不同的个人,以及他们的年龄、体重和工作能力。工作能力可以视为小时数,在图表中以气泡的形式绘制。

体重
年龄 30 40 50 60 70 80
10 4 工作量
20 5
30 10
40 8
50 9
60 6

基于AWT的应用程序

以下是根据上述信息创建气泡图的代码。此代码可帮助您将气泡图嵌入任何基于AWT的应用程序中。

import java.awt.Color; 
import java.awt.Dimension; 

import javax.swing.JPanel; 

import org.jfree.chart.*; 
import org.jfree.chart.axis.NumberAxis; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.chart.renderer.xy.XYItemRenderer; 
import org.jfree.data.xy.DefaultXYZDataset; 
import org.jfree.data.xy.XYZDataset; 
import org.jfree.ui.ApplicationFrame; 
import org.jfree.ui.RefineryUtilities;
  
public class BubbleChart_AWT extends ApplicationFrame {

   public BubbleChart_AWT( String s ) {
      super( s );                 
      JPanel jpanel = createDemoPanel( );                 
      jpanel.setPreferredSize(new Dimension( 560 , 370 ) );                 
      setContentPane( jpanel ); 
   }

   private static JFreeChart createChart( XYZDataset xyzdataset ) {
      JFreeChart jfreechart = ChartFactory.createBubbleChart(
         "AGE vs WEIGHT vs WORK",                    
         "Weight",                    
         "AGE",                    
         xyzdataset,                    
         PlotOrientation.HORIZONTAL,                    
         true, true, false);
         
      XYPlot xyplot = ( XYPlot )jfreechart.getPlot( );                 
      xyplot.setForegroundAlpha( 0.65F );                 
      XYItemRenderer xyitemrenderer = xyplot.getRenderer( );
      xyitemrenderer.setSeriesPaint( 0 , Color.blue );                 
      NumberAxis numberaxis = ( NumberAxis )xyplot.getDomainAxis( );                 
      numberaxis.setLowerMargin( 0.2 );                 
      numberaxis.setUpperMargin( 0.5 );                 
      NumberAxis numberaxis1 = ( NumberAxis )xyplot.getRangeAxis( );                 
      numberaxis1.setLowerMargin( 0.8 );                 
      numberaxis1.setUpperMargin( 0.9 );
                     
      return jfreechart;
   }

   public static XYZDataset createDataset( ) {
      DefaultXYZDataset defaultxyzdataset = new DefaultXYZDataset(); 
      double ad[ ] = { 30 , 40 , 50 , 60 , 70 , 80 };                 
      double ad1[ ] = { 10 , 20 , 30 , 40 , 50 , 60 };                 
      double ad2[ ] = { 4 , 5 , 10 , 8 , 9 , 6 };                 
      double ad3[][] = { ad , ad1 , ad2 };                 
      defaultxyzdataset.addSeries( "Series 1" , ad3 );
                   
      return defaultxyzdataset; 
   }

   public static JPanel createDemoPanel( ) {
      JFreeChart jfreechart = createChart( createDataset( ) );                 
      ChartPanel chartpanel = new ChartPanel( jfreechart );
                       
      chartpanel.setDomainZoomable( true );                 
      chartpanel.setRangeZoomable( true );
                 
      return chartpanel;
   }

   public static void main( String args[ ] ) {
      BubbleChart_AWT bubblechart = new BubbleChart_AWT( "Bubble Chart_frame" );   
      bubblechart.pack( );                 
      RefineryUtilities.centerFrameOnScreen( bubblechart );                 
      bubblechart.setVisible( true ); 
   }
}

让我们将上面的Java代码保存在BubbleChart_AWT.java文件中,然后在命令提示符下编译并运行它:

$javac BubbleChart_AWT.java  
$java BubbleChart_AW 

如果一切正常,它将编译并运行,生成以下气泡图:

JFreeChart Bubble Chart

JPEG图像创建

让我们重写上面的示例,以从命令行生成JPEG图像。

import java.io.*;

import java.awt.Color; 

import org.jfree.chart.*; 
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.data.xy.DefaultXYZDataset;
import org.jfree.chart.ChartUtilities;

public class BubbleChart_image {
   
   public static void main( String args[ ] )throws Exception {
      DefaultXYZDataset defaultxyzdataset = new DefaultXYZDataset( );
      double ad[ ] = { 30 , 40 , 50 , 60 , 70 , 80 };
      double ad1[ ] = { 10 , 20 , 30 , 40 , 50 , 60 };
      double ad2[ ] = { 4 , 5 , 10 , 8 , 9 , 6 };
      double ad3[ ][ ] = { ad , ad1 , ad2 };
      defaultxyzdataset.addSeries( "Series 1" , ad3 );

      JFreeChart jfreechart = ChartFactory.createBubbleChart(
         "AGE vs WEIGHT vs WORK", 
         "Weight", 
         "AGE", 
         defaultxyzdataset, 
         PlotOrientation.HORIZONTAL, 
         true, true, false);

      XYPlot xyplot = ( XYPlot )jfreechart.getPlot( );
      xyplot.setForegroundAlpha( 0.65F );
      XYItemRenderer xyitemrenderer = xyplot.getRenderer( );
      xyitemrenderer.setSeriesPaint( 0 , Color.blue );
      NumberAxis numberaxis = ( NumberAxis )xyplot.getDomainAxis( );
      numberaxis.setLowerMargin( 0.2 );
      numberaxis.setUpperMargin( 0.5 );
      NumberAxis numberaxis1 = ( NumberAxis )xyplot.getRangeAxis( );
      numberaxis1.setLowerMargin( 0.8 );
      numberaxis1.setUpperMargin( 0.9 );

      int width = 560;   /* Width of the image */
      int height = 370;  /* Height of the image */ 
      File bubbleChart = new File("BubbleChart.jpeg"); 
      ChartUtilities.saveChartAsJPEG(bubbleChart,jfreechart,width,height);
   }
}

让我们将上面的Java代码保存在BubbleChart_image.java文件中,然后在命令提示符下编译并运行它:

$javac BubbleChart_image.java  
$java BubbleChart_image

如果一切正常,它将编译并运行,在您的当前目录中创建一个名为BubbleChart.jpeg的JPEG图像文件。

JFreeChart - 时间序列图

时间序列图显示数据点的序列,这些数据点在相等的时间间隔内变化。本章演示如何使用JFreeChart根据给定的业务数据创建时间序列图

业务数据

让我们考虑使用标准Java API Math.random()生成的各种随机数。我们使用这些数字来生成时间序列图。您可以为在给定时间间隔内网站发生的错误总数生成类似的图表。

基于AWT的应用程序

以下是根据Math.random()在给定时间间隔内生成的数字创建时间序列图的代码。

import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.data.general.SeriesException; 
import org.jfree.data.time.Second; 
import org.jfree.data.time.TimeSeries; 
import org.jfree.data.time.TimeSeriesCollection; 
import org.jfree.data.xy.XYDataset; 
import org.jfree.ui.ApplicationFrame; 
import org.jfree.ui.RefineryUtilities;

public class TimeSeries_AWT extends ApplicationFrame {

   public TimeSeries_AWT( final String title ) {
      super( title );         
      final XYDataset dataset = createDataset( );         
      final JFreeChart chart = createChart( dataset );         
      final ChartPanel chartPanel = new ChartPanel( chart );         
      chartPanel.setPreferredSize( new java.awt.Dimension( 560 , 370 ) );         
      chartPanel.setMouseZoomable( true , false );         
      setContentPane( chartPanel );
   }

   private XYDataset createDataset( ) {
      final TimeSeries series = new TimeSeries( "Random Data" );         
      Second current = new Second( );         
      double value = 100.0;         
      
      for (int i = 0; i < 4000; i++) {
         
         try {
            value = value + Math.random( ) - 0.5;                 
            series.add(current, new Double( value ) );                 
            current = ( Second ) current.next( ); 
         } catch ( SeriesException e ) {
            System.err.println("Error adding to series");
         }
      }

      return new TimeSeriesCollection(series);
   }     

   private JFreeChart createChart( final XYDataset dataset ) {
      return ChartFactory.createTimeSeriesChart(             
         "Computing Test", 
         "Seconds",              
         "Value",              
         dataset,             
         false,              
         false,              
         false);
   }

   public static void main( final String[ ] args ) {
      final String title = "Time Series Management";         
      final TimeSeries_AWT demo = new TimeSeries_AWT( title );         
      demo.pack( );         
      RefineryUtilities.positionFrameRandomly( demo );         
      demo.setVisible( true );
   }
}   

让我们将上面的Java代码保存在TimeSeries_AWT.java文件中,然后在命令提示符下编译并运行它:

$javac TimeSeries_AWT.java  
$java TImeSeries_AWT 

如果一切正常,它将编译并运行,生成以下时间序列图:

JFreeChart TimeSeries Chart

JPEG图像创建

让我们重写上面的示例,以从命令行生成JPEG图像。

import java.io.*;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.SeriesException;
import org.jfree.data.time.Second;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.chart.ChartUtilities;

public class TimeSeriesChart {
   
   public static void main( final String[ ] args )throws Exception {
      final TimeSeries series = new TimeSeries( "Random Data" );
      Second current = new Second();
      double value = 100.0;
      
      for ( int i = 0 ; i < 4000 ; i++ ) {
         
         try {
            value = value + Math.random( ) - 0.5;
            series.add( current , new Double( value ) );
            current = ( Second ) current.next( );
         } catch ( SeriesException e ) {
            System.err.println( "Error adding to series" );
         }
      }
      
      final XYDataset dataset=( XYDataset )new TimeSeriesCollection(series);
      JFreeChart timechart = ChartFactory.createTimeSeriesChart(
         "Computing Test", 
         "Seconds", 
         "Value", 
         dataset,
         false, 
         false, 
         false);
         
      int width = 560;   /* Width of the image */
      int height = 370;  /* Height of the image */ 
      File timeChart = new File( "TimeChart.jpeg" ); 
      ChartUtilities.saveChartAsJPEG( timeChart, timechart, width, height );
   }
}

让我们将上面的Java代码保存在TimeSeriesChart.java文件中,然后在命令提示符下编译并运行它:

$javac TimeSeriesChart.java  
$java TimeSeriesChart

如果您的环境一切正常,它将编译并运行,在您的当前目录中创建一个名为TimeChart.jpeg的JPEG图像文件。

JFreeChart - 文件接口

到目前为止,我们学习了如何使用JFreeChart API和静态数据创建各种类型的图表。但在生产环境中,数据以具有预定义格式的文本文件形式提供,或者直接来自数据库。

本章将解释如何从给定位置的给定文本文件中读取简单数据,然后使用JFreeChart创建您选择的图表。

业务数据

假设我们有一个名为mobile.txt的文件,其中包含不同的手机品牌及其销量(每天单位),用简单的逗号 (,) 分隔:

Iphone 5S, 20   
Samsung Grand, 20   
MOTO G, 40  Nokia  
Lumia, 10 

基于文件的图表生成

以下是根据mobile.txt中提供的信息创建饼图的代码:

import java.io.*; 

import java.util.StringTokenizer; 

import org.jfree.chart.ChartUtilities; 
import org.jfree.chart.ChartFactory; 
import org.jfree.chart.JFreeChart; 
import org.jfree.data.general.DefaultPieDataset;

public class PieChart_File {
   
   public static void main( String[ ] args )throws Exception {
      
      String mobilebrands[ ] = {    
         "IPhone 5s" ,   
         "SamSung Grand" ,   
         "MotoG" ,    
         "Nokia Lumia" 
      };
      
      InputStream in = new FileInputStream( new File( "C:/temp/test.txt" ) );          
      BufferedReader reader = new BufferedReader(new InputStreamReader(in ) );          
      StringBuilder out = new StringBuilder();          
      String line;          
      DefaultPieDataset dataset = new DefaultPieDataset();          

      while (( line = reader.readLine() ) != null ) {
         out.append( line );
      }
      
      StringTokenizer s = new StringTokenizer( out.toString(), "," );
      int i = 0;      
      
      while( s.hasMoreTokens( ) && ( mobilebrands [i] != null ) ) {
         dataset.setValue(mobilebrands[i], Double.parseDouble( s.nextToken( ) ));
         i++;
      }
      
      JFreeChart chart = ChartFactory.createPieChart( 
         "Mobile Sales",    // chart title           
         dataset,           // data           
         true,              // include legend           
         true,           
         false);
      
      int width = 560;    /* Width of the image */          
      int height = 370;   /* Height of the image */                          
      File pieChart = new File( "pie_Chart.jpeg" );                        
      ChartUtilities.saveChartAsJPEG( pieChart, chart, width, height); 
   }
}

让我们将上面的Java代码保存在PieChart_File.java文件中,然后在命令提示符下编译并运行它:

$javac PieChart_File.java  
$java PieChart_File 

如果一切正常,它将编译并运行,创建一个名为PieChart.jpeg的JPEG图像文件,其中包含以下图表。

JFreeChart File Interface

JFreeChart - 数据库接口

本章解释如何从数据库表中读取简单数据,然后使用JFreeChart创建您选择的图表。

业务数据

假设我们有以下MySQL表mobile_tbl(mobile_brand VARCHAR(100) NOT NULL, unit_sale INT NOT NULL);

假设此表具有以下记录:

手机品牌 单位销量
IPhone5S 20
三星Grand 20
MotoG 40
诺基亚Lumia 10

使用数据库生成图表

以下是根据MySQL数据库test_db中提供的mobile_tbl表中的信息创建饼图的代码。根据您的需求,您可以使用任何其他数据库。

import java.io.*; 
import java.sql.*; 

import org.jfree.chart.ChartUtilities;
import org.jfree.chart.ChartFactory; 
import org.jfree.chart.JFreeChart; 
import org.jfree.data.general.DefaultPieDataset;

public class PieChart_DB {
   
   public static void main( String[ ] args )throws Exception {
      
      String mobilebrands[] = {
         "IPhone 5s",   
         "SamSung Grand",   
         "MotoG",            
         "Nokia Lumia" 
      };
      
      /* Create MySQL Database Connection */
      Class.forName( "com.mysql.jdbc.Driver" );
      Connection connect = DriverManager.getConnection( 
         "jdbc:mysql://127.0.0.1:3306/jf_testdb" ,     
         "root",     
         "root123");
      
      Statement statement = connect.createStatement( );
      ResultSet resultSet = statement.executeQuery("select * from mobile_data" );
      DefaultPieDataset dataset = new DefaultPieDataset( );
      
      while( resultSet.next( ) ) {
         dataset.setValue( 
         resultSet.getString( "mobile_brand" ) ,
         Double.parseDouble( resultSet.getString( "unit_sale" )));
      }
      
      JFreeChart chart = ChartFactory.createPieChart(
         "Mobile Sales",   // chart title           
         dataset,          // data           
         true,             // include legend          
         true,           
         false );

      int width = 560;    /* Width of the image */
      int height = 370;   /* Height of the image */ 
      File pieChart = new File( "Pie_Chart.jpeg" );
      ChartUtilities.saveChartAsJPEG( pieChart , chart , width , height );
   }
}

让我们将上面的Java代码保存在PieChart_DB.java文件中,然后在命令提示符下编译并运行它:

$javac PieChart_DB.java  
$java PieChart_DB

如果一切正常,它将编译并运行,创建一个名为Pie_Chart.jpeg的JPEG图像文件,其中包含以下图表。

JFreeChart Database Interface
广告