/*
* RapidMiner
*
* Copyright (C) 2001-2008 by Rapid-I and the contributors
*
* Complete list of developers available at our web site:
*
* http://rapid-i.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/
package com.rapidminer.datatable;
import java.io.PrintStream;
import java.text.DateFormat;
import java.util.Collection;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.TreeSet;
/**
* This class can be used to create GnuPlot files from data tables.
*
* @author Ingo Mierswa
* @version $Id: GnuPlotDataTableHandler.java,v 1.3 2008/05/09 19:23:16 ingomierswa Exp $
*/
public class GnuPlotDataTableHandler implements DataTableListener {
private static final Comparator<double[]> ROW_COMPARATOR = new Comparator<double[]>() {
public int compare(double[] row1, double[] row2) {
for (int i = 0; i < row1.length; i++) {
if (row1[i] < row2[i])
return -1;
else if (row1[i] > row2[i])
return +1;
}
return 0;
};
};
private DataTable table;
public GnuPlotDataTableHandler(DataTable table) {
this.table = table;
this.table.addDataTableListener(this);
}
public void dataTableUpdated(DataTable table) {
this.table = table;
}
public void writeGNUPlot(PrintStream out, int x, int y, int[] z, String linetype, String additionalCommands, String terminal) {
writeGNUPlotHeader(out, table.getColumnName(x), (y != -1 ? table.getColumnName(y) : table.getColumnName(z[0])), table.getColumnName(z[0]), additionalCommands, terminal);
if (y != -1)
out.print("splot ");
else
out.print("plot ");
for (int i = 0; i < z.length; i++) {
if (i > 0)
out.print(", ");
out.print("'-' title \"" + table.getColumnName(z[i]) + "\" with " + linetype);// linespoints");
}
out.println();
for (int i = 0; i < z.length; i++) {
if (y != -1)
write3DGNUPlotData(out, x, y, z[i]);
else
write2DGNUPlotData(out, x, z[i]);
out.println("e");
}
}
private void writeGNUPlotHeader(PrintStream out, String xAxis, String yAxis, String zAxis, String additionalCommands, String terminal) {
out.println("#!gnuplot");
out.println("# Generated by " + getClass() + " on " + DateFormat.getDateTimeInstance().format(new Date()));
if (xAxis != null)
out.println("set xlabel \"" + xAxis + "\"");
if (yAxis != null)
out.println("set ylabel \"" + yAxis + "\"");
if (zAxis != null)
out.println("set zlabel \"" + zAxis + "\"");
if (additionalCommands != null)
out.println(additionalCommands);
if (terminal != null)
out.println("set terminal " + terminal);
}
private void write2DGNUPlotData(PrintStream out, int x, int y) {
Collection<double[]> plot = new TreeSet<double[]>(ROW_COMPARATOR);
Iterator<DataTableRow> i = table.iterator();
while (i.hasNext()) {
DataTableRow row = i.next();
plot.add(new double[] { row.getValue(x), row.getValue(y) });
}
Iterator<double[]> j = plot.iterator();
while (j.hasNext()) {
double[] row = j.next();
out.println(row[0] + "\t" + row[1]);
}
}
private void write3DGNUPlotData(PrintStream out, int x, int y, int z) {
Collection<double[]> plot = new TreeSet<double[]>(ROW_COMPARATOR);
Iterator<DataTableRow> i = table.iterator();
while (i.hasNext()) {
DataTableRow row = i.next();
plot.add(new double[] { row.getValue(x), row.getValue(y), row.getValue(z) });
}
double oldX = Double.NaN;
Iterator<double[]> j = plot.iterator();
while (j.hasNext()) {
double[] row = j.next();
if ((!Double.isNaN(oldX)) && (row[0] != oldX)) {
out.println();
}
out.println(row[0] + "\t" + row[1] + "\t" + row[2]);
oldX = row[0];
}
}
}