drawDataPoints method
void
drawDataPoints(
)
override
Implementation
@override
void drawDataPoints() {
clearPoints();
var minY = getLabelMinY();
var maxY = getLabelMaxY();
var totalBarWidth = barWidth;
var barMinPxX = gridMinPxX;
var barMaxPxX = gridMaxPxX;
if (maxLabelWidthX > barWidth) {
barMinPxX = gridMinPxX + max(0, (maxLabelWidthX - barWidth)/2);
barMaxPxX = gridMaxPxX - max(0, (maxLabelWidthX - barWidth)/2);
}
var barIndex = 0;
var spaceX = (barMaxPxX - (barWidth * _dataPoints.length) - barMinPxX) / (_dataPoints.length - 1);
var alignmentOffsetX = 0.0;
if (_dataPoints.length == 1) { // Start to draw from the center
alignmentOffsetX = (barMaxPxX - barMinPxX - totalBarWidth)/2 - barMinPxX - totalBarWidth/2;
spaceX = 0;
}
List<String> rects = [];
for (var x in keys) {
if (_dataPoints[x] == null) continue;
var mapPoints = Map<String, double?>.from(_dataPoints[x]!);
// Clamp all values to avoid charts going overly high
double total = minY;
for (var graphName in barLabels) {
if (_activeGraphs.isNotEmpty && !_activeGraphs.contains(graphName)) {
mapPoints.remove(graphName);
continue;
}
var y = mapPoints[graphName];
if (y == null) continue;
if (y < minY) mapPoints[graphName] = minY;
if (y > maxY) mapPoints[graphName] = maxY;
// chart is overflowing
if (total + y > maxY) {
if (total < maxY) {
mapPoints[graphName] = maxY - total;
} else {
mapPoints.remove(graphName);
}
}
total = total + y;
}
double? startY;
for (var graphName in mapPoints.keys) {
var y = mapPoints[graphName];
if (y == null) {
continue;
}
var offset = barWidth * barIndex + spaceX * barIndex + alignmentOffsetX;
var pxY = lerp(y, minY, maxY, gridMaxPxY, gridMinPxY);
var heightY = gridMaxPxY - pxY;
if (startY == null) {
startY = pxY;
heightY = gridMaxPxY - pxY;
} else {
heightY = gridMaxPxY - pxY;
startY = startY - heightY;
}
var fill = chartFillStyle[graphName] ?? chartFillStyle[keyAllGraph]!;
var rect = '<rect x="${barMinPxX + offset}" y="$startY" width="$barWidth" height="$heightY" fill="$fill" />';
rects.add(rect);
}
barIndex++;
}
_pointsElem.insertAdjacentHTML('beforeend', rects.join().toJS);
}