Bar.java

/*
 * $Id: Bar.java,v 1.23 2008/03/26 14:31:23 koga Exp $
 * 
 * Copyright (C) 2004 Koga Laboratory. All rights reserved.
 */
package org.mklab.tool.matrix;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.nfc.matrix.IntMatrix;
import org.mklab.nfc.scalar.DoubleNumber;
import org.mklab.tool.graph.gnuplot.Canvas;
import org.mklab.tool.graph.gnuplot.Gnuplot;


/**
 * 棒グラフを描画するためのデータを生成するクラスです。
 * 
 * <p>Data for bar graph
 * 
 * @author koga
 * @version $Revision: 1.23 $
 * @see org.mklab.tool.matrix.Hist
 */
public class Bar {

  /**
   * 横軸が整数の値をとる棒グラフのデータを返します。
   * 
   * @param y データ
   * @return {x, y} 棒グラフを描画するためのデータ (data for bar graph)
   */
  public static List<DoubleMatrix> bar(DoubleMatrix y) {
    return bar(new DoubleMatrix(IntMatrix.series(1, y.length())), y);
  }

  /**
   * <code>(x, y)</code>という組のデータに対応する 棒グラフを描画するためのデータを返します。
   * 
   * <p><code>x</code>の値は、等間隔に離れていて、昇順でなければならない。
   * 
   * @param x_ xデータ
   * @param y_ yデータ
   * @return {X, Y} 棒グラフを描画するためのデータ (data for bar graph)
   */
  public static List<DoubleMatrix> bar(DoubleMatrix x_, DoubleMatrix y_) {
    final int nx = x_.length();

    final DoubleMatrix x = x_;
    final DoubleMatrix y = y_;

    final DoubleNumber dx = x.max().subtract(x.min()).divide(nx - 1);
    final int n = 3 * nx;
    final DoubleMatrix X = x.createZero(1, n + 1);
    final DoubleMatrix Y = x.createZero(1, n + 1);
    final DoubleMatrix zz = Makerowv.makerowv(x).subtractElementWise(dx.divide(2));

    X.setSubVector(IntMatrix.series(1, n, 3), zz);
    X.setSubVector(IntMatrix.series(2, n, 3), zz);
    X.setSubVector(IntMatrix.series(3, n, 3), zz.addElementWise(dx));
    Y.setSubVector(IntMatrix.series(2, n, 3), y);
    Y.setSubVector(IntMatrix.series(3, n, 3), y);
    X.setElement(n + 1, X.getElement(n));

    return new ArrayList<>(Arrays.asList(new DoubleMatrix[] {X, Y}));
  }

  /**
   * 棒グラフを描画します。
   * 
   * @param x xデータ
   * @param y yデータ
   * @return グラフを描画したGnuplot
   * @throws IOException gnuplotプロセスを起動できない場合
   */
  public static Gnuplot plot(DoubleMatrix x, DoubleMatrix y) throws IOException {
    final List<DoubleMatrix> tmp = bar(x, y);
    final DoubleMatrix xx = tmp.get(0);
    final DoubleMatrix yy = tmp.get(1);
    final Gnuplot gp = new Gnuplot();
    final Canvas canvas = gp.createCanvas();
    canvas.plot(xx, yy, new String[] {""}); //$NON-NLS-1$
    return gp;
  }

  /**
   * 棒グラフを描画します。
   * 
   * @param x データ
   * @return グラフを描画したGnuplot
   * @throws IOException gnuplotプロセスを起動できない場合
   */
  public static Gnuplot plot(DoubleMatrix x) throws IOException {
    final List<DoubleMatrix> tmp = bar(x);
    final DoubleMatrix xx = tmp.get(0);
    final DoubleMatrix yy = tmp.get(1);
    final Gnuplot gp = new Gnuplot();
    final Canvas canvas = gp.createCanvas();
    canvas.plot(xx, yy, new String[] {""}); //$NON-NLS-1$
    return gp;
  }

}