11.4 JFreeChart的常用统计图表
通过JFreeChart可以非常方便地生成各种形式的统计图表,如折线图、面积图、层叠区域图等。下面将介绍如何使用JFreeChart生成这些统计图表,以及如何将生成的图标输出到图片。
11.4.1 折线图
可以使用JFreeChart来生成折线图,其使用方法和柱状图基本类似,只是显示不同而已。通过调用ChartFactory的createLineChart()方法就可以创建一幅折线图,代码如下所示。
package net.hncu.jfreechart; import java.awt.Font; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartFrame; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.CategoryAxis; import org.jfree.chart.axis.CategoryLabelPositions; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.data.category.DefaultCategoryDataset; public class TestLineChart { public static void main(String[] args) { //使用工厂类创建折线图 JFreeChart chart = ChartFactory.createLineChart("学校职称人员统计图", "职称", "人员数量", getDateset(), PlotOrientation.VERTICAL , true, true, false); //获得图表的Plot对象 CategoryPlot cPlot = (CategoryPlot) chart.getPlot(); //取得横轴 CategoryAxis cAxis = cPlot.getDomainAxis(); //设置横轴标签字体 cAxis.setLabelFont(new Font("宋体", Font.BOLD,20)); //取得纵轴 NumberAxis nAxis = (NumberAxis) cPlot.getRangeAxis(); //设置横轴标签字体 nAxis.setLabelFont(new Font("宋体", Font.BOLD,20)); //设置横轴显示标签字体 cAxis.setTickLabelFont(new Font("宋体", Font.BOLD + Font.ITALIC,18)); cAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); //设置纵轴显示标签字体 nAxis.setTickLabelFont(new Font("宋体", Font.BOLD + Font.ITALIC,18)); //创建一个frame来显示图标 ChartFrame chartFrame = new ChartFrame("学校职称人员统计图", chart); chartFrame.pack(); chartFrame.setVisible(true); } //返回数据集 public static DefaultCategoryDataset getDateset() { //创建一个数据集 DefaultCategoryDataset dcd = new DefaultCategoryDataset(); //设置数据 dcd.setValue(1000, "清华大学", "讲师"); dcd.setValue(600, "清华大学", "副教授"); dcd.setValue(500, "清华大学", "教授"); dcd.setValue(1000, "北京大学", "讲师"); dcd.setValue(400, "北京大学", "副教授"); dcd.setValue(300, "北京大学", "教授"); dcd.setValue(800, "复旦大学", "讲师"); dcd.setValue(600, "复旦大学", "副教授"); dcd.setValue(400, "复旦大学", "教授"); return dcd; } }
运行该Java程序就可以看到生成的折线图,如图11.19所示。
11.4.2 立体折线图
通过调用ChartFactory的createLineChart3D()方法,就可以创建一幅3D的折线图,代码如下所示。
//使用工厂类创建柱状图 JFreeChart chart = ChartFactory.createLineChart3D( "学校职称人员统计图", "职称", "人员数量", getDateset(), PlotOrientation.VERTICAL , true, true, false);
运行该Java程序就可以看到生成的3D折线图,如图11.20所示。
图11.19 折线图
11.4.3 面积图
图11.20 3D折线图
可以使用JFreeChart来生成面积图,其使用方法和柱状图基本类似,只是显示不同而已。通过调用ChartFactory的createAreaChart()方法,就可以创建一个面积图,代码如下所示。
//使用工厂类创建柱状图 JFreeChart chart = ChartFactory.createAreaChart( "学校职称人员统计图", "职称", "人员数量", getDateset(), PlotOrientation.VERTICAL , true, true, false);
运行该Java程序就可以看到生成的面积图,如图11.21所示。
图11.21 面积图
11.4.4 层叠区域图
可以使用JFreeChart来生成层叠区域图,其使用方法和柱状图基本类似,只是显示不同而已。通过调用ChartFactory的createStackedAreaChart()方法,就可以创建一个层叠区域图,代码如下所示。
//使用工厂类创建柱状图 JFreeChart chart = ChartFactory.createStackedAreaChart( "学校职称人员统计图", "职称", "人员数量", getDateset(), PlotOrientation.VERTICAL , true, true, false);
运行该Java程序就可以看到生成的层叠区域图,如图11.22所示。
图11.22 层叠区域图
11.4.5 将图表输出到图片
前面都是通过使用JFrame来显示的图表,下面来看如何将生成的图表输出到图片,代码如下所示。
package net.hncu.jfreechart; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.PlotOrientation; import org.jfree.data.category.DefaultCategoryDataset; public class TestBarChartToFile { public static void main(String[] args) throws IOException { //使用工厂类创建柱状图 JFreeChart chart = ChartFactory.createBarChart( "学校职称人员统计图", "职称", "人员数量", getDateset(), PlotOrientation.VERTICAL , false, true, false); //创建输出流 OutputStream os = new FileOutputStream("zhicheng.png"); //通过工具类写入Chart ChartUtilities.writeChartAsPNG(os, chart, 800, 600); os.close(); } //返回数据集 public static DefaultCategoryDataset getDateset() { //创建一个数据集 DefaultCategoryDataset dcd = new DefaultCategoryDataset(); //设置数据 dcd.setValue(800, "", "讲师"); dcd.setValue(400, "", "副教授"); dcd.setValue(100, "", "教授"); return dcd; } }
创建柱状图的代码就不多说了,下面来看这段输出到图片文件的代码,如下所示。
//创建输出流 OutputStream os = new FileOutputStream("zhicheng.png"); //通过工具类写入Chart ChartUtilities.writeChartAsPNG(os, chart, 800, 600); os.close();
首先创建一个输出流,并指定要输出的文件。如何通过ChartUtilities类的writeChartAsPNG()方法指定要输出流、被输出的图标以及图标的长宽。这样就可以将生成的图表输出成PNG格式的图片。也可以通过调用ChartUtilities类的writeChartAsJPEG()方法将图表输出成JPG格式的图片。
运行该Java程序就可以看到生成的PNG格式图片,使用图片查看器打开该图片,如图11.23所示。
图11.23 使用图片查看器打开图表图片