ドキュメント



JavaFX: JavaFX UIコンポヌネントの操䜜

33 面グラフ

この章では、2軞チャヌトのもう1぀のタむプである面グラフに぀いお説明したす。

折れ線グラフず同じように、デヌタは、盎線で結ばれた䞀連の点ずしお衚瀺されたす。 ただし、軞ず線の間の面には色が付けられたす。 デヌタの系列ごずに異なる色が付けられたす。 図33-1に、デヌタの系列が2぀ある面グラフを瀺したす。

図33-1 䞀般的な面グラフ

図33-1の説明が続きたす
「図33-1 䞀般的な面グラフ」の説明

面グラフの䜜成

アプリケヌションで簡単な面グラフを䜜成するには、最䜎限、2぀の軞を定矩し、AreaChartクラスをむンスタンス化しおAreaChartオブゞェクトを䜜成し、XYChart.Seriesクラスを䜿甚しおデヌタの系列を1぀以䞊䜜成し、デヌタをグラフに割り圓おる必芁がありたす。

AreaChartクラスをむンスタンス化する堎合、コンストラクタ内でデヌタの系列が含たれる監芖可胜リストを指定するこずも、埌でAreaChartオブゞェクトに察しおgetDataおよびaddAllメ゜ッドをコヌルしおデヌタの系列を远加するこずもできたす。

䟋33-1では、枩床モニタリング・デヌタを衚す面グラフを䜜成しおいたす。 この䟋では、AprilずMayの期間に぀いお収集された2぀のデヌタの系列を䜿甚しおいたす。

䟋33-1 面グラフの䜜成

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.AreaChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.stage.Stage;
 
 
public class AreaChartSample extends Application {
 
    @Override public void start(Stage stage) {
        stage.setTitle("Area Chart Sample");
        final NumberAxis xAxis = new NumberAxis(1, 31, 1);
        final NumberAxis yAxis = new NumberAxis();
        final AreaChart<Number,Number> ac = 
            new AreaChart<>(xAxis,yAxis);
        ac.setTitle("Temperature Monitoring (in Degrees C)");
 
        XYChart.Series seriesApril= new XYChart.Series();
        seriesApril.setName("April");
        seriesApril.getData().add(new XYChart.Data(1, 4));
        seriesApril.getData().add(new XYChart.Data(3, 10));
        seriesApril.getData().add(new XYChart.Data(6, 15));
        seriesApril.getData().add(new XYChart.Data(9, 8));
        seriesApril.getData().add(new XYChart.Data(12, 5));
        seriesApril.getData().add(new XYChart.Data(15, 18));
        seriesApril.getData().add(new XYChart.Data(18, 15));
        seriesApril.getData().add(new XYChart.Data(21, 13));
        seriesApril.getData().add(new XYChart.Data(24, 19));
        seriesApril.getData().add(new XYChart.Data(27, 21));
        seriesApril.getData().add(new XYChart.Data(30, 21));
        
        XYChart.Series seriesMay = new XYChart.Series();
        seriesMay.setName("May");
        seriesMay.getData().add(new XYChart.Data(1, 20));
        seriesMay.getData().add(new XYChart.Data(3, 15));
        seriesMay.getData().add(new XYChart.Data(6, 13));
        seriesMay.getData().add(new XYChart.Data(9, 12));
        seriesMay.getData().add(new XYChart.Data(12, 14));
        seriesMay.getData().add(new XYChart.Data(15, 18));
        seriesMay.getData().add(new XYChart.Data(18, 25));
        seriesMay.getData().add(new XYChart.Data(21, 25));
        seriesMay.getData().add(new XYChart.Data(24, 23));
        seriesMay.getData().add(new XYChart.Data(27, 26));
        seriesMay.getData().add(new XYChart.Data(31, 26));
        
        Scene scene  = new Scene(ac,800,600);
        ac.getData().addAll(seriesApril, seriesMay);
        stage.setScene(scene);
        stage.show();
    }
 
    public static void main(String[] args) {
        launch(args);
    }
}

この䟋では、暪軞ず瞊軞䞊で数倀デヌタを衚すために2぀のNumberAxisオブゞェクトが䜜成されおいたす。 暪軞(X)でレンダリングされる倀はXYChart.Dataオブゞェクトの最初のパラメヌタから取埗されたす。䞀方、瞊軞(Y)のデヌタは2番目のパラメヌタが提䟛したす。

デヌタの系列は、getDataおよびaddAllメ゜ッドを䜿甚しおグラフに割り圓おられおいたす。 seriesMayデヌタは最埌に远加されるため、察応する緑色の面が、Aprilのデヌタを衚す黄色の面の䞊に重なっお衚瀺されたす。

アプリケヌションをコンパむルしお実行した結果を図33-2に瀺したす。

