From 3048f67e9a3468c317cc2c749fc92095a32a56a8 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Sat, 23 Nov 2019 19:12:23 +0100 Subject: [PATCH] cleanup --- .../lucares/recommind/logs/AxisSettings.java | 3 +- .../org/lucares/recommind/logs/AxisTime.java | 67 +++++++- .../recommind/logs/GnuplotFileGenerator.java | 154 ++++++------------ .../lucares/recommind/logs/XAxisTimeTics.java | 84 ---------- 4 files changed, 119 insertions(+), 189 deletions(-) delete mode 100644 pdb-plotting/src/main/java/org/lucares/recommind/logs/XAxisTimeTics.java diff --git a/pdb-plotting/src/main/java/org/lucares/recommind/logs/AxisSettings.java b/pdb-plotting/src/main/java/org/lucares/recommind/logs/AxisSettings.java index 74ce287..c80f2ed 100644 --- a/pdb-plotting/src/main/java/org/lucares/recommind/logs/AxisSettings.java +++ b/pdb-plotting/src/main/java/org/lucares/recommind/logs/AxisSettings.java @@ -33,7 +33,7 @@ public class AxisSettings { private boolean logscale; private List ticsLabels; - + public String getFormat() { return format; } @@ -121,6 +121,7 @@ public class AxisSettings { public List getTics() { return ticsLabels; } + public String toGnuplotDefinition(boolean renderLabels) { StringBuilder result = new StringBuilder(); diff --git a/pdb-plotting/src/main/java/org/lucares/recommind/logs/AxisTime.java b/pdb-plotting/src/main/java/org/lucares/recommind/logs/AxisTime.java index e5d741e..0a5f290 100644 --- a/pdb-plotting/src/main/java/org/lucares/recommind/logs/AxisTime.java +++ b/pdb-plotting/src/main/java/org/lucares/recommind/logs/AxisTime.java @@ -3,7 +3,10 @@ package org.lucares.recommind.logs; import java.time.OffsetDateTime; import java.time.temporal.ChronoUnit; import java.util.Collection; +import java.util.concurrent.TimeUnit; +import org.lucares.collections.LongList; +import org.lucares.pdb.api.DateTimeRange; import org.lucares.pdb.plot.api.AxisScale; import org.lucares.recommind.logs.AxisSettings.Type; @@ -30,7 +33,7 @@ public class AxisTime { result.setFormat(formatX); result.setFrom(formattedMinDate); result.setTo(formattedMaxDate); - result.setTicIncrement(XAxisTimeTics.computeTimeTicIncrement(settings.getWidth(), settings.getDateTimeRange())); + result.setTicIncrement(computeTimeTicIncrement(settings.getWidth(), settings.getDateTimeRange())); return result; } @@ -56,5 +59,67 @@ public class AxisTime { return result; } + + public static double computeTimeTicIncrement(int width, DateTimeRange dateTimeRange) { + final long startEpochMilli = dateTimeRange.getStartEpochMilli(); + final long endEpochMilli = dateTimeRange.getEndEpochMilli(); + final long rangeInMs = endEpochMilli - startEpochMilli + 1; + + int widthInPx = width - GnuplotSettings.GNUPLOT_LEFT_RIGHT_MARGIN; + + final long maxLabels = Math.max(1, widthInPx / (GnuplotSettings.TICKS_FONT_SIZE * 8)); + + final long tickIncrement = roundToTickIncrement(rangeInMs / maxLabels); + return tickIncrement/1000.0; + } + private static long roundToTickIncrement(long milliseconds) { + LongList increments = LongList.of( + 100, + 200, + 500, + TimeUnit.SECONDS.toMillis(1), + TimeUnit.SECONDS.toMillis(2), + TimeUnit.SECONDS.toMillis(5), + TimeUnit.SECONDS.toMillis(10), + TimeUnit.SECONDS.toMillis(15), + TimeUnit.SECONDS.toMillis(30), + TimeUnit.MINUTES.toMillis(1), + TimeUnit.MINUTES.toMillis(2), + TimeUnit.MINUTES.toMillis(5), + TimeUnit.MINUTES.toMillis(10), + TimeUnit.MINUTES.toMillis(15), + TimeUnit.MINUTES.toMillis(30), + TimeUnit.HOURS.toMillis(1), + TimeUnit.HOURS.toMillis(2), + TimeUnit.HOURS.toMillis(3), + TimeUnit.HOURS.toMillis(6), + TimeUnit.HOURS.toMillis(12), + TimeUnit.HOURS.toMillis(18), + TimeUnit.DAYS.toMillis(1), + TimeUnit.DAYS.toMillis(2), + TimeUnit.DAYS.toMillis(3), + TimeUnit.DAYS.toMillis(4), + TimeUnit.DAYS.toMillis(5), + TimeUnit.DAYS.toMillis(6), + TimeUnit.DAYS.toMillis(7), + TimeUnit.DAYS.toMillis(14), + TimeUnit.DAYS.toMillis(30), + TimeUnit.DAYS.toMillis(90), + TimeUnit.DAYS.toMillis(180), + TimeUnit.DAYS.toMillis(365), + TimeUnit.DAYS.toMillis(365*2), + TimeUnit.DAYS.toMillis(365*5), + TimeUnit.DAYS.toMillis(365*10), + TimeUnit.DAYS.toMillis(365*20) + ); + + for ( int i = 0; i < increments.size(); i++) { + if (increments.get(i) > milliseconds) { + return increments.get(i); + } + } + + return TimeUnit.DAYS.toMillis(365*10); + } } 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 1366544..63e0778 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 @@ -7,126 +7,74 @@ import org.lucares.pdb.plot.api.Appender; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class GnuplotFileGenerator implements Appender{ +public class GnuplotFileGenerator implements Appender { private static final Logger LOGGER = LoggerFactory.getLogger(GnuplotFileGenerator.class); - - private static final int KEY_FONT_SIZE = 10; - public String generate(final GnuplotSettings settings, final Collection dataSeries) { + private static final int KEY_FONT_SIZE = 10; - final StringBuilder result = new StringBuilder(); + public String generate(final GnuplotSettings settings, final Collection dataSeries) { - appendfln(result, "set terminal %s noenhanced size %d,%d", settings.getTerminal(), settings.getWidth(), - settings.getHeight()); + final StringBuilder result = new StringBuilder(); - appendfln(result, "set datafile separator \"%s\"", settings.getDatafileSeparator()); - appendfln(result, "set timefmt '%s'", settings.getTimefmt()); + appendfln(result, "set terminal %s noenhanced size %d,%d", settings.getTerminal(), settings.getWidth(), + settings.getHeight()); - //settings.getAggregates().addGnuplotDefinitions(result, dataSeries); - - - - final List xAxisDefinitions = settings.getAggregates().getXAxisDefinitions(settings, dataSeries); - for (AxisSettings axisSettings : xAxisDefinitions) { - appendln(result, axisSettings.toGnuplotDefinition(settings.isRenderLabels())); - } + appendfln(result, "set datafile separator \"%s\"", settings.getDatafileSeparator()); + appendfln(result, "set timefmt '%s'", settings.getTimefmt()); - final List yAxisDefinitions = settings.getAggregates().getYAxisDefinitions(settings, dataSeries); - if(dataSeries.isEmpty()) { - // If there is no data, then Gnuplot won't generate an image. - // Workaround is to explicitly specify the y-axis range. - // We choose a range for which no ticks are defined. This creates an empty y-axis. - yAxisDefinitions.forEach(s -> s.setFrom("0")); - yAxisDefinitions.forEach(s -> s.setFrom("-1")); - } - for (AxisSettings axisSettings : yAxisDefinitions) { - appendln(result, axisSettings.toGnuplotDefinition(settings.isRenderLabels())); - } - + final List xAxisDefinitions = settings.getAggregates().getXAxisDefinitions(settings, dataSeries); + for (AxisSettings axisSettings : xAxisDefinitions) { + appendln(result, axisSettings.toGnuplotDefinition(settings.isRenderLabels())); + } -// final XAxisSettings xAxis = settings.getxAxisSettings(); -// if (xAxis.getType() == Type.Time) { -// appendfln(result, "set xdata time"); -// appendln(result, XAxisTimeTics.computeXTimeIncrements(settings)); -// appendfln(result, "set format x \"%s\"", xAxis.getFormat()); -// } -// appendfln(result, "set xtics nomirror rotate by %d", xAxis.getRotateXAxisLabel()); -// appendfln(result, "set xlabel \"%s\"", xAxis.getLabel()); -// appendfln(result, "set xrange [\"%s\":\"%s\"]", xAxis.getFrom(), xAxis.getTo()); + final List yAxisDefinitions = settings.getAggregates().getYAxisDefinitions(settings, dataSeries); + if (dataSeries.isEmpty()) { + // If there is no data, then Gnuplot won't generate an image. + // Workaround is to explicitly specify the y-axis range. + // We choose a range for which no ticks are defined. This creates an empty + // y-axis. + yAxisDefinitions.forEach(s -> s.setFrom("0")); + yAxisDefinitions.forEach(s -> s.setFrom("-1")); + } + for (AxisSettings axisSettings : yAxisDefinitions) { + appendln(result, axisSettings.toGnuplotDefinition(settings.isRenderLabels())); + } -// final int graphOffset = settings.getYAxisScale() == AxisScale.LINEAR ? 0 : 1; -// if (settings.hasYRange()) { -// final int min = Math.max(settings.getYRangeMin(), graphOffset); -// final int max = settings.getYRangeMax(); -// appendfln(result, String.format("set yrange [\"%d\":\"%d\"]", min, max)); -// } else if(dataSeries.isEmpty()) { -// // If there is no data, then Gnuplot won't generate an image. -// // Workaround is to explicitly specify the y-axis range. -// // We choose a range for which no ticks are defined. This creates an empty y-axis. -// appendfln(result, "set yrange [\"%d\":\"%d\"]", 0, -1); -// }else { -// appendfln(result, "set yrange [\"" + graphOffset + "\":]"); -// } -// -// switch (settings.getYAxisScale()) { -// case LINEAR: -// break; -// case LOG10: -// appendfln(result, "set logscale y"); -// break; -// } + appendfln(result, "set grid"); + appendfln(result, "set output \"%s\"", settings.getOutput().toAbsolutePath().toString().replace("\\", "/")); - appendfln(result, "set grid"); - appendfln(result, "set output \"%s\"", settings.getOutput().toAbsolutePath().toString().replace("\\", "/")); + appendfln(result, "set key font \",%d\"", KEY_FONT_SIZE); + appendfln(result, "set tics font \",%d\"", GnuplotSettings.TICKS_FONT_SIZE); - if (settings.isKeyOutside()) { - appendfln(result, "set key outside"); - } - appendfln(result, "set key font \",%d\"", KEY_FONT_SIZE); + if (!settings.isRenderLabels()) { - if (!settings.isRenderLabels()) { -// appendfln(result, "set format x \"\""); -// appendfln(result, "set xlabel \"\""); -// appendfln(result, "set x2label \"\""); -// appendln(result, "set format x2 \"\""); -// -// appendfln(result, "set ylabel \"\""); -// appendln(result, "set format y \"\""); -// appendln(result, "set y2label \"\""); -// appendln(result, "set format y2 \"\""); + appendln(result, "set nokey"); + } else { + if (settings.isKeyOutside()) { + appendfln(result, "set key outside"); + } else { - appendln(result, "set nokey"); - } else if (!settings.isKeyOutside()) { - // make sure left and right margins are always the same - // this is need to be able to zoom in by selecting a region - // (horizontal: 1 unit = 10px; vertical: 1 unit = 19px) - appendln(result, "set lmargin 11"); // margin 11 -> 110px - appendln(result, "set rmargin 11"); // margin 11 -> 110px - appendln(result, "set tmargin 3"); // margin 3 -> 57px - marker (1) - appendln(result, "set bmargin 4"); // margin 4 -> 76 + // make sure left and right margins are always the same + // this is need to be able to zoom in by selecting a region + // (horizontal: 1 unit = 10px; vertical: 1 unit = 19px) + appendln(result, "set lmargin 11"); // margin 11 -> 110px + appendln(result, "set rmargin 11"); // margin 11 -> 110px + appendln(result, "set tmargin 3"); // margin 3 -> 57px - marker (1) + appendln(result, "set bmargin 4"); // margin 4 -> 76 + } + } - appendfln(result, "set tics font \",%d\"", GnuplotSettings.TICKS_FONT_SIZE); - //appendln(result, YAxisTicks.computeYTicks(settings, dataSeries)); - } else { - appendfln(result, "set tics font \",%d\"", GnuplotSettings.TICKS_FONT_SIZE); - //appendln(result, YAxisTicks.computeYTicks(settings, dataSeries)); - } + appendf(result, "plot "); - appendf(result, "plot "); + settings.getAggregates().addPlots(result, dataSeries); - settings.getAggregates().addPlots(result, dataSeries); - - // Add a plot outside of the visible range. Without this gnuplot would not - // render images when there are not data points on it. - appendf(result, "-1 with lines notitle"); - - LOGGER.info("{}", result); - - return result.toString(); - } + // Add a plot outside of the visible range. Without this gnuplot would not + // render images when there are not data points on it. + appendf(result, "-1 with lines notitle"); + LOGGER.info("{}", result); - - + return result.toString(); + } } diff --git a/pdb-plotting/src/main/java/org/lucares/recommind/logs/XAxisTimeTics.java b/pdb-plotting/src/main/java/org/lucares/recommind/logs/XAxisTimeTics.java deleted file mode 100644 index 7864432..0000000 --- a/pdb-plotting/src/main/java/org/lucares/recommind/logs/XAxisTimeTics.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.lucares.recommind.logs; - -import java.util.concurrent.TimeUnit; - -import org.lucares.collections.LongList; -import org.lucares.pdb.api.DateTimeRange; - -public class XAxisTimeTics { - - public static String computeXTimeIncrements(GnuplotSettings settings) { - DateTimeRange dateTimeRange = settings.getDateTimeRange(); - return computeXTimeIncrements(settings.getWidth(), dateTimeRange); - } - - public static String computeXTimeIncrements(int width, DateTimeRange dateTimeRange) { - - final double ticIncrement = computeTimeTicIncrement(width, dateTimeRange); - - return "set xtics "+ ticIncrement; - } - - public static double computeTimeTicIncrement(int width, DateTimeRange dateTimeRange) { - final long startEpochMilli = dateTimeRange.getStartEpochMilli(); - final long endEpochMilli = dateTimeRange.getEndEpochMilli(); - final long rangeInMs = endEpochMilli - startEpochMilli + 1; - - int widthInPx = width - GnuplotSettings.GNUPLOT_LEFT_RIGHT_MARGIN; - - final long maxLabels = Math.max(1, widthInPx / (GnuplotSettings.TICKS_FONT_SIZE * 8)); - - final long tickIncrement = roundToTickIncrement(rangeInMs / maxLabels); - return tickIncrement/1000.0; - } - - private static long roundToTickIncrement(long milliseconds) { - LongList increments = LongList.of( - 100, - 200, - 500, - TimeUnit.SECONDS.toMillis(1), - TimeUnit.SECONDS.toMillis(2), - TimeUnit.SECONDS.toMillis(5), - TimeUnit.SECONDS.toMillis(10), - TimeUnit.SECONDS.toMillis(15), - TimeUnit.SECONDS.toMillis(30), - TimeUnit.MINUTES.toMillis(1), - TimeUnit.MINUTES.toMillis(2), - TimeUnit.MINUTES.toMillis(5), - TimeUnit.MINUTES.toMillis(10), - TimeUnit.MINUTES.toMillis(15), - TimeUnit.MINUTES.toMillis(30), - TimeUnit.HOURS.toMillis(1), - TimeUnit.HOURS.toMillis(2), - TimeUnit.HOURS.toMillis(3), - TimeUnit.HOURS.toMillis(6), - TimeUnit.HOURS.toMillis(12), - TimeUnit.HOURS.toMillis(18), - TimeUnit.DAYS.toMillis(1), - TimeUnit.DAYS.toMillis(2), - TimeUnit.DAYS.toMillis(3), - TimeUnit.DAYS.toMillis(4), - TimeUnit.DAYS.toMillis(5), - TimeUnit.DAYS.toMillis(6), - TimeUnit.DAYS.toMillis(7), - TimeUnit.DAYS.toMillis(14), - TimeUnit.DAYS.toMillis(30), - TimeUnit.DAYS.toMillis(90), - TimeUnit.DAYS.toMillis(180), - TimeUnit.DAYS.toMillis(365), - TimeUnit.DAYS.toMillis(365*2), - TimeUnit.DAYS.toMillis(365*5), - TimeUnit.DAYS.toMillis(365*10), - TimeUnit.DAYS.toMillis(365*20) - ); - - for ( int i = 0; i < increments.size(); i++) { - if (increments.get(i) > milliseconds) { - return increments.get(i); - } - } - - return TimeUnit.DAYS.toMillis(365*10); - } -}