diff --git a/lib/chart/axis.ex b/lib/chart/axis.ex index 615fff7..0883e53 100644 --- a/lib/chart/axis.ex +++ b/lib/chart/axis.ex @@ -131,6 +131,17 @@ defmodule Contex.Axis do ] end + @doc """ + Draw the zero line for ensuring it's drawn even when zero + isn't aligned to the base of the graph. + """ + def get_zero_line_svg(%Axis{scale: scale} = axis) do + # Check that scale intersects zero by looking at domain + # If so... + domain_to_range_fn = Scale.domain_to_range_fn(scale) + get_svg_gridline(axis, domain_to_range_fn.(0.0)) + end + defp get_svg_gridlines(%Axis{scale: scale} = axis) do domain_ticks = Scale.ticks_domain(scale) domain_to_range_fn = Scale.domain_to_range_fn(scale) diff --git a/lib/chart/barchart.ex b/lib/chart/barchart.ex index a9f2209..16668c5 100644 --- a/lib/chart/barchart.ex +++ b/lib/chart/barchart.ex @@ -357,9 +357,12 @@ defmodule Contex.BarChart do val_axis_svg = if plot_options.show_val_axis, do: Axis.to_svg(value_axis), else: "" + zero_line = Axis.get_zero_line_svg(category_axis) + [ cat_axis_svg, val_axis_svg, + zero_line, "", get_svg_bars(plot), "" @@ -504,12 +507,12 @@ defmodule Contex.BarChart do end defp prepare_bar_values(series_values, scale, :grouped) do - {scale_min, _} = Scale.get_range(scale) + scale_zero = Scale.domain_to_range(scale, 0.0) results = Enum.reduce(series_values, [], fn data_val, points -> range_val = Scale.domain_to_range(scale, data_val) - [{scale_min, range_val} | points] + [{scale_zero, range_val} | points] end) Enum.reverse(results)