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接口的任何实现作为背景颜色的设置参数,其中有Color、GradientPaint(渐变颜色)和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使用java2D的API来画图表。在java2D中的API中,我们可以提供绘制建议让绘制引擎绘制图表。JFreeChart允许我们在画图表时,使用setRenderingHints()方法,将绘制建议参数传入java2D的API中。
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接口的任何实现作为背景颜色的设置参数,其中有Color、GradientPaint(渐变颜色)和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 获得轴对象引用
在你修改轴的属性之前,我们需要先获得一个轴的引用。图区类CategoryPlot和XYPlot类有两个方法getDomainAxis()和getRangeAxis()分别是获得X轴Y轴对象。这两个方法返回了一个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);
CategoryAxis和ValueAxis类有许多不同的子类。有时我们需要将轴对象引用转化成具体的子类,为了获取更多具体的属性。如,如果我们想获得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);
注意角度的表示使用弧度(PI为180度)。
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返回了一个缺省的集合。同时我们也可以创建我们自己的标准日期刻度单位。