6.2 创建一个直方条形图

6.2.1 概述

直方条形图常常被用来显示表列数据。如下表,为一个简单的两行、三列数据。

表 6.1

Colnums1 Colnums2 Colnums3
Row1 1.0 5.0 3.0
Row2 2.0 3.0 2.0

在JFreeChart里,这个表格数据封装为一个dataset数据对象,每列标题为一个种类,每行为一个系列。每行标题为一个系列名称(或者系列关键值)。直方条形图展现的数据图如图6.2.

图6.2 简单的直方条形图(参见:BarExample1.java)

在这个图表的实例中,我们可以看到JFreeChart将每列数据(即一个种类)组合在一起。而且对每行数据(即每个系列)使用各种颜色高亮显示。图表的图例将颜色和系列的名称/关键值对应起来。

6.2.2 创一个dataset

创建直方条形图的第一步就是创建一个合适的dataset数据集。JFreeChart为直方条形图提供的访问表列数据的一系列方法,必须符合接口CategoryDataset定义。

JFreeChart中提供了一个便利的实现CategoryDataset接口的类为DefaultCategoryDataset。下面显示我们如何使用这个类来封装表6.1数据。代码如下:

private CategoryDataset createDataset() {
    DefaultCategoryDataset dataset = new DefaultCategoryDataset();
    dataset.addValue(1.0, "Row 1", "Column 1");
    dataset.addValue(5.0, "Row 1", "Column 2");
    dataset.addValue(3.0, "Row 1", "Column 3");
    dataset.addValue(2.0, "Row 2", "Column 1");
    dataset.addValue(3.0, "Row 2", "Column 2");
    dataset.addValue(2.0, "Row 2", "Column 3");
    return dataset;
}

6.2.3 创建一个chart图表

接下来就是要创建一个JFreeChart的实例,使用上面提供的dataset数据集画一个直方条形图。简单的,我们使用ChartFactory类来创建这个JFreeChart实例。代码如下:

private JFreeChart createChart(CategoryDataset dataset) {
    JFreeChart chart = ChartFactory.createBarChart(
        "BarChartDemo", // chart title
        "Category", // domain axis label
        "Value", // range axis label
        dataset, // data
        PlotOrientation.VERTICAL, // orientation
        true, // include legend
        true, // tooltips?
        false // URLs?
    );
    return chart;
}

CreateBarChart()的大部分参数是比较容易理解的,但其中一部分还需要进一步说明。

  • 图显示的方向可以是水平的,还是可以是垂直的。
  • 图表的信息提示,是否要添加,有一个标志来控制——在上面的例子中,我们将这个标识设置为true,因此当我们在一个swing应用窗口显示这个图表时,我们会看到这个信息提示。
  • URLs标志,设置为false。

我们完成这个直方条形图后,我们将会过头来,仔细看看ChartFactory类在后台做了写什么。

6.2.4 显示该chart图表

为了完成我们的第一个直方条形图实例,我们将JFreeChart实例传给一个ChartPanel对象,然后在一个Swing应用窗口上显示该实例。全部的代码如下:

import java.awt.Dimension;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
/**
* A simple demonstration application showing how to create a bar chart.
*/
public class BarExample1 extends ApplicationFrame {
    /**
    * Creates a new demo instance.
    *
    * @param title
    * the frame title.
    */
    public BarExample1(String title) {
        super(title);
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        dataset.addValue(1.0, "Row 1", "Column 1");
        dataset.addValue(5.0, "Row 1", "Column 2");
        dataset.addValue(3.0, "Row 1", "Column 3");
        dataset.addValue(2.0, "Row 2", "Column 1");
        dataset.addValue(3.0, "Row 2", "Column 2");
        dataset.addValue(2.0, "Row 2", "Column 3");
        JFreeChart chart = ChartFactory.createBarChart(
            "Bar Chart Demo", // chart
            // title
            "Category", // domain axis label
            "Value", // range axis label
            dataset, // data
            PlotOrientation.VERTICAL, // orientation
            true, // include legend
            true, // tooltips?
            false // URLs?
        );
        ChartPanel chartPanel = new ChartPanel(chart, false);
        chartPanel.setPreferredSize(new Dimension(500, 270));
        setContentPane(chartPanel);
    }
    /**
    * Starting point for the demonstration application.
    *
    * @param args
    * ignored.
    */
    public static void main(String[] args) {
        BarExample1 demo = new BarExample1("Bar Demo 1");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);
    }
}

完成这些代码后,运行代码,将会显示如6.2图的界面。