7.3 使用XYDataset数据集创建折线图
7.3.1 概述
折线图也可以使用XYDataset数据集,使用一条直线将相邻的点(x,y)点连接起来。本章介绍的一个使用XYDataset数据集创建折线图的简单实例,如下图7.2所示。
图7.2 一个简单的基于XYDataset数据集的折线图(参考:LineChartDemo2.java)
7.3.2 XYDataset
对于该图表来说,使用的数据集是XYSeriesCollection(当然我们可以使用实现XYDataset接口的其他数据集)。出于独立演示的目点,我们创建的dataset代码如下:
private static XYDataset createDataset() {
XYSeries xyseries = new XYSeries("First");
xyseries.add(1.0, 1.0);
xyseries.add(2.0, 4.0);
xyseries.add(3.0, 3.0);
xyseries.add(4.0, 5.0);
xyseries.add(5.0, 5.0);
xyseries.add(6.0, 7.0);
xyseries.add(7.0, 7.0);
xyseries.add(8.0, 8.0);
XYSeries xyseries_0_ = new XYSeries("Second");
xyseries_0_.add(1.0, 5.0);
xyseries_0_.add(2.0, 7.0);
xyseries_0_.add(3.0, 6.0);
xyseries_0_.add(4.0, 8.0);
xyseries_0_.add(5.0, 4.0);
xyseries_0_.add(6.0, 4.0);
xyseries_0_.add(7.0, 2.0);
xyseries_0_.add(8.0, 1.0);
XYSeries xyseries_1_ = new XYSeries("Third");
xyseries_1_.add(3.0, 4.0);
xyseries_1_.add(4.0, 3.0);
xyseries_1_.add(5.0, 2.0);
xyseries_1_.add(6.0, 3.0);
xyseries_1_.add(7.0, 6.0);
xyseries_1_.add(8.0, 3.0);
xyseries_1_.add(9.0, 4.0);
xyseries_1_.add(10.0, 3.0);
XYSeriesCollection xyseriescollection = new XYSeriesCollection();
xyseriescollection.addSeries(xyseries);
xyseriescollection.addSeries(xyseries_0_);
xyseriescollection.addSeries(xyseries_1_);
return xyseriescollection;
}
注意:每个系列必须有x值(不是必须有y值),并且该系列独立于其他系列。数据集可以接受一个y值为null的值。当图表遇到null值时,连接线不被画出,该系列的连线不会连续。出现下图7.3类型。
图7.3有一个 y值为null时,图表显示断续。
7.3.3 创建图表
ChartFactory类提供了一个便利的方法createXYLineChart()创图表:
JFreeChart jfreechart = ChartFactory.createXYLineChart(
"Line Chart Demo 2", // chart title
"X", // x axis label
"Y", // y axis label
xydataset, // data
PlotOrientation.VERTICAL,
true, // include legend
true, // tooltips
false // urls
);
上面方法构建了一个JFreeChart对象,该对象具有一个标题、图例和相关轴的图区及renderer。数据集使用上节我们创建的数据集。
7.3.4 定制图表
图表将使用大部分缺省的属性进行初始化设置。当然了,我们也可以随意修改这些属性,来改变我们图表的外观。在本实例中,设置的几个属性如下:
- 设置图表的背景颜色
- 设置图区的背景颜色
- 设置轴的平移值
- 设置主轴和范围轴网格线颜色
- 修改renderer改变连线点的形状
- 范围轴刻度的设置,以便显示整数值。
改变图表背景颜色非常简单。代码如下:
//改变图表的背景颜色
jfreechart.setBackgroundPaint(Color.white);
改变图区背景颜色、轴平移、网格线颜色,需要使用plot图区对象的一个引用来修改。图片对象需要转化成XYPlot对象,主要是因为我们可以访问更多更具体的图区方法。代码如下:
XYPlot xyplot = (XYPlot) jfreechart.getPlot();
xyplot.setBackgroundPaint(Color.lightGray);
xyplot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
xyplot.setDomainGridlinePaint(Color.white);
xyplot.setRangeGridlinePaint(Color.white);
修改renderer来显示连线之间的形状。代码如下:
XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer) xyplot.getRenderer();
xylineandshaperenderer.setShapesVisible(true);
xylineandshaperenderer.setShapesFilled(true);
最后就是修改范围轴。我们将默认刻度值(允许显示小数)改成只显示整数的刻度值。代码如下:
NumberAxis numberaxis = (NumberAxis) xyplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
参考源代码、Javadoc的API文档以及其他相关XYPlot的定制内容,来学习更多的细节。