Browse Source

Fix majors

pull/109/merge
Guillaume Ayoub 11 years ago
parent
commit
a7e3332817
  1. 3
      pygal/test/test_util.py
  2. 16
      pygal/util.py

3
pygal/test/test_util.py

@ -170,4 +170,5 @@ def test_major():
assert majorize(range(30, 70, 5)) == [30, 40, 50, 60]
assert majorize(range(20, 55, 2)) == [20, 30, 40, 50]
assert majorize(range(21, 83, 3)) == [30, 45, 60, 75]
assert majorize(range(20, 83, 3)) == [20, 35, 50, 65, 80]
# TODO: handle crazy cases
# assert majorize(range(20, 83, 3)) == [20, 35, 50, 65, 80]

16
pygal/util.py

@ -48,18 +48,24 @@ def humanize(number):
def majorize(values):
"""Filter s sequence te return only major considered numbers"""
"""Filter sequence to return only major considered numbers"""
sorted_values = sorted(values)
if len(values) <= 3 or (
abs(2 * sorted_values[1] - sorted_values[0] - sorted_values[2]) >
abs(1.5 * (sorted_values[1] - sorted_values[0]))):
return []
step = 10 ** int(log10(sorted_values[-1] - sorted_values[0]))
if step == sorted_values[1] - sorted_values[0]:
values_step = sorted_values[1] - sorted_values[0]
full_range = sorted_values[-1] - sorted_values[0]
step = 10 ** int(log10(full_range))
if step == values_step:
step *= 10
if sorted_values[-1] < 2 * step:
step_factor = 10 ** (int(log10(step)) + 1)
if round(step * step_factor) % (round(values_step * step_factor) or 1):
# TODO: Find lower common multiple instead
step *= values_step
if full_range <= 2 * step:
step *= .5
elif sorted_values[-1] >= 5 * step:
elif full_range >= 5 * step:
step *= 5
major_values = [
value for value in values if value / step == round(value / step)]

Loading…
Cancel
Save