forwarded 359943 http://rt.cpan.org/Public/Bug/Display.html?id=18502 tags 359943 patch thanks
On Sun, Mar 26, 2006 at 08:40:06PM +0200, Bill Allombert wrote: > You get 200 Y ticks (which are unreadable) disregarding the max_y_ticks of > 6. If you remove integer_ticks_only, you get just 3 ticks. Hi, the attached patch should fix this. I have forwarded it upstream as well, as CPAN #18502 ,<http://rt.cpan.org/Public/Bug/Display.html?id=18502>. In the case of max_y_ticks, if the result would go over that, the tick interval is increased. This will override 'skip_int_ticks', if needed. In the case of min_y_ticks, if the result is below that, first the tick interval is decreased (overriding 'skip_int_ticks', if needed). If that doesn't help, the range of the scale is increased by either increasing the maximum value or decreasing the minimum value. If both are fixed, there's nothing to be done. I'm going to wait a while to see what upstream thinks about this before including the patch in the Debian packaging. Please try the patch and tell me if it works for you. Cheers, -- Niko Tyni [EMAIL PROTECTED]
--- libchart-perl-2.4.1-3/Chart/Base.pm 2006-04-02 22:19:29.000000000 +0300 +++ libchart-perl-2.4.1-4/Chart/Base.pm 2006-04-02 22:06:17.974305320 +0300 @@ -1911,6 +1911,42 @@ $tickInterval = $skip; $tickCount = ($p_max - $p_min ) / $skip + 1; + # Honor max_y_ticks, even if that means overriding skip_int_ticks. + if ($tickCount > $self->{'max_y_ticks'}) { + $tickInterval = ($p_max - $p_min) / ($self->{'max_y_ticks'} - 1); + $tickInterval = 1 + int($tickInterval) + if $tickInterval != int($tickInterval); + $tickCount = int(($p_max - $p_min ) / $tickInterval + 1); + } + + # Honor min_y_ticks if we can, first by reducing tick interval + # (even if that means overriding skip_int_ticks) + # and then by increasing the range if allowed. + if ($tickCount < $self->{'min_y_ticks'}) { + $tickInterval = ($p_max - $p_min) / ($self->{'min_y_ticks'} - 1); + $tickInterval = 1 + int($tickInterval) + if $tickInterval != int($tickInterval); + $tickCount = int(($p_max - $p_min ) / $tickInterval + 1); + + if ($tickCount < $self->{'min_y_ticks'} && + (!$f_max || !$f_min)) { + # Reducing interval didn't work, we have to increase the range. + # Just don't do it if both min_val and max_val were specified. + + my $minRange = $tickInterval * ($self->{'min_y_ticks'} - 1); + if (!$f_max) { + $d_max = $d_min + $minRange; + $p_max = $self->_round2Tick($d_max, 1, 1); + } elsif (!$f_min) { + $d_min = $d_max - $minRange; + $p_min = $self->_round2Tick($d_min, 1, -1); + } + $tickInterval = ($p_max - $p_min) / ($self->{'min_y_ticks'} - 1); + $tickInterval = 1 + int($tickInterval) + if $tickInterval != int($tickInterval); + $tickCount = int(($p_max - $p_min ) / $tickInterval + 1); + } + } # Now sort out an array of tick labels.