SSJ API Documentation
Stochastic Simulation in Java
Loading...
Searching...
No Matches
PlotFormat.java
1/*
2 * Class: PlotFormat
3 * Description:
4 * Environment: Java
5 * Software: SSJ
6 * Copyright (C) 2001 Pierre L'Ecuyer and Universite de Montreal
7 * Organization: DIRO, Universite de Montreal
8 * @author
9 * @since
10 *
11 *
12 * Licensed under the Apache License, Version 2.0 (the "License");
13 * you may not use this file except in compliance with the License.
14 * You may obtain a copy of the License at
15 *
16 * http://www.apache.org/licenses/LICENSE-2.0
17 *
18 * Unless required by applicable law or agreed to in writing, software
19 * distributed under the License is distributed on an "AS IS" BASIS,
20 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21 * See the License for the specific language governing permissions and
22 * limitations under the License.
23 *
24 */
25package umontreal.ssj.charts;
26
27import java.util.Formatter;
28import java.util.Locale;
29import java.util.StringTokenizer;
30import java.util.regex.Pattern;
31
32import java.io.Reader;
33import java.io.StringReader;
34import java.io.IOException;
35
36import org.jfree.data.xy.XYSeriesCollection;
37import org.jfree.data.category.CategoryDataset;
38import org.jfree.data.io.CSV;
39
46public class PlotFormat {
47 private PlotFormat() {
48 }
49
53
66 public static double[][] fromGNUPlot(String data) {
67 int maxLineNumber = 16;
68 int columnNumber = 0;
69 int lineNumber = 0;
70 double[][] retour = new double[1][1]; // initialisation temporaire
71
72 Pattern p = Pattern.compile("\\n\\n*");
73 String[] string = p.split(data); // A chaque String correspond une ligne
74
75 for (int j = 0; j < string.length; j++) {
76 if (string[j].charAt(0) != '#' && string[j].length() != 0) {
77 // On ne traite pas les lignes de commentaires ni les lignes
78
79 p = Pattern.compile("\\s\\s*");
80 String[] result = p.split(string[j]);
81 double[] line = new double[result.length];
82
83 int k = 0; // Compte le nombre de valeurs sur la ligne courante
84 for (int i = 0; i < result.length; i++) {
85 try {
86 line[k] = Double.valueOf(result[i]); // les chaines de caracteres qui ne sont pas des nombres sont
87 // ignorees
88 k++;
89 } catch (NumberFormatException nfe) {
90 }
91 }
92
93 if (k != 0) { // il y a des valeurs sur la ligne
94 // La premiere ligne determine combien de colonnes aura notre tableau de retour
95 if (lineNumber == 0) {
96 columnNumber = k;
97 retour = new double[columnNumber][maxLineNumber]; // Allocation du tableau de retour
98 } else if (columnNumber != k) // Toutes les lignes de la String n'ont pas le meme nombre de valeurs
99 throw new IllegalArgumentException("Each line must have the same number of values");
100
101 if (lineNumber >= maxLineNumber) { // Cas ou notre tableau initial n'est plus assez grand
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];
107 retour = temp;
108 }
109
110 for (int i = 0; i < columnNumber; i++)
111 retour[i][lineNumber] = line[i];
112 lineNumber++;
113 }
114 }
115 }
116 // Cree un tableau aux dimensions exactes
117 double[][] temp;
118 if (columnNumber == 0)
119 temp = null;
120 else
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];
125 retour = null;
126 return temp;
127 }
128
139 public static double[][] fromCSV(String data) {
140 int maxLineNumber = 16;
141 int columnNumber = 0;
142 int lineNumber = 0;
143 double[][] retour = new double[1][1]; // initialisation temporaire
144
145 Pattern p = Pattern.compile("\\n\\n*");
146 String[] string = p.split(data); // A chaque String correspond une ligne
147
148 for (int j = 0; j < string.length; j++) {
149 if (string[j].length() != 0) {
150 // On ne traite pas les lignes vides
151
152 p = Pattern.compile(",,*");
153 String[] result = p.split(string[j]);
154 double[] line = new double[result.length];
155
156 int k = 0; // Compte le nombre de valeurs sur la ligne courante
157 for (int i = 0; i < result.length; i++) {
158 try {
159 line[k] = Double.valueOf(result[i]); // les chaines de caracteres qui ne sont pas des nombres sont
160 // ignorees
161 k++;
162 } catch (NumberFormatException nfe) {
163 }
164 }
165
166 if (k != 0) { // il y a des valeurs sur la ligne
167 // La premiere ligne determine combien de colonnes aura notre tableau de retour
168 if (lineNumber == 0) {
169 columnNumber = k;
170 retour = new double[columnNumber][maxLineNumber]; // Allocation du tableau de retour
171 } else if (columnNumber != k) // Toutes les lignes de la String n'ont pas le meme nombre de valeurs
172 throw new IllegalArgumentException("Each line must have the same number of values");
173
174 if (lineNumber >= maxLineNumber) { // Cas ou notre tableau initial n'est plus assez grand
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];
180 retour = temp;
181 }
182
183 for (int i = 0; i < columnNumber; i++)
184 retour[i][lineNumber] = line[i];
185 lineNumber++;
186 }
187 }
188 }
189 // Cree un tableau aux dimensions exactes
190 double[][] temp;
191 if (columnNumber == 0)
192 temp = null;
193 else
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];
198 retour = null;
199 return temp;
200 }
201
219 public static double[][] fromCustomizedFormat(String betweenValues, String endLine, String data) {
220 int maxLineNumber = 16;
221 int columnNumber = 0;
222 int lineNumber = 0;
223 double[][] retour = new double[1][1]; // initialisation temporaire
224
225 Pattern p = Pattern.compile("(" + endLine + ")(" + endLine + ")*");
226 String[] string = p.split(data); // A chaque String correspond une ligne
227
228 for (int j = 0; j < string.length; j++) {
229 if (string[j].length() != 0) {
230 // On ne traite pas les lignes vides
231
232 p = Pattern.compile("(" + betweenValues + ")(" + betweenValues + ")*");
233 String[] result = p.split(string[j]);
234 double[] line = new double[result.length];
235
236 int k = 0; // Compte le nombre de valeurs sur la ligne courante
237 for (int i = 0; i < result.length; i++) {
238 try {
239 line[k] = Double.valueOf(result[i]); // les chaines de caracteres qui ne sont pas des nombres sont
240 // ignorees
241 k++;
242 } catch (NumberFormatException nfe) {
243 }
244 }
245
246 if (k != 0) { // il y a des valeurs sur la ligne
247 // La premiere ligne determine combien de colonnes aura notre tableau de retour
248 if (lineNumber == 0) {
249 columnNumber = k;
250 retour = new double[columnNumber][maxLineNumber]; // Allocation du tableau de retour
251 } else if (columnNumber != k) // Toutes les lignes de la String n'ont pas le meme nombre de valeurs
252 throw new IllegalArgumentException("Each line must have the same number of values");
253
254 if (lineNumber >= maxLineNumber) { // Cas ou notre tableau initial n'est plus assez grand
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];
260 retour = temp;
261 }
262
263 for (int i = 0; i < columnNumber; i++)
264 retour[i][lineNumber] = line[i];
265 lineNumber++;
266 }
267 }
268 }
269 // Cree un tableau aux dimensions exactes
270 double[][] temp;
271 if (columnNumber == 0)
272 temp = null;
273 else
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];
278 retour = null;
279 return temp;
280 }
281
285
289
297 public static String toGNUPlot(double[]... data) {
298 checkData(data);
299 Formatter formatter = new Formatter(Locale.US);
300
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]);
304 }
305 formatter.format("%n");
306 }
307 formatter.format("%n%n");
308 return formatter.toString();
309 }
310
318 public static String toGNUPlot(XYSeriesCollection data) {
319 return toGNUPlot(toTable(data));
320 }
321
331 public static String toCSV(double[]... data) {
332 checkData(data);
333 Formatter formatter = new Formatter(Locale.US);
334
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]);
338 }
339 formatter.format("%-20f%n", data[data.length - 1][i]); // le dernier
340 }
341 formatter.format("%n");
342
343 return formatter.toString();
344 }
345
353 public static String toCSV(XYSeriesCollection data) {
354 return toCSV(toTable(data));
355 }
356
372 public static String toCustomizedFormat(String heading, String footer, String betweenValues, String endLine,
373 int precision, double[]... data) {
374 checkData(data);
375 Formatter formatter = new Formatter(Locale.US);
376 String myString = "%20." + precision + "f";
377
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);
382 }
383 formatter.format(myString + "%s", data[data.length - 1][i], endLine); // le dernier de la ligne
384 }
385 formatter.format("%s", footer);
386 return formatter.toString();
387 }
388
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));
405 }
406
410 private static double[][] toTable(XYSeriesCollection data) {
411 double[][] transform = new double[data.getSeriesCount() * 2][];
412
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];
417 }
418 return transform;
419 }
420
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");
431 }
432 }
433
434 /*
435 * //Inutile si on exporte en CSV private static String mathematicaFormatPoint
436 * (double x, double y) { // Writes the pair (x, y) in returned string, in a
437 * format understood // by Mathematica StringBuffer sb = new StringBuffer();
438 * String S;
439 *
440 * sb.append (" { "); if ((x != 0.0) && (x < 0.1 || x > 1.0)) { S =
441 * PrintfFormat.E (16, 7, x); int exppos = S.indexOf ('E'); if (exppos != -1) S
442 * = S.substring (0, exppos) + "*10^(" + S.substring (exppos+1) + ")"; } else S
443 * = PrintfFormat.g (16, 8, x);
444 *
445 * sb.append (S + ", ");
446 *
447 * if (y != 0.0 && (y < 0.1 || y > 1.0)) { S = PrintfFormat.E (16, 7, y); int
448 * exppos = S.indexOf ('E'); if (exppos != -1) S = S.substring (0, exppos) +
449 * "*10^(" + S.substring (exppos+1) + ")"; } else S = PrintfFormat.g (16, 8, y);
450 *
451 * sb.append (S + " }"); return sb.toString(); }
452 */
453
454}
455
static String toCSV(XYSeriesCollection data)
Stores series collection data into a String with format CSV (comma-separated value tabular data).
static String toCSV(double[]... data)
Stores data tables data into a String with format CSV (comma-separated value tabular data).
static String toGNUPlot(double[]... data)
Stores data tables data into a String, with format understandable by GNUPlot.
static String toGNUPlot(XYSeriesCollection data)
Stores series collection data into a String, with format understandable by GNUPlot.
static double[][] fromCustomizedFormat(String betweenValues, String endLine, String data)
Parses data according to a user defined format and stores the extracted values in the returned table.
static String toCustomizedFormat(String heading, String footer, String betweenValues, String endLine, int precision, double[]... data)
Stores data tables data into a String with customized format.
static double[][] fromGNUPlot(String data)
Parses data according to the standard GNUPlot format and stores the extracted values in the returned ...
static double[][] fromCSV(String data)
Parses data according to the standard CSV format and stores the extracted values in the returned tabl...
static String toCustomizedFormat(String heading, String footer, String betweenValues, String endLine, int precision, XYSeriesCollection data)
Stores data tables data into a String with customized format from an XYSeriesCollection variable.