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;
}
}