零基础学Struts
上QQ阅读APP看书,第一时间看更新

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 使用图片查看器打开图表图片