25package umontreal.ssj.charts;
27import java.util.Formatter;
28import java.util.Locale;
29import java.util.StringTokenizer;
30import java.util.regex.Pattern;
33import java.io.StringReader;
34import java.io.IOException;
36import org.jfree.data.xy.XYSeriesCollection;
37import org.jfree.data.category.CategoryDataset;
38import org.jfree.data.io.CSV;
46public class PlotFormat {
47 private PlotFormat() {
67 int maxLineNumber = 16;
70 double[][] retour =
new double[1][1];
72 Pattern p = Pattern.compile(
"\\n\\n*");
73 String[]
string = p.split(data);
75 for (
int j = 0; j <
string.length; j++) {
76 if (
string[j].charAt(0) !=
'#' &&
string[j].length() != 0) {
79 p = Pattern.compile(
"\\s\\s*");
80 String[] result = p.split(
string[j]);
81 double[] line =
new double[result.length];
84 for (
int i = 0; i < result.length; i++) {
86 line[k] = Double.valueOf(result[i]);
89 }
catch (NumberFormatException nfe) {
95 if (lineNumber == 0) {
97 retour =
new double[columnNumber][maxLineNumber];
98 }
else if (columnNumber != k)
99 throw new IllegalArgumentException(
"Each line must have the same number of values");
101 if (lineNumber >= maxLineNumber) {
102 maxLineNumber = maxLineNumber * 2;
103 double[][] temp =
new double[columnNumber][maxLineNumber];
104 for (
int i = 0; i < columnNumber; i++)
105 for (
int l = 0; l < retour[0].length; l++)
106 temp[i][l] = retour[i][l];
110 for (
int i = 0; i < columnNumber; i++)
111 retour[i][lineNumber] = line[i];
118 if (columnNumber == 0)
121 temp =
new double[columnNumber][lineNumber];
122 for (
int i = 0; i < columnNumber; i++)
123 for (
int l = 0; l < lineNumber; l++)
124 temp[i][l] = retour[i][l];
139 public static double[][]
fromCSV(String data) {
140 int maxLineNumber = 16;
141 int columnNumber = 0;
143 double[][] retour =
new double[1][1];
145 Pattern p = Pattern.compile(
"\\n\\n*");
146 String[]
string = p.split(data);
148 for (
int j = 0; j <
string.length; j++) {
149 if (
string[j].length() != 0) {
152 p = Pattern.compile(
",,*");
153 String[] result = p.split(
string[j]);
154 double[] line =
new double[result.length];
157 for (
int i = 0; i < result.length; i++) {
159 line[k] = Double.valueOf(result[i]);
162 }
catch (NumberFormatException nfe) {
168 if (lineNumber == 0) {
170 retour =
new double[columnNumber][maxLineNumber];
171 }
else if (columnNumber != k)
172 throw new IllegalArgumentException(
"Each line must have the same number of values");
174 if (lineNumber >= maxLineNumber) {
175 maxLineNumber = maxLineNumber * 2;
176 double[][] temp =
new double[columnNumber][maxLineNumber];
177 for (
int i = 0; i < columnNumber; i++)
178 for (
int l = 0; l < retour[0].length; l++)
179 temp[i][l] = retour[i][l];
183 for (
int i = 0; i < columnNumber; i++)
184 retour[i][lineNumber] = line[i];
191 if (columnNumber == 0)
194 temp =
new double[columnNumber][lineNumber];
195 for (
int i = 0; i < columnNumber; i++)
196 for (
int l = 0; l < lineNumber; l++)
197 temp[i][l] = retour[i][l];
220 int maxLineNumber = 16;
221 int columnNumber = 0;
223 double[][] retour =
new double[1][1];
225 Pattern p = Pattern.compile(
"(" + endLine +
")(" + endLine +
")*");
226 String[]
string = p.split(data);
228 for (
int j = 0; j <
string.length; j++) {
229 if (
string[j].length() != 0) {
232 p = Pattern.compile(
"(" + betweenValues +
")(" + betweenValues +
")*");
233 String[] result = p.split(
string[j]);
234 double[] line =
new double[result.length];
237 for (
int i = 0; i < result.length; i++) {
239 line[k] = Double.valueOf(result[i]);
242 }
catch (NumberFormatException nfe) {
248 if (lineNumber == 0) {
250 retour =
new double[columnNumber][maxLineNumber];
251 }
else if (columnNumber != k)
252 throw new IllegalArgumentException(
"Each line must have the same number of values");
254 if (lineNumber >= maxLineNumber) {
255 maxLineNumber = maxLineNumber * 2;
256 double[][] temp =
new double[columnNumber][maxLineNumber];
257 for (
int i = 0; i < columnNumber; i++)
258 for (
int l = 0; l < retour[0].length; l++)
259 temp[i][l] = retour[i][l];
263 for (
int i = 0; i < columnNumber; i++)
264 retour[i][lineNumber] = line[i];
271 if (columnNumber == 0)
274 temp =
new double[columnNumber][lineNumber];
275 for (
int i = 0; i < columnNumber; i++)
276 for (
int l = 0; l < lineNumber; l++)
277 temp[i][l] = retour[i][l];
299 Formatter formatter =
new Formatter(Locale.US);
301 for (
int i = 0; i < data[0].length; i++) {
302 for (
int j = 0; j < data.length; j++) {
303 formatter.format(
"%20f", data[j][i]);
305 formatter.format(
"%n");
307 formatter.format(
"%n%n");
308 return formatter.toString();
318 public static String
toGNUPlot(XYSeriesCollection data) {
331 public static String
toCSV(
double[]... data) {
333 Formatter formatter =
new Formatter(Locale.US);
335 for (
int i = 0; i < data[0].length; i++) {
336 for (
int j = 0; j < data.length - 1; j++) {
337 formatter.format(
"%-20f, ", data[j][i]);
339 formatter.format(
"%-20f%n", data[data.length - 1][i]);
341 formatter.format(
"%n");
343 return formatter.toString();
353 public static String
toCSV(XYSeriesCollection data) {
354 return toCSV(toTable(data));
372 public static String
toCustomizedFormat(String heading, String footer, String betweenValues, String endLine,
373 int precision,
double[]... data) {
375 Formatter formatter =
new Formatter(Locale.US);
376 String myString =
"%20." + precision +
"f";
378 formatter.format(
"%s", heading);
379 for (
int i = 0; i < data[0].length; i++) {
380 for (
int j = 0; j < data.length - 1; j++) {
381 formatter.format(myString +
"%s", data[j][i], betweenValues);
383 formatter.format(myString +
"%s", data[data.length - 1][i], endLine);
385 formatter.format(
"%s", footer);
386 return formatter.toString();
402 public static String
toCustomizedFormat(String heading, String footer, String betweenValues, String endLine,
403 int precision, XYSeriesCollection data) {
404 return toCustomizedFormat(heading, footer, betweenValues, endLine, precision, toTable(data));
410 private static double[][] toTable(XYSeriesCollection data) {
411 double[][] transform =
new double[data.getSeriesCount() * 2][];
413 for (
int i = 0; i < data.getSeriesCount(); i++) {
414 double[][] temp = data.getSeries(i).toArray();
415 transform[2 * i] = temp[0];
416 transform[2 * i + 1] = temp[1];
427 private static void checkData(
double[]... data) {
428 for (
int i = 0; i < data.length - 1; i++) {
429 if (data[i].length != data[i + 1].length)
430 throw new IllegalArgumentException(
"Data tables " + i +
" and " + (i + 1) +
" must share the same length");