系列1つの棒グラフを描画するサンプル

JavaFXで棒グラフを描画したいと思い、調べた結果、以下のURLにたどりつきました。
https://docs.oracle.com/javase/jp/8/javafx/user-interface-tutorial/bar-chart.htm
しかし、系列3つのサンプルでした。なので系列1つのサンプルを作ってみました。

以下、段階を追って説明します。

#棒グラフの縦、横

棒グラフを描画するにはBarChart<X,Y>クラスを使います。ジェネリックスにはNumberとStringの組み合わせを書くのが基本のようです。NumberとString順序ははグラフを縦にするか、横にするかによって、変わります。また、合わせてコンストラクタの引数の順序を変えます。

```Java:横
BarChart<Number, String> bc = new BarChart<>(new NumberAxis(), new CategoryAxis());
```

```Java:縦
BarChart<String, Number> bc = new BarChart<>(new CategoryAxis(), new NumberAxis());
```

以下、横の棒グラフを作成することにします。

#データなし棒グラフ

データを何も持たない状態の棒グラフを描画します。BarChart<Number, String>のインスタンスを生成して、 Sceneクラスのコンストラクタに指定します。

```Java:データなし棒グラフ
package test;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.stage.Stage;

public class BarChartDefault extends Application {

	@Override
	public void start(Stage primaryStage) throws Exception {

		// 棒グラフを生成
        BarChart<Number, String> bc = new BarChart<>(new NumberAxis(), new CategoryAxis());

        Scene scene  = new Scene(bc, 400, 400);

		primaryStage.setTitle("棒グラフ");
		primaryStage.setScene(scene);
		primaryStage.show();

	}

	public static void main(String[] args) {
        launch(args);
    }

}
```
以下のように軸だけが描画されます。

![def.png](https://qiita-image-store.s3.amazonaws.com/0/133921/73e79585-a423-8fd3-7019-f04fea935902.png)


#データあり棒グラフ

例として、以下のグラフを描画します。学校のクラスの人数の表です。

| クラス名  | 人数  |
|:----------|------:|
| A         | 20    |
| B         | 10    |
| C         | 30    |

```Java:データなし棒グラフ
package test;

import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.chart.XYChart.Series;
import javafx.stage.Stage;

public class BarChartAddData extends Application {

	@Override
	public void start(Stage primaryStage) throws Exception {

        // 系列を生成
        Series<Number, String> series = new Series<Number, String>();
        series.setName("人数");
        ObservableList<Data<Number, String>> list = series.getData();
        list.add(new XYChart.Data<>(20, "A"));
        list.add(new XYChart.Data<>(10, "B"));
        list.add(new XYChart.Data<>(30, "C"));

        // 棒グラフを生成
        BarChart<Number, String> bc = new BarChart<>(new NumberAxis(), new CategoryAxis());
        bc.getData().add(series);

        Scene scene  = new Scene(bc, 400, 400);

		primaryStage.setTitle("棒グラフ");
		primaryStage.setScene(scene);
		primaryStage.show();

	}

	public static void main(String[] args) {
        launch(args);
    }

}
```

以下のようにグラフが描画されます。

![addData.png](https://qiita-image-store.s3.amazonaws.com/0/133921/f694d3a0-489f-bd11-f2d0-f3fafacbbc11.png)

##categoryGapメソッド

上記のグラフは縦に太いです。画面の大きさとデータの区分の数から自動で調節されるようです。BarChart<X,Y>クラスにはcategoryGapというプロパティあり、異なるカテゴリのバーの間に残す間隔の値です。値を出力させた結果、10.0でした。なので、50くらうに設定してみます。setCategoryGapメソッドが用意されてますので、以下の一行を追加します。

```Java:categoryGapの設定
bc.setCategoryGap(50);
```

以下のように、グラフが細くなりました。

![setCategoryGap.png](https://qiita-image-store.s3.amazonaws.com/0/133921/fab91898-ef8f-82fd-88dc-4df055e3e8eb.png)


##getBarGapメソッド

よく見ると、ラベルの上下中央の位置とグラフがずれています。これはbarGapという値で変化します。値を出力させた結果4.0でした。なので0にします。以下の一行を追加します。

```Java:barGapの設定
bc.setBarGap(0);
```

これでグラフの位置が揃いました。

![setBarGap.png](https://qiita-image-store.s3.amazonaws.com/0/133921/3c3aeb7e-b223-1204-c743-f82512b9654b.png)