複数の系列のデータ

広告

ガントチャートの場合は複数の系列のデータを取り扱う事が可能です。

ここでは例として次のようなデータを元にグラフを作成します。

系列:計画

タスク名開始時期終了時期
要件定義2007/3/42007/3/12
設計2007/3/122007/3/25
開発2007/4/22007/4/30
テスト2007/5/12007/5/10

系列:実績

タスク名開始時期終了時期
要件定義2007/3/42007/3/14
設計2007/3/142007/4/3
開発2007/4/52007/5/10
テスト2007/5/112007/5/18

系列を表すTaskSeriesクラスのオブジェクトを作成し、それぞれの系列にデータを登録していきます。

実際には次のように記述します。

TaskSeriesCollection data = new TaskSeriesCollection();

String[] taskname = {"要件定義", "設計", "開発", "テスト"};

TaskSeries series1 = new TaskSeries("計画");
TaskSeries series2 = new TaskSeries("実績");

Calendar calendar = Calendar.getInstance();

calendar.set(2007, 3, 4);
Date start = calendar.getTime();
calendar.set(2007, 3, 12);
Date end = calendar.getTime();

Task task11 = new Task("要件定義", start, end);
series1.add(task11);

/* タスクの数だけ繰り返す */

calendar.set(2007, 3, 4);
Date start = calendar.getTime();
calendar.set(2007, 3, 14);
Date end = calendar.getTime();

Task task21 = new Task("設計", start, end);
series2.add(task21);

/* タスクの数だけ繰り返す */

data.add(series1);
data.add(series2);

サンプルプログラム

では簡単なサンプルを作成して試してみます。

Test3_1.java

import org.jfree.chart.JFreeChart;
import org.jfree.chart.ChartFactory;
import org.jfree.data.gantt.TaskSeriesCollection;
import org.jfree.data.gantt.TaskSeries;
import org.jfree.data.gantt.Task;

import java.util.Date;
import java.util.Calendar;

import javax.swing.JFrame;
import java.awt.BorderLayout;
import org.jfree.chart.ChartPanel;

public class Test3_1 extends JFrame{
  public static void main(String[] args) {
    Test3_1 frame = new Test3_1();

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(10, 10, 500, 500);
    frame.setTitle("グラフサンプル");
    frame.setVisible(true);
  }

  Test3_1(){
    JFreeChart chart = ChartFactory.createGanttChart("プロジェクト管理", 
                                                     "項目",
                                                     "日程",
                                                     createData(),
                                                     true, 
                                                     false, 
                                                     false);


    ChartPanel cpanel = new ChartPanel(chart);
    getContentPane().add(cpanel, BorderLayout.CENTER);
  }

  private TaskSeriesCollection createData(){
    TaskSeriesCollection data = new TaskSeriesCollection();

    String[] taskname = {"要件定義", "設計", "開発", "テスト"};

    TaskSeries series1 = new TaskSeries("計画");
    TaskSeries series2 = new TaskSeries("実績");

    Task task11 = 
      new Task(taskname[0], createData(2007, 3, 4), createData(2007, 3, 12));
    Task task12 = 
      new Task(taskname[1], createData(2007, 3, 12), createData(2007, 3, 25));
    Task task13 = 
      new Task(taskname[2], createData(2007, 4, 2), createData(2007, 4, 30));
    Task task14 = 
      new Task(taskname[3], createData(2007, 5, 1), createData(2007, 5, 10));

    series1.add(task11);
    series1.add(task12);
    series1.add(task13);
    series1.add(task14);

    Task task21 = 
      new Task(taskname[0], createData(2007, 3, 4), createData(2007, 3, 14));
    Task task22 = 
      new Task(taskname[1], createData(2007, 3, 14), createData(2007, 4, 3));
    Task task23 = 
      new Task(taskname[2], createData(2007, 4, 5), createData(2007, 5, 10));
    Task task24 = 
      new Task(taskname[3], createData(2007, 5, 11), createData(2007, 5, 18));

    series2.add(task21);
    series2.add(task22);
    series2.add(task23);
    series2.add(task24);

    data.add(series1);
    data.add(series2);

    return data;
  }

  private Date createData(int year, int month, int date){
    Calendar calendar = Calendar.getInstance();
    calendar.set(year, month - 1, date);
    return calendar.getTime();
  }
}

上記をコンパイルした後で実行すると次のようにJavaアプリケーションが起動します。

複数の系列のデータ

( Written by Tatsuo Ikura )