Take the 2-minute tour ×

I have an array with a few elements:

MSN = 34.3433423432434%

Chrome = 12.4343434353534%

Gtalk = 32.23233543543532% ...

And I'm passing this array as y-axis labels to use with a module called GD::Graph. The problem I am facing right now, is that the number are so big on the graph that they overlap with the adjacent entry and make it unreadable.

Is there a way where I can round off ALL the elements in an array to just 2 decimal places? And make it xx.xx%?

Also, anyone familar with using GD::Graph, do you know how can I increase the text-size on the graph? I can increase Title / Legend size fine, but the actual text as in 'Gtalk' or '32.23233543543532%' is really small and I've tried a lot of the commands from http://search.cpan.org/dist/GDGraph/Graph.pm, but they don't seem to work for me!

share|improve this question
These are two unrelated questions which you should have asked separately. –  Sinan Ünür Oct 21 '10 at 21:32
I'll keep that in mind for next time. New to StackOverflow! Amazing concept though, I wish I'd heard of this earlier .. –  c0d3rs Oct 22 '10 at 13:23

2 Answers 2

up vote 4 down vote accepted

use strict; use warnings;
use YAML;

my %x = (
    MSN => '34.3433423432434%',
    Chrome => '12.4343434353534%',
    Gtalk => '32.23233543543532%',

for my $x ( values %x ) {
    $x =~ s/^(\d+\.\d+)%\z/ sprintf '%.2f%%', $1/e;

print Dump \%x;


Chrome: 12.43%
Gtalk: 32.23%
MSN: 34.34%

If you want to extract values in a specific order, use a hash slice:

print "@x{ qw( MSN Chrome Gtalk ) }\n";

or, if you just want keys and values to line up in the plot call:

my $gd = $graph->plot([
    [ keys %x ],
    [ @x{ keys %x } ],
]) or die $graph->error;

Note: To increase the text size on a GD::Graph, use a larger font for the element. See Methods for charts with axes.

Using GD::Graph, you really should not have to modify the values yourself. Just provide the string '.2f%%' as the argument to y_number_format.

share|improve this answer
Sinan, thanks for the reply, but I just don't want to print the decimal with a certain precision. I want to change the values of the numbers in the array to xx.xx. Reason being, I pass the entire array to the GD element. Am I clear? Or would you like me to explain better ... if I'm confusing? :) –  c0d3rs Oct 21 '10 at 21:32
@c0d3rs What exactly is in the array? Note that the for loop modifies the elements of the array. I just printed each element for illustration. –  Sinan Ünür Oct 21 '10 at 21:37
There are 2 arrays, one that has { MSN, Chrome, GTalk .. }, the other has the corresponding y-values {34.3433423432434, 12.4343434353534,32.232335435435}. I did test your code, but it doesn't modify the element of the array. –  c0d3rs Oct 22 '10 at 13:22
When you have keys in one array and values in a parallel array, you know you should have used a hash. –  Sinan Ünür Oct 22 '10 at 13:26
@c0d3rs I don't know how you tested the code, but oh, yes, it does. –  Sinan Ünür Oct 22 '10 at 13:35

From perlfaq4's answer to Does Perl have a round() function? What about ceil() and floor()? Trig functions? :




use POSIX;
$ceil   = ceil(3.5);   # 4
$floor  = floor(3.5);  # 3





0.8 0.8 0.9 0.9 1.0 1.0


share|improve this answer
Thanks Brian, but Sinan's reply did the trick! –  c0d3rs Oct 22 '10 at 14:05

Your Answer