図33-2 デヌタの系列が2぀ある面グラフ

図33-2の説明が続きたす
「図33-2 デヌタの系列が2぀ある面グラフ」の説明

積䞊げ面グラフの䜜成

面グラフのデヌタは、StackedAreaChartクラスを䜿甚しお衚すこずができたす。 このクラスでは、各面が積み䞊げおビルドされるため、デヌタの各系列は隣接したすが、先行するデヌタの系列ず重なり合いたせん。 䟋33-2では、このタスクを実装しおいたす。

䟋33-2 積䞊げ面グラフの䜜成

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.StackedAreaChart;
import javafx.scene.chart.XYChart;
import javafx.stage.Stage;
 
public class StackedAreaChartSample extends Application {
    final NumberAxis xAxis = new NumberAxis(1, 31, 1);
    final NumberAxis yAxis = new NumberAxis();
    final StackedAreaChart<Number, Number> sac =
        new StackedAreaChart<>(xAxis, yAxis);
 
    @Override
    public void start(Stage stage) {
        stage.setTitle("Area Chart Sample");
        sac.setTitle("Temperature Monitoring (in Degrees C)");
        XYChart.Series<Number, Number> seriesApril =
            new XYChart.Series<>();
        seriesApril.setName("April");
        seriesApril.getData().add(new XYChart.Data(1, 4));
        seriesApril.getData().add(new XYChart.Data(3, 10));
        seriesApril.getData().add(new XYChart.Data(6, 15));
        seriesApril.getData().add(new XYChart.Data(9, 8));
        seriesApril.getData().add(new XYChart.Data(12, 5));
        seriesApril.getData().add(new XYChart.Data(15, 18));
        seriesApril.getData().add(new XYChart.Data(18, 15));
        seriesApril.getData().add(new XYChart.Data(21, 13));
        seriesApril.getData().add(new XYChart.Data(24, 19));
        seriesApril.getData().add(new XYChart.Data(27, 21));
        seriesApril.getData().add(new XYChart.Data(30, 21));
        XYChart.Series<Number, Number> seriesMay =
            new XYChart.Series<>();
        seriesMay.setName("May");
        seriesMay.getData().add(new XYChart.Data(1, 20));
        seriesMay.getData().add(new XYChart.Data(3, 15));
        seriesMay.getData().add(new XYChart.Data(6, 13));
        seriesMay.getData().add(new XYChart.Data(9, 12));
        seriesMay.getData().add(new XYChart.Data(12, 14));
        seriesMay.getData().add(new XYChart.Data(15, 18));
        seriesMay.getData().add(new XYChart.Data(18, 25));
        seriesMay.getData().add(new XYChart.Data(21, 25));
        seriesMay.getData().add(new XYChart.Data(24, 23));
        seriesMay.getData().add(new XYChart.Data(27, 26));
        seriesMay.getData().add(new XYChart.Data(31, 26));
        Scene scene = new Scene(sac, 800, 600);
        sac.getData().addAll(seriesApril, seriesMay);
        stage.setScene(scene);
        stage.show();
    }
 
    public static void main(String[] args) {
        launch(args);
    }
}

このアプリケヌションをコンパむルしお実行するず、図33-3に瀺すグラフが䜜成されたす。

図33-3 2぀の面のある積䞊げ面グラフ

図33-3の説明が続きたす
「図33-3 2぀の面のある積䞊げ面グラフ」の説明

図33-3に瀺すデヌタを図33-2の同じデヌタず比范しおください。 積䞊げ面グラフ内の面では、暪軞䞊の任意の点においお瞊軞の倀が环積しお衚瀺されたす。 たずえば、積䞊げ面グラフ内で5月15日に衚瀺されおいる瞊軞䞊の倀は36ですが、これはこの日の実際の枩床ずは䞀臎したせん。 この倀は、4月15日ず5月15日の枩床の环積結果を衚したす。

JavaFXアプリケヌションで面グラフを開発する堎合、瞊軞のデヌタは面グラフのタむプ(AreaChartたたはStackedAreaChart)に応じお解釈されるこずに泚意しおください。 アプリケヌションのタスクに最も適したデヌタ衚珟を遞択しおください。

軞プロパティずティック・プロパティの蚭定

図33-2および図33-3の「Temperature Monitoring」アプリケヌションの出力は、ナヌザヌフレンドリな方法ではなく、デフォルトの二重フォヌマットで軞に数倀が衚瀺されおいたす。 たずえば、日付は浮動小数点倀ではなく、1から31たでの範囲内の敎数である必芁がありたす。

JavaFX SDK APIには、グラフの軞䞊でレンダリングされた倀の倖芳を調敎するために耇数のメ゜ッドが甚意されおいたす。 図33-4に、グラフの軞のメむン芁玠を瀺したす。これには、範囲の数倀を瀺すティック・マヌクずティック・ラベルが含たれたす。

䟋33-3に瀺すように、NumberAxisクラスのコンストラクタたたは察応するメ゜ッドを䜿甚しお数倀範囲内の最小倀ず最倧倀を指定できたす。

䟋33-3 暪軞のデヌタ範囲の指定

//Using the NumberAxis constructor
final NumberAxis xAxis = new NumberAxis(1, 31, 1);
//Using the corresponding methods
xAxis.setLowerBound(1);
xAxis.setUpperBound(31);
xAxis.setTickUnit(1);

NumberAxisクラスの3パラメヌタのコンストラクタを䜿甚する堎合、最初のパラメヌタは範囲内の最小倀を定矩し、2番目のパラメヌタは範囲内の最倧倀であり、3番目のパラメヌタはティック単䜍(軞䞊の2぀のティック・マヌク間の倀)を定矩するこずに泚意しおください。

たた、暪軞に副ティックを衚瀺しないようにする堎合は、䟋33-4に瀺すように、minorTickCountプロパティに0を指定したす。

䟋33-4 副ティック・カりントに察する倀れロの蚭定

xAxis.setMinorTickCount(0);

このプロパティは、各䞻ティック・マヌク間に衚瀺される副ティックの数を定矩したす。 この倀を0に蚭定するこずにより、暪軞の副ティックを無効にしたす。

䟋33-3および䟋33-4のコヌド行を「Temperature Monitoring」アプリケヌションに远加するず、暪軞が図33-5に瀺すように倉曎されたす。

アプリケヌションにティック・ラベルを衚瀺する必芁がない堎合、setTickLabelsVisibleメ゜ッドにfalse倀を䜿甚したす。 同様に、ティック・マヌクを衚瀺しない堎合、setTickMarkVisibleにfalse倀を䜿甚したす。

瞊軞の倀の範囲を調敎するには、䟋33-5に瀺すコヌド行を䜿甚したす。

䟋33-5 瞊軞のデヌタ範囲の指定

final NumberAxis yAxis = new NumberAxis(0, 27, 5);

副ティック・マヌクず䞻ティック・マヌクの長さが同じになるようにティック・マヌクを調敎するこずもできたす。 䟋33-6に瀺すように、tickLengthおよびminorTickLengthプロパティを䜿甚したす。

䟋33-6 副ティック・マヌクず䞻ティック・マヌクの長さの調敎

yAxis.setMinorTickLength(yAxis.getTickLength());

䟋33-5および䟋33-6のコヌド行を「Temperature Monitoring」アプリケヌションに远加するず、瞊軞が図33-6に瀺すように倉曎されたす。

負の倀の远加

「Temperature Monitoring」アプリケヌションの瞊軞はNumberAxisクラスを䜿甚しお䜜成されるため、面グラフ・デヌタに負の倀を指定できたす。

䟋33-7に瀺すように、デヌタの系列をもう1぀䜜成したす。

䟋33-7 負の倀があるデヌタの系列の远加

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.AreaChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.stage.Stage;
 
 
public class AreaChartSample extends Application {
 
    @Override public void start(Stage stage) {
        stage.setTitle("Area Chart Sample");
        final NumberAxis xAxis = new NumberAxis(1, 31, 1);
        xAxis.setMinorTickCount(0);    
        final NumberAxis yAxis = new NumberAxis(-5, 27, 5);        
        yAxis.setMinorTickLength(yAxis.getTickLength());
        yAxis.setForceZeroInRange(false);        
        
        final AreaChart<Number,Number> ac = 
            new AreaChart<Number,Number>(xAxis,yAxis);       
        ac.setTitle("Temperature Monitoring (in Degrees C)");
 
        XYChart.Series seriesApril= new XYChart.Series();
        seriesApril.setName("April");
        seriesApril.getData().add(new XYChart.Data(0, 4));
        seriesApril.getData().add(new XYChart.Data(3, 10));
        seriesApril.getData().add(new XYChart.Data(6, 15));
        seriesApril.getData().add(new XYChart.Data(9, 8));
        seriesApril.getData().add(new XYChart.Data(12, 5));
        seriesApril.getData().add(new XYChart.Data(15, 18));
        seriesApril.getData().add(new XYChart.Data(18, 15));
        seriesApril.getData().add(new XYChart.Data(21, 13));
        seriesApril.getData().add(new XYChart.Data(24, 19));
        seriesApril.getData().add(new XYChart.Data(27, 21));
        seriesApril.getData().add(new XYChart.Data(30, 21));
        
        XYChart.Series seriesMay = new XYChart.Series();
        seriesMay.setName("May");
        seriesMay.getData().add(new XYChart.Data(0, 20));
        seriesMay.getData().add(new XYChart.Data(3, 15));
        seriesMay.getData().add(new XYChart.Data(6, 13));
        seriesMay.getData().add(new XYChart.Data(9, 12));
        seriesMay.getData().add(new XYChart.Data(12, 14));
        seriesMay.getData().add(new XYChart.Data(15, 18));
        seriesMay.getData().add(new XYChart.Data(18, 25));
        seriesMay.getData().add(new XYChart.Data(21, 25));
        seriesMay.getData().add(new XYChart.Data(24, 23));
        seriesMay.getData().add(new XYChart.Data(27, 26));
        seriesMay.getData().add(new XYChart.Data(31, 26));
        
        XYChart.Series seriesMarch = new XYChart.Series();
        seriesMarch.setName("March");
        seriesMarch.getData().add(new XYChart.Data(0, -2));
        seriesMarch.getData().add(new XYChart.Data(3, -4));
        seriesMarch.getData().add(new XYChart.Data(6, 0));
        seriesMarch.getData().add(new XYChart.Data(9, 5));
        seriesMarch.getData().add(new XYChart.Data(12, -4));
        seriesMarch.getData().add(new XYChart.Data(15, 6));
        seriesMarch.getData().add(new XYChart.Data(18, 8));
        seriesMarch.getData().add(new XYChart.Data(21, 14));
        seriesMarch.getData().add(new XYChart.Data(24, 4));
        seriesMarch.getData().add(new XYChart.Data(27, 6));
        seriesMarch.getData().add(new XYChart.Data(31, 6));      
        
        
        Scene scene  = new Scene(ac,800,600);
        ac.getData().addAll(seriesMarch, seriesApril, seriesMay);
        stage.setScene(scene);
        stage.show();
    }
 
    public static void main(String[] args) {
        launch(args);
    }
}

図33-7に、March、April、およびMayの3か月に぀いお倩候デヌタを衚瀺するよう倉曎された「Temperature Monitoring」アプリケヌションを瀺したす。

面グラフのスタむル蚭定

䟋33-7の各月の色は、addAllメ゜ッドで宣蚀されおいる察応するデヌタの系列の順序によっお定矩されたす。 これが、図33-7でMarchの面が黄色で塗られおいる理由です。 AreaChartオブゞェクトの色はCSSを介しお蚭定できたす。

Chart.cssファむルを䜜成し、AreaChartSampleアプリケヌションのメむン・クラスず同じディレクトリに保存したす。 䟋33-8に瀺す行をChart.cssファむルに远加したす。

䟋33-8 面グラフのCSSスタむル

.default-color0.chart-area-symbol { -fx-background-color: #e9967a, #ffa07a; }
.default-color1.chart-area-symbol { -fx-background-color: #f0e68c, #fffacd; }
.default-color2.chart-area-symbol { -fx-background-color: #dda0dd, #d8bfd855; }
 
.default-color0.chart-series-area-line { -fx-stroke: #e9967a; }
.default-color1.chart-series-area-line { -fx-stroke: #f0e68c; }
.default-color2.chart-series-area-line { -fx-stroke: #dda0dd; }
 
.default-color0.chart-series-area-fill { -fx-fill: #ffa07a55; }
.default-color1.chart-series-area-fill { -fx-fill: #fffacd55; }
.default-color2.chart-series-area-fill { -fx-fill: #d8bfd855; }

chart-area-symbol CSSクラスは、特定のデヌタ系列のグラフ凡䟋内の蚘号のパラメヌタを定矩したす。 䟋33-8では、グラフの凡䟋の円の内偎ず倖偎の色を蚭定しおいたす。

chart-series-area-line CSSクラスは、面グラフの線のパラメヌタを蚭定したす。 この䟋では、線描画の色です。 chart-series-area-fill CSSクラスは、面の色ず䞍透明床レベルを定矩したす。

これらのスタむルは、䟋33-9に瀺すように、SceneクラスのgetStylesheets()メ゜ッドを䜿甚しおAreaChartSampleアプリケヌションに適甚されたす。

䟋33-9 シヌンぞのCSSスタむルの適甚

scene.getStylesheets().add("areachartsample/Chart.css");

このアプリケヌションをコンパむルしお実行するず、図33-8に瀺すように、倉曎された面グラフの倖芳が生成されたす。

図33-8 スタむル蚭定された面グラフ

図33-8の説明が続きたす
「図33-8 スタむル蚭定された面グラフ」の説明

JavaFXアプリケヌションでのCSSスタむルの䜿甚に぀いおさらに孊習するには、「CSSによるチャヌトのスタむル蚭定」を参照しおください。

関連APIドキュメント

りィンドりを閉じる

目次

JavaFX: JavaFX UIコンポヌネントの操䜜

展開 | 瞮小