Index: packages/charted/lib/charts/src/chart_axis_impl.dart |
diff --git a/packages/charted/lib/charts/src/chart_axis_impl.dart b/packages/charted/lib/charts/src/chart_axis_impl.dart |
index 4a684b3f97b7a8dbb5d140730b7b364857538dfb..caf48eb4daf6762f7decc58fac3344b5b1f325c8 100644 |
--- a/packages/charted/lib/charts/src/chart_axis_impl.dart |
+++ b/packages/charted/lib/charts/src/chart_axis_impl.dart |
@@ -9,8 +9,10 @@ |
part of charted.charts; |
class DefaultChartAxisImpl { |
+ static const int _AXIS_TITLE_HEIGHT = 20; |
+ |
CartesianArea _area; |
- ChartAxisConfig _config; |
+ ChartAxisConfig config; |
ChartAxisTheme _theme; |
SvgAxisTicks _axisTicksPlacement; |
@@ -22,10 +24,11 @@ class DefaultChartAxisImpl { |
String _orientation; |
Scale _scale; |
SelectionScope _scope; |
+ String _title; |
MutableRect size; |
- DefaultChartAxisImpl.withAxisConfig(this._area, this._config); |
+ DefaultChartAxisImpl.withAxisConfig(this._area, this.config); |
DefaultChartAxisImpl(this._area); |
void initAxisDomain(int column, bool isDimension, Iterable domain) { |
@@ -44,10 +47,13 @@ class DefaultChartAxisImpl { |
: _area.theme.getMeasureAxisTheme(scale); |
// Sets the domain if not using a custom scale. |
- if (_config == null || (_config != null && _config.scale == null)) { |
+ if (config == null || (config != null && config.scale == null)) { |
scale.domain = domain; |
- scale.nice = !_isDimension; |
+ scale.nice = !_isDimension && |
+ !(config?.forcedTicksCount != null && config.forcedTicksCount > 0); |
} |
+ |
+ _title = config?.title; |
} |
void initAxisScale(Iterable range) { |
@@ -63,10 +69,20 @@ class DefaultChartAxisImpl { |
if (_area.config.isLeftAxisPrimary) { |
range = range.toList().reversed; |
} |
- (scale as OrdinalScale) |
- .rangeRoundBands(range, innerPadding, outerPadding); |
+ if (usingBands) { |
+ (scale as OrdinalScale) |
+ .rangeRoundBands(range, innerPadding, outerPadding); |
+ } else { |
+ (scale as OrdinalScale).rangePoints(range, outerPadding); |
+ } |
} else { |
- scale.range = range; |
+ if (_title != null) { |
+ var modifiedRange = range.take(range.length - 1).toList(); |
+ modifiedRange.add(range.last + _AXIS_TITLE_HEIGHT); |
+ scale.range = modifiedRange; |
+ } else { |
+ scale.range = range; |
+ } |
scale.ticksCount = _theme.axisTickCount; |
} |
} |
@@ -82,10 +98,15 @@ class DefaultChartAxisImpl { |
? new MutableRect.size(_theme.verticalAxisWidth, layout.width) |
: new MutableRect.size(layout.height, _theme.horizontalAxisHeight); |
+ if (config?.forcedTicksCount != null && config.forcedTicksCount > 0) { |
+ scale.forcedTicksCount = config.forcedTicksCount; |
+ } |
+ |
// Handle auto re-sizing of horizontal axis. |
- var ticks = (_config != null && !isNullOrEmpty(_config.tickValues)) |
- ? _config.tickValues |
+ var ticks = (config != null && !isNullOrEmpty(config.tickValues)) |
+ ? config.tickValues |
: scale.ticks, |
+ |
formatter = _columnSpec.formatter == null |
? scale.createTickFormatter() |
: _columnSpec.formatter, |
@@ -131,8 +152,8 @@ class DefaultChartAxisImpl { |
innerTickSize = _theme.axisTickSize <= ChartAxisTheme.FILL_RENDER_AREA |
? 0 - (_isVertical ? renderAreaRect.width : renderAreaRect.height) |
: _theme.axisTickSize, |
- tickValues = _config != null && !isNullOrEmpty(_config.tickValues) |
- ? _config.tickValues |
+ tickValues = config != null && !isNullOrEmpty(config.tickValues) |
+ ? config.tickValues |
: null; |
element.attributes['transform'] = 'translate(${rect.x}, ${rect.y})'; |
@@ -141,8 +162,21 @@ class DefaultChartAxisImpl { |
_axisTicksPlacement = new RotateHorizontalAxisTicks( |
rect, _theme.ticksFont, _theme.axisTickSize + _theme.axisTickPadding); |
} |
- |
initAxisScale(range); |
+ |
+ if (_title != null) { |
+ var label = element.querySelector('.chart-axis-label'); |
+ if (label != null) { |
+ label.text = _title; |
+ } else { |
+ var title = Namespace.createChildElement('text', element); |
+ title.attributes['text-anchor'] = 'middle'; |
+ title.text = _title; |
+ title.classes.add('chart-axis-label'); |
+ element.append(title); |
+ } |
+ } |
+ |
var axis = new SvgAxis( |
orientation: _orientation, |
innerTickSize: innerTickSize, |
@@ -160,11 +194,12 @@ class DefaultChartAxisImpl { |
// Scale passed through configuration takes precedence |
Scale get scale => |
- (_config != null && _config.scale != null) ? _config.scale : _scale; |
+ (config != null && config.scale != null) ? config.scale : _scale; |
set scale(Scale value) { |
_scale = value; |
} |
+ |
} |
class PrecomputedAxisTicks implements SvgAxisTicks { |