From 459c659f859a6019ae02a19baed70df886f0a720 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Sun, 19 Jan 2020 13:15:44 +0100 Subject: [PATCH] use inline data for bar charts Bar charts only need very little data. There is no need to create a file for two numbers. --- .../pdb/plot/api/AggregateHandler.java | 7 +++-- .../plot/api/AggregateHandlerCollection.java | 14 ++++++++- .../org/lucares/pdb/plot/api/Appender.java | 4 +++ .../pdb/plot/api/BarChartAggregator.java | 30 +++++++++++++------ .../lucares/pdb/plot/api/BarChartHandler.java | 20 +++++++++---- .../api/CumulativeDistributionHandler.java | 5 ++-- .../pdb/plot/api/HistogramHandler.java | 5 ++-- .../plot/api/ParallelRequestsAggregate.java | 5 ++-- .../pdb/plot/api/ScatterAggregateHandler.java | 5 ++-- .../recommind/logs/GnuplotFileGenerator.java | 2 -- 10 files changed, 66 insertions(+), 31 deletions(-) diff --git a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/AggregateHandler.java b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/AggregateHandler.java index e075f0a..d084c5e 100644 --- a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/AggregateHandler.java +++ b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/AggregateHandler.java @@ -52,12 +52,15 @@ public abstract class AggregateHandler implements Appender { abstract AxisSettings createYAxisSettings(GnuplotSettings settings, Collection dataSeries); - abstract void addPlot(StringBuilder result, CustomAggregator aggregator, LineStyle lineStyle, - Optional title); + abstract String addPlot(CustomAggregator aggregator, LineStyle lineStyle, Optional title); abstract CustomAggregator createCustomAggregator(Path tmpDir, PlotSettings plotSettings, long fromEpochMilli, long toEpochMilli); + String beforePlot(final CustomAggregator aggregator) { + return ""; + } + protected String gnuplotTitle(final Optional title) { return title.isPresent() ? "title '" + title.get() + "'" : "notitle"; diff --git a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/AggregateHandlerCollection.java b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/AggregateHandlerCollection.java index d644746..35af671 100644 --- a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/AggregateHandlerCollection.java +++ b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/AggregateHandlerCollection.java @@ -95,6 +95,9 @@ public class AggregateHandlerCollection { public void addPlots(final StringBuilder result, final Collection dataSeries) { + final StringBuilder plots = new StringBuilder(); + final StringBuilder beforePlots = new StringBuilder(); + boolean first = true; final List handlersInPlottingOrder = CollectionUtils.copySort(aggregateHandlers, PLOTTING_ORDER); @@ -113,11 +116,20 @@ public class AggregateHandlerCollection { index++; } - handler.addPlot(result, aggregator, dataSerie.getStyle(), title); + final String beforePlot = handler.beforePlot(aggregator); + beforePlots.append(beforePlot); + + final String plot = handler.addPlot(aggregator, dataSerie.getStyle(), title); + plots.append(plot); } } first = false; } + + result.append(beforePlots); + result.append("\n"); + result.append("plot "); + result.append(plots); } } diff --git a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/Appender.java b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/Appender.java index 9ab0a44..66ec69d 100644 --- a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/Appender.java +++ b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/Appender.java @@ -15,4 +15,8 @@ public interface Appender { builder.append(String.format(Locale.US, format, args)); } + default String formatln(final String format, final Object... args) { + return String.format(Locale.US, format + "\n", args); + } + } diff --git a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/BarChartAggregator.java b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/BarChartAggregator.java index 73992a5..ffd56c3 100644 --- a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/BarChartAggregator.java +++ b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/BarChartAggregator.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; +import java.util.UUID; import org.lucares.pdb.api.RuntimeIOException; @@ -16,6 +17,8 @@ public class BarChartAggregator implements CustomAggregator, IndexedAggregator { private Long index = null; + private final String dataName = "$data" + UUID.randomUUID().toString().replace("-", ""); + public BarChartAggregator(final Path tmpDir) { super(); this.tmpDir = tmpDir; @@ -39,21 +42,25 @@ public class BarChartAggregator implements CustomAggregator, IndexedAggregator { count++; } + public String asCsv() { + final StringBuilder csv = new StringBuilder(); + + csv.append(index + 0.5); + csv.append(","); + csv.append(""); + csv.append(","); + csv.append(count); + return csv.toString(); + } + @Override public AggregatedData getAggregatedData() { try { final File dataFile = File.createTempFile("bar", ".dat", tmpDir.toFile()); - final StringBuilder csv = new StringBuilder(); + final String csv = asCsv(); - csv.append(index + 0.5); - csv.append(","); - csv.append(""); - csv.append(","); - csv.append(count); - csv.append("\n"); - - Files.writeString(dataFile.toPath(), csv.toString(), StandardCharsets.UTF_8); + Files.writeString(dataFile.toPath(), csv, StandardCharsets.UTF_8); final AggregatedData result = new AggregatedData("label", dataFile); return result; } catch (final IOException e) { @@ -66,4 +73,9 @@ public class BarChartAggregator implements CustomAggregator, IndexedAggregator { return Aggregate.BAR; } + public String getDataName() { + + return dataName; + } + } diff --git a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/BarChartHandler.java b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/BarChartHandler.java index addd380..ba958aa 100644 --- a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/BarChartHandler.java +++ b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/BarChartHandler.java @@ -68,19 +68,29 @@ public class BarChartHandler extends AggregateHandler { } @Override - void addPlot(final StringBuilder result, final CustomAggregator aggregator, final LineStyle lineStyle, - final Optional title) { + String beforePlot(final CustomAggregator aggregator) { + final StringBuilder result = new StringBuilder(); - final AggregatedData aggregatedData = aggregator.getAggregatedData(); + final BarChartAggregator barAggregator = (BarChartAggregator) aggregator; + appendfln(result, "%s < title) { + + final BarChartAggregator barAggregator = (BarChartAggregator) aggregator; /* * appendfln(result, * "'%s' using 1:3:xtic(2) notitle with %s axes %s fs solid %s, \\", // * aggregatedData.getDataFile(), // GnuplotLineType.Bar, // gnuplotXYAxis(), // * lineStyle// ); */ - appendfln(result, "'%s' using 1:3:xtic(2) %s with %s axes %s fs solid %s, \\", // - aggregatedData.getDataFile(), // + return formatln("'%s' using 1:3:xtic(2) %s with %s axes %s fs solid %s, \\", // + barAggregator.getDataName(), // gnuplotTitle(title), // GnuplotLineType.Bar, // gnuplotXYAxis(), // diff --git a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/CumulativeDistributionHandler.java b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/CumulativeDistributionHandler.java index d61ce77..57ce13d 100644 --- a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/CumulativeDistributionHandler.java +++ b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/CumulativeDistributionHandler.java @@ -69,12 +69,11 @@ public class CumulativeDistributionHandler extends AggregateHandler { } @Override - public void addPlot(final StringBuilder result, final CustomAggregator aggregator, final LineStyle lineStyle, - final Optional title) { + public String addPlot(final CustomAggregator aggregator, final LineStyle lineStyle, final Optional title) { final AggregatedData aggregatedData = aggregator.getAggregatedData(); - appendfln(result, "'%s' using 1:2 %s with lines axes %s lw 2 %s, \\", // + return formatln("'%s' using 1:2 %s with lines axes %s lw 2 %s, \\", // aggregatedData.getDataFile().getAbsolutePath(), // gnuplotTitle(title), // gnuplotXYAxis(), // diff --git a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/HistogramHandler.java b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/HistogramHandler.java index 0e0ac6a..2b2a3e4 100644 --- a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/HistogramHandler.java +++ b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/HistogramHandler.java @@ -54,11 +54,10 @@ public class HistogramHandler extends AggregateHandler { } @Override - void addPlot(final StringBuilder result, final CustomAggregator aggregator, final LineStyle lineStyle, - final Optional title) { + String addPlot(final CustomAggregator aggregator, final LineStyle lineStyle, final Optional title) { final AggregatedData aggregatedData = aggregator.getAggregatedData(); - appendfln(result, "'%s' using 1:2 %s with boxes axes %s lw 1 %s, \\", // + return formatln("'%s' using 1:2 %s with boxes axes %s lw 1 %s, \\", // aggregatedData.getDataFile().getAbsolutePath(), // gnuplotTitle(title), // gnuplotXYAxis(), // diff --git a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/ParallelRequestsAggregate.java b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/ParallelRequestsAggregate.java index a450ae7..03591da 100644 --- a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/ParallelRequestsAggregate.java +++ b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/ParallelRequestsAggregate.java @@ -48,10 +48,9 @@ public class ParallelRequestsAggregate extends AggregateHandler { } @Override - public void addPlot(final StringBuilder result, final CustomAggregator aggregator, final LineStyle lineStyle, - final Optional title) { + public String addPlot(final CustomAggregator aggregator, final LineStyle lineStyle, final Optional title) { final AggregatedData aggregatedData = aggregator.getAggregatedData(); - appendfln(result, "'%s' using 1:2 %s with filledcurve axes %s lw 1 %s, \\", // + return formatln("'%s' using 1:2 %s with filledcurve axes %s lw 1 %s, \\", // aggregatedData.getDataFile().getAbsolutePath(), // gnuplotTitle(title), // gnuplotXYAxis(), // diff --git a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/ScatterAggregateHandler.java b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/ScatterAggregateHandler.java index 4a827c5..1cd37e3 100644 --- a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/ScatterAggregateHandler.java +++ b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/ScatterAggregateHandler.java @@ -44,11 +44,10 @@ public class ScatterAggregateHandler extends AggregateHandler { } @Override - public void addPlot(final StringBuilder result, final CustomAggregator aggregator, final LineStyle lineStyle, - final Optional title) { + public String addPlot(final CustomAggregator aggregator, final LineStyle lineStyle, final Optional title) { final AggregatedData aggregatedData = aggregator.getAggregatedData(); - appendfln(result, "'%s' using 1:2 %s with %s axes %s %s, \\", // + return formatln("'%s' using 1:2 %s with %s axes %s %s, \\", // aggregatedData.getDataFile(), // gnuplotTitle(title), // GnuplotLineType.Points, // diff --git a/pdb-plotting/src/main/java/org/lucares/recommind/logs/GnuplotFileGenerator.java b/pdb-plotting/src/main/java/org/lucares/recommind/logs/GnuplotFileGenerator.java index 3decd37..64d0ff3 100644 --- a/pdb-plotting/src/main/java/org/lucares/recommind/logs/GnuplotFileGenerator.java +++ b/pdb-plotting/src/main/java/org/lucares/recommind/logs/GnuplotFileGenerator.java @@ -67,8 +67,6 @@ public class GnuplotFileGenerator implements Appender { // appendfln(result, "set xrange [-1:1]"); appendfln(result, "set boxwidth 0.5"); - appendf(result, "plot "); - settings.getAggregates().addPlots(result, dataSeries); // Add a plot outside of the visible range. Without this gnuplot would not