perf: format dashboard y-axis ticks as percentages

Change-Id: Ia575f7880cef63a66bfeff5d8d613df0b010244e
Reviewed-on: https://go-review.googlesource.com/c/build/+/412375
Reviewed-by: Michael Pratt <mpratt@google.com>
diff --git a/perf/app/dashboard.go b/perf/app/dashboard.go
index e6bcedd..3e37317 100644
--- a/perf/app/dashboard.go
+++ b/perf/app/dashboard.go
@@ -112,9 +112,9 @@
 		b.Values = append(b.Values, ValueJSON{
 			CommitDate: rec.Time(),
 			CommitHash: commit,
-			Low:        (low - 1) * 100,
-			Center:     (center - 1) * 100,
-			High:       (high - 1) * 100,
+			Low:        low - 1,
+			Center:     center - 1,
+			High:       high - 1,
 		})
 	}
 
diff --git a/third_party/bandchart/bandchart.js b/third_party/bandchart/bandchart.js
index fdffc91..00f41eb 100644
--- a/third_party/bandchart/bandchart.js
+++ b/third_party/bandchart/bandchart.js
@@ -28,7 +28,7 @@
 	// Compute default domains.
 	let yDomain = d3.nice(...d3.extent([...Y1, ...Y2]), 10);
 	// Don't show <2.5% up-close because it just looks extremely noisy.
-	const minYDomain = [-2.5, 2.5];
+	const minYDomain = [-0.025, 0.025];
 	if (yDomain[0] > minYDomain[0]) {
 		yDomain[0] = minYDomain[0];
 	}
@@ -42,7 +42,7 @@
 	const xScale = d3.scaleOrdinal(X, xOrdTicks);
 	const yScale = d3.scaleLinear(yDomain, yRange);
 	const xAxis = d3.axisBottom(xScale).tickSizeOuter(0).tickValues(d3.map(C, c => c.slice(0, 7)));
-	const yAxis = d3.axisLeft(yScale).ticks(height / 40);
+	const yAxis = d3.axisLeft(yScale).ticks(height / 40, "+%");
 
 	const svg = d3.create("svg")
 		.attr("width", width)
@@ -68,7 +68,7 @@
 
 	const defs = svg.append("defs")
 
-	const maxHalfColorPercent = 10;
+	const maxHalfColorValue = 0.10;
 	const maxHalfColorOpacity = 0.25;
 
 	// Draw top half.
@@ -103,10 +103,10 @@
 		.style("stop-opacity", 0);
 	let topGStopOpacity = maxHalfColorOpacity;
 	let topGOffsetPercent = 100.0;
-	if (yDomain[1] > maxHalfColorPercent) {
-		topGOffsetPercent *= maxHalfColorPercent/yDomain[1];
+	if (yDomain[1] > maxHalfColorValue) {
+		topGOffsetPercent *= maxHalfColorValue/yDomain[1];
 	} else {
-		topGStopOpacity *= yDomain[1]/maxHalfColorPercent;
+		topGStopOpacity *= yDomain[1]/maxHalfColorValue;
 	}
 	topGradient.append("stop")
 		.attr("offset", topGOffsetPercent+"%")
@@ -125,10 +125,10 @@
 		.style("stop-opacity", 0);
 	let bottomGStopOpacity = maxHalfColorOpacity;
 	let bottomGOffsetPercent = 100.0;
-	if (yDomain[0] < -maxHalfColorPercent) {
-		bottomGOffsetPercent *= -maxHalfColorPercent/yDomain[0];
+	if (yDomain[0] < -maxHalfColorValue) {
+		bottomGOffsetPercent *= -maxHalfColorValue/yDomain[0];
 	} else {
-		bottomGStopOpacity *= -yDomain[0]/maxHalfColorPercent;
+		bottomGStopOpacity *= -yDomain[0]/maxHalfColorValue;
 	}
 	bottomGradient.append("stop")
 		.attr("offset", bottomGOffsetPercent+"%")