JFreeChart 高级应用 一 定制图表

 

 

1、简介

 

JFreeChart的设计的定制功能是非常灵活的。我们可以使用非常多的属性来设置我们图表的外观。本章将详细介绍一些图表通用的定制技术。

 

2、图表属性

 

2.1 概述

 

我们可以使用JFreeChart类方法从更高的层次来定制我们图表的外观。可控制的属性有:

l图表的边框

l图表的标题和副标题

l图表的背景颜色和图片

l使用绘制建议(Rendering Hints)画图表,该属性有是否反锯齿功能。

在下面的章节中将详细描述这些内容。

 

2.2 图标边框

 

JFreeChart可以在图表的外围画出一个边框。默认状态下,JFreeChart是不画出边框的,但我们可以使用方法setBorderVisible()来设置。边框的颜色和线条风格可使用方法setBorderPaint()setBorderStroke()来控制。

注意:如果我们在一个ChartPanel里面显示我们的图表,那么我们可能更愿意使用Swing提供的边框。

 

2.3 图表标题

 

图表有一个标题,显示在图表的顶部、底部、左侧或右侧(同时,我们也可以添加副标题,见下章讲述)。标题使用一个TextTitle的实例对象。我们可以使用getTitle()方法来获得标题的引用。

TextTitle texttitle = jfreechart.getTitle();

 

修改标题文本(不修改字体和位置)的代码如下:

texttitle.setText("Pie Chart Demo");

 

题头放置在图表的顶部、底部、左侧或右侧的设置,使用标题本书属性设置来完成。下面代码显示的是将标题移植到图表的底部。

texttitle.setPosition(RectangleEdge.BOTTOM);

 

如果在我们图表上,我们不希望显示标题,则将标题设置为null即可。

 

2.4 副标题

 

图表可以拥有任何数量的副标题。添加副标题,需要先创建一个副标题对象(任何Title类的子类),然后将该对象加到图表上即可。代码如下:

TextTitle subtitle1 = new TextTitle("A Subtitle");  
jfreechart.addSubtitle(subtitle1);

 

我们可以在图表上添加任何数量的副标题,但是紧急我们添加的副标题越多,图表画图的区域就越小。

修改一个已有的副标题,我们需要先获得副标题的一个引用。代码如下:

 Title subtitle = jfreechart.getSubtitle(0);

 

在我们改变副标题属性之前,我们需要将Title的引用转换成我们需要的适当的子类类型。

我们可以使用getSubtitleCount()方法获得副标题的数量。

 

2.5 设置图表背景颜色

 

我们可以使用setBackgroundPaint()方法设置图表的背景颜色(注意,我们也可以设置我们图区的背景颜色,这与图表的背景颜色不同)。例如:

jfreechart.setBackgroundPaint(Color.blue);

 

我们可使用Paint接口的任何实现作为背景颜色的设置参数,其中有ColorGradientPaint(渐变颜色)和TexturePaint等。代码如下:

 Paint p = new GradientPaint(0, 0, Color.white, 1000, 0, Color.green);  
jfreechart.setBackgroundPaint(p);

 

我们可以设置我们的背景颜色为null,这时推荐使用一个背景图片来设置我们的图表。

 

2.6 使用背景图片

 

我们可以使用方法setBackgroundImage()来为我们的图表设置一幅背景图表。

jfreechart.setBackgroundImage(JFreeChart.INFO.getLogo());

 

默认的,图片充满图表的整个背景,图片失真。但我们可以使用setBackgroundImageAlignment()方法来改变图片不充满整个背景。代码如下:

jfreechart.setBackgroundImageAlignment(Align.TOP_LEFT);

 

使用setBackgroundImageAlpha()方法,我们可以控制图片的透明度。如果我们希望图片只填充我们图表的区域(区域包含轴),那么我们需要将背景图片添加到图表的图区。代码如下(以饼图为例):

 PiePlot pieplot = (PiePlot) jfreechart.getPlot();  
pieplot.setBackgroundImage(JFreeChart.INFO.getLogo())

 

2.7 Rendering Hints(绘制建议)

 

JFreeChart使用java2DAPI来画图表。在java2D中的API中,我们可以提供绘制建议让绘制引擎绘制图表。JFreeChart允许我们在画图表时,使用setRenderingHints()方法,将绘制建议参数传入java2DAPI中。

JFreeChart还提供了一个便利反锯齿开关方法。当反锯齿开关开时,图表会绘制出比较光滑的图表,但是花费的时间要长。代码如下:

  jfreechart.setAntiAlias(true);

 

JFreeChart画图时,默认为反锯齿开关为开。

 

3、图区属性

 

3.1 概述

 

JFreeChart类在绘制图表时,将大部分工作交给了Plot类(图形绘制结构)或Plot的子类。JFreeChart类的getPlot()方法返回了一个图表创建的图区(plot)的引用。

  Plot plot = jfreechart.getPlot();

 

我们需要将该引用转化成Plot的一个具体子类。例如:

CategoryPlot plot = jfreechart.getCategoryPlot();

 

XYPlot plot = jfreechart.getXYPlot();

 

注意:如果plot不是相应的类,则在转化的时候,会抛出ClassCastException类型转制异常。

 

3.2 图区子类

 

那么我们如何知道我们图表使用的Plot是那个子类呢?作为使用JFreeChart的经验,分清那些图表使用CategoryPlot和那些图表使用XYPlot是非常清晰的。如果还怀疑,看一下ChartFactory类的源代码就会明白每个类型的图表是如何放在一起的。

 

3.3 设置图区背景颜色

 

我们可以使用方法setBackgroundPaint()设置图区的背景颜色。例如:

 Plot plot = jfreechart.getPlot();  
plot.setBackgroundPaint(Color.white);

 

我们可使用Paint接口的任何实现作为背景颜色的设置参数,其中有ColorGradientPaint(渐变颜色)和TexturePaint等。同时,我们也可以设置背景颜色为null

 

3.4 设置背景图片

 

我们可以使用方法setBackgroundImage()为图区设置备有图片。

Plot plot = jfreechart.getPlot();  
plot.setBackgroundImage(JFreeChart.INFO.getLogo());

 

默认的,图片充满图表的整个背景,图片失真。但我们可以改变图片不充满整个背景,使用方法是setBackgroundImageAlignment()

plot.setBackgroundImageAlignment(Align.BOTTOM_RIGHT);

 

使用setBackgroundImageAlpha()方法,我们可以控制图片的透明度。如果我们希望图片充满这个图表区域,那么我们需要将背景图片添加到JFreeChart对象上(前面已经介绍过)。

 

4、轴属性

 

4.1 概述

 

使用JFreeChart创建的大部分图表都带有两个轴。X轴和Y轴。当然对于一些图表(比如饼图)根本就没有轴。对于使用轴的图表来说,图区使用Axis对象来管理轴。

4.2 获得轴对象引用

在你修改轴的属性之前,我们需要先获得一个轴的引用。图区类CategoryPlotXYPlot类有两个方法getDomainAxis()getRangeAxis()分别是获得XY轴对象。这两个方法返回了一个ValueAxis对象的引用,除了在使用CategoryPlot的情况下,X轴使用的是CategoryAxis。代码如下:

//get an axis reference...  
CategoryPlot plot = jfreechart.getCategoryPlot();  
CategoryAxis domainAxis = plot.getDomainAxis();  
//change axis properties...  
domainAxis.setLabel("Categories");  
domainAxis.setLabelFont(someFont);

 

CategoryAxisValueAxis类有许多不同的子类。有时我们需要将轴对象引用转化成具体的子类,为了获取更多具体的属性。如,如果我们想获得y轴为一个对象NumberAxis。代码如下:

 XYPlot plot = jfreechart.getXYPlot();  
NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();  
rangeAxis.setAutoRange(false);

 

4.3 设置轴标签

 

我们使用方法setLabel()可以改变轴的标签。如果我们不想在图表的轴上有标签,那么我们就设置为null即可。

我们可以使用Axis类定义的方法setLabelFont(), setLabelPaint(), setLabelInsets()改变标签的字体、颜色等内容。

 

4.4 改变轴标签显示方向

 

当图区在左侧或右侧画一个轴(水平轴)时,轴标签会自动旋转90度,以满足小空间的需要。如果我们希望标签也水平,我们需要修改标签的角度:

 XYPlot plot = jfreechart.getXYPlot();  
ValueAxis axis = plot.getRangeAxis();  
axis.setLabelAngle(Math.PI / 2.0);

 

注意角度的表示使用弧度(PI180度)。

 

4.5 影藏刻度标签

 

隐藏某个轴的刻度标签:

 CategoryPlot plot = jfreechart.getCategoryPlot();  
ValueAxis axis = plot.getRangeAxis();  
axis.setTickLabelsVisible(false);

 

对于CategoryAxis,方法setTickLabelsVisible(false)隐藏种类标签。

4.6 影藏刻度符号

隐藏某个轴的刻度符号

XYPlot plot = jfreechart.getXYPlot();  
Axis axis = plot.getDomainAxis();  
axis.setTickMarksVisible(false);

 

4.7 设置刻度尺寸

 

默认的,数值和日期会自动选择一个刻度尺寸,以便刻度标签不会重复显示。但我们也可以使用setTickUnit()方法设置我们自己的饿刻度单位。

 

4.8 指定标准数值刻度单位

 

NumberAxis类中,方法允许我们设置我们自己的刻度单位替代系统自动选择刻度danwi的机制。最普通的应用就是我们有一个仅仅显示整数的数轴。在实例中,我们不想让0.5或者0.25作为刻度单位。

NumberAxis类中有一个静态方法返回一系列的标准整数刻度单位:

 XYPlot plot = jfreechart.getXYPlot();  
NumberAxis axis = (NumberAxis) plot.getRangeAxis();  
TickUnitSource units = NumberAxis.createIntegerTickUnits();  
axis.setStandardTickUnits(units);

 

如果我们想控制标准的刻度单位时,我们可以自由定制自己的TickUnits集合。

 

4.9 指定标准日期刻度单位

类似于上一节内容,DateAxis类也有一个setStandardTickUnits()方法,来设置我们的刻度单位。方法createStandardDateTickUnits()DateAxis返回了一个缺省的集合。同时我们也可以创建我们自己的标准日期刻度单位。

posted @ 2013-04-23 23:02  帅星星  阅读(2260)  评论(0编辑  收藏  举报