huruyosi’s blog

プログラミングとかインフラとかのメモです。

折れ線グラフ(XY Line Chart)の横軸に時(Hour)を表示する

目的

下の様な時間単位に集計した結果を XY Line Chartにして9時から始まり翌日の8時までのメモリを設定します。

f:id:huruyosi:20141231132208p:plain

ソースコード

final XYSeriesCollection data = new XYSeriesCollection();
int n = 1;
for( ReportBean row: src){
    XYSeries series = new XYSeries("属性"+n++);
    Integer[] values = new Integer[]{
        row.num_09,row.num_10,row.num_11,row.num_12,
        row.num_13,row.num_14,row.num_15,row.num_16,
        row.num_17,row.num_18,row.num_19,row.num_20,
        row.num_21,row.num_22,row.num_23,row.num_24,
        row.num_01,row.num_02,row.num_03,row.num_04,
        row.num_05,row.num_06,row.num_07,row.num_08
    };
    int i =0;
    for( Integer value: values){
        series.add(i++, value);
    }
    data.addSeries(series);
}
final JFreeChart chart = ChartFactory.createXYLineChart("", "時", "人数", data, PlotOrientation.VERTICAL, true, true, false);

// 判例の書式を設定
chart.getLegend().setItemFont(font);
chart.setBackgroundPaint(Color.WHITE);;

XYPlot plot = (XYPlot) chart.getPlot();

// X軸の設定
String[] xLabels = new String[]{
    "9時" ,"10時","11時","12時",
    "13時","14時","15時","16時",
    "17時","18時","19時","20時",
    "21時","22時","23時","24時",
    "1時" ,"2時" ,"3時" ,"4時",
    "5時" ,"6時" ,"7時" ,"8時",
}
SymbolAxis xAxis = new SymbolAxis("時", xLabels );
// X軸の目盛りの間隔
xAxis.setTickUnit(new NumberTickUnit(1));
xAxis.setRange(0, 23);

// X軸の目盛りの設定を描画に反映
plot.setDomainAxis(xAxis);

やっていること

XYSeries への値設定

系列別(一つの折れ線)に値を設定するときに、XYSeries#add(x,y)で値を設定するときにx=0に9時の値、x=1に10時の値、x=2に11時の値・・・を設定し、左から9時、10時、11時~並ぶようにします。

SymbolAxis を使って目盛りを設定

  • ラベルの文字列をString[] xLabelsに設定します。XYSeriesへの設定と同様に9時から始まります。
  • xAxis.setTickUnit(new NumberTickUnit(1))で目盛りを1単位にします。
  • xAxis.setRange(0, 23)で値の範囲を0~23に固定します。
  • plot.setDomainAxis(xAxis)で目盛りの設定を描画に反映します。