From 69f12aba9824439e951f8f19febc8b925efcebae Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Sun, 20 Sep 2020 09:14:04 +0200 Subject: [PATCH] prevent labels from overlapping --- .../api/BarChartAggregatorForIntervals.java | 25 ++++++++++++++++--- .../lucares/pdb/plot/api/BarChartHandler.java | 2 +- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/BarChartAggregatorForIntervals.java b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/BarChartAggregatorForIntervals.java index 2dba195..a444068 100644 --- a/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/BarChartAggregatorForIntervals.java +++ b/pdb-plotting/src/main/java/org/lucares/pdb/plot/api/BarChartAggregatorForIntervals.java @@ -8,6 +8,7 @@ import java.util.UUID; import java.util.concurrent.atomic.AtomicLong; import org.lucares.recommind.logs.GnuplotAxis; +import org.lucares.recommind.logs.GnuplotSettings; public class BarChartAggregatorForIntervals implements CustomAggregator, IndexedAggregator, BarChart { @@ -24,8 +25,11 @@ public class BarChartAggregatorForIntervals implements CustomAggregator, Indexed private int count; - public BarChartAggregatorForIntervals(final Interval interval) { - this.interval = interval; + private final PlotSettings settings; + + public BarChartAggregatorForIntervals(final PlotSettings settings) { + this.settings = settings; + this.interval = settings.getInterval().get(); buckets = interval.getBuckets(); } @@ -72,20 +76,35 @@ public class BarChartAggregatorForIntervals implements CustomAggregator, Indexed final StringBuilder csv = new StringBuilder(); final boolean isMiddleSeries = getIndex() == numberOfDataSeries / 2; + int i = 0; int offset = 0; for (final String bucketId : bucketIds()) { final long count = buckets.get(bucketId).get(); csv.append(String.format(Locale.US, "%f", offset + getIndex() * SPACE_BETWEEN_BARS + 0.5)); csv.append(","); - csv.append(renderLabels && isMiddleSeries ? bucketId : ""); + csv.append(renderLabels && isMiddleSeries && showLabel(i, buckets.size()) ? bucketId : ""); csv.append(","); csv.append(count); csv.append("\n"); offset += numberOfDataSeries; + i++; } return csv.toString(); } + private boolean showLabel(final int index, final int numberOfBuckets) { + final int width = settings.getWidth(); + final int widthInPx = width - GnuplotSettings.GNUPLOT_LEFT_RIGHT_MARGIN; + + final long maxLabels = Math.max(1, widthInPx / (GnuplotSettings.TICKS_FONT_SIZE * 8)); + + if (maxLabels >= numberOfBuckets) { + return true; + } else { + return index % (int) Math.ceil(numberOfBuckets / maxLabels) == 0; + } + } + private SortedSet bucketIds() { return new TreeSet<>(buckets.keySet()); 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 8779dad..8169917 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 @@ -82,7 +82,7 @@ public class BarChartHandler extends AggregateHandler { CustomAggregator createCustomAggregator(final Path tmpDir, final PlotSettings plotSettings, final long fromEpochMilli, final long toEpochMilli) { if (plotSettings.getInterval().isPresent()) { - return new BarChartAggregatorForIntervals(plotSettings.getInterval().get()); + return new BarChartAggregatorForIntervals(plotSettings); } else { return new BarChartAggregator(); }