File Coverage

blib/lib/SVG/Graph/Glyph/axis.pm
Criterion Covered Total %
statement 55 95 57.8
branch 20 40 50.0
condition 4 10 40.0
subroutine 13 13 100.0
pod 10 11 90.9
total 102 169 60.3


line stmt bran cond sub pod time code
1             package SVG::Graph::Glyph::axis;
2              
3 1     1   7 use base SVG::Graph::Glyph;
  1         2  
  1         96  
4 1     1   6 use strict;
  1         2  
  1         1832  
5              
6             =head2 draw
7              
8             Title : draw
9             Usage :
10             Function:
11             Example :
12             Returns :
13             Args :
14              
15              
16             =cut
17              
18             sub draw{
19 4     4 1 13 my ($self,@args) = @_;
20              
21 4         30 my $id = 'n'.sprintf("%07d",int(rand(9999999)));
22             #my $frame_transform = $self->frame_transform;
23 4         19 my $group = $self->svg->group(id=>"axis$id");
24              
25 4         265 my $xscale = $self->xsize / $self->group->xrange;
26 4         36 my $yscale = $self->ysize / $self->group->yrange;
27              
28 4   50     34 my $xintercept = $self->x_intercept || 0;
29 4   50     12 my $yintercept = $self->y_intercept || 0;
30              
31             #draw x axis line
32 4         14 $group->line(x1=>$self->xoffset,
33             y1=>$self->yoffset + $self->ysize - ($yintercept * $yscale),
34             x2=>$self->xoffset + $self->xsize,
35             y2=>$self->yoffset + $self->ysize - ($yintercept * $yscale),
36             style=>{$self->_style}
37             );
38              
39             #draw y axis line
40 4         276 $group->line(x1=>$self->xoffset + ($xintercept * $xscale),
41             y1=>$self->yoffset,
42             x2=>$self->xoffset + ($xintercept * $xscale),
43             y2=>$self->yoffset + $self->ysize,
44             style=>{$self->_style}
45             );
46              
47 4         231 my @x_tick_labels = ();
48 4         7 my @x_intertick_labels = ();
49 4 50       19 if($self->x_tick_labels){
50 0         0 @x_tick_labels = @{ $self->x_tick_labels };
  0         0  
51             }
52 4 50       14 if($self->x_intertick_labels){
53 0         0 @x_intertick_labels = @{ $self->x_intertick_labels };
  0         0  
54             }
55              
56 4         8 my @y_tick_labels = ();
57 4         7 my @y_intertick_labels = ();
58 4 50       11 if($self->y_tick_labels){
59 0         0 @y_tick_labels = @{ $self->y_tick_labels };
  0         0  
60             }
61 4 50       10 if($self->y_intertick_labels){
62 0         0 @y_intertick_labels = @{ $self->y_intertick_labels };
  0         0  
63             }
64              
65             #x ticks
66 4 50 33     21 if($self->x_absolute_ticks and $self->x_fractional_ticks){
    50          
    50          
67 0         0 die "x axis can't have both absolute and fractional ticks";
68             } elsif($self->x_absolute_ticks){
69              
70 0         0 for(my $tick = $self->group->xmin ; $tick <= $self->group->xmax; $tick += $self->x_absolute_ticks){
71 0         0 my $tickpos = ($tick - $self->group->xmin) * $xscale;
72              
73 0         0 $group->line(x1=>$self->xoffset+$tickpos,
74             y1=>$self->yoffset+$self->ysize - ($self->y_intercept * $yscale),
75             x2=>$self->xoffset+$tickpos,
76             y2=>$self->yoffset+$self->ysize - ($self->y_intercept * $yscale)+($self->group->_parent_svg->margin/8),
77             style=>{$self->_style}
78             );
79              
80              
81             #tick label
82 0         0 my $x_tick_label = shift @x_tick_labels;
83 0         0 my $x = $self->xoffset + $tickpos;
84 0         0 my $y = $self->yoffset+$self->ysize - ($self->y_intercept * $yscale)+($self->group->_parent_svg->margin/4);
85 0         0 $group->text(
86             x=>$x,
87             y=>$y,
88             transform=>"rotate(90,$x,$y)",
89             )->cdata($x_tick_label);
90              
91             #intertick label
92 0         0 my $x_intertick_label = shift @x_intertick_labels;
93 0         0 $tickpos = (((2 * $tick) - 1) / 2) * $xscale;
94 0         0 $x = $self->xoffset + $tickpos;
95 0         0 $group->text(
96             x=>$x,
97             y=>$y,
98             transform=>"rotate(90,$x,$y)",
99             )->cdata($x_intertick_label);
100              
101             }
102             } elsif($self->x_fractional_ticks){
103 0         0 my $inc = $self->group->xrange / $self->x_fractional_ticks;
104 0         0 for(my $tick = $self->group->xmin ; $tick <= $self->group->xmax; $tick += $inc){
105 0         0 my $tickpos = ($tick - $self->group->xmin) * $xscale;
106              
107 0         0 $group->line(x1=>$self->xoffset+$tickpos,
108             y1=>$self->yoffset+$self->ysize - ($self->y_intercept * $yscale),
109             x2=>$self->xoffset+$tickpos,
110             y2=>$self->yoffset+$self->ysize - ($self->y_intercept * $yscale)+($self->group->_parent_svg->margin/8),
111             style=>{$self->_style}
112             );
113              
114             }
115             }
116              
117             #y ticks
118 4 50 33     14 if($self->y_absolute_ticks and $self->y_fractional_ticks){
    50          
    50          
119 0         0 die "y axis can't have both absolute and fractional ticks";
120             } elsif($self->y_absolute_ticks){
121 0         0 for(my $tick = $self->group->ymin ; $tick <= $self->group->ymax; $tick += $self->y_absolute_ticks){
122 0         0 my $tickpos = ($tick - $self->group->ymin) * $yscale;
123              
124 0         0 $group->line(x1=>$self->xoffset + ($self->x_intercept * $xscale),
125             y1=>$self->yoffset+$self->ysize-$tickpos,
126             x2=>$self->xoffset + ($self->x_intercept * $xscale)-($self->group->_parent_svg->margin/8),
127             y2=>$self->yoffset+$self->ysize-$tickpos,
128             style=>{$self->_style}
129             );
130              
131              
132             #tick label
133 0         0 my $y_tick_label = shift @y_tick_labels;
134             # my $x = $self->xoffset + $tickpos;
135 0         0 my $x = $self->xoffset + ($self->x_intercept * $xscale) - ($self->group->_parent_svg->margin);
136             # my $y = $self->yoffset+$self->ysize+($self->group->_parent_svg->margin/4);
137 0         0 my $y = $self->yoffset + $self->ysize - $tickpos;
138 0         0 $group->text(
139             x=>$x,
140             y=>$y,
141             # transform=>"rotate(90,$x,$y)",
142             )->cdata($y_tick_label);
143              
144             #intertick label
145 0         0 my $y_intertick_label = shift @y_intertick_labels;
146 0         0 $tickpos = (((2 * $tick) - 1) / 2) * $xscale;
147 0         0 $x = $self->xoffset + $tickpos;
148 0         0 $group->text(
149             x=>$x,
150             y=>$y,
151             # transform=>"rotate(90,$x,$y)",
152             )->cdata($y_intertick_label);
153              
154             }
155             } elsif($self->y_fractional_ticks){
156 0         0 my $inc = $self->group->yrange / $self->y_fractional_ticks;
157 0         0 for(my $tick = $self->group->ymin ; $tick <= $self->group->ymax ; $tick += $inc){
158 0         0 my $tickpos = ($tick - $self->group->ymin) * $xscale;
159              
160 0         0 $group->line(x1=>$self->xoffset + ($self->x_intercept * $xscale),
161             y1=>$self->yoffset+$self->ysize-$tickpos,
162             x2=>$self->xoffset + ($self->x_intercept * $xscale)-($self->group->_parent_svg->margin/8),
163             y2=>$self->yoffset+$self->ysize-$tickpos,
164             style=>{$self->_style}
165             );
166             }
167             }
168              
169             }
170              
171             =head2 x_intercept
172              
173             Title : x_intercept
174             Usage : $obj->x_intercept($newval)
175             Function:
176             Example :
177             Returns : value of x_intercept (a scalar)
178             Args : on set, new value (a scalar or undef, optional)
179              
180              
181             =cut
182              
183             sub x_intercept{
184 4     4 1 8 my $self = shift;
185              
186 4 50       13 return $self->{'x_intercept'} = shift if @_;
187 4         36 return $self->{'x_intercept'};
188             }
189              
190             =head2 y_intercept
191              
192             Title : y_intercept
193             Usage : $obj->y_intercept($newval)
194             Function:
195             Example :
196             Returns : value of y_intercept (a scalar)
197             Args : on set, new value (a scalar or undef, optional)
198              
199              
200             =cut
201              
202             sub y_intercept{
203 4     4 1 7 my $self = shift;
204              
205 4 50       11 return $self->{'y_intercept'} = shift if @_;
206 4         23 return $self->{'y_intercept'};
207             }
208              
209             =head2 x_fractional_ticks
210              
211             Title : x_fractional_ticks
212             Usage : $obj->x_fractional_ticks($newval)
213             Function:
214             Example :
215             Returns : value of x_fractional_ticks (a scalar)
216             Args : on set, new value (a scalar or undef, optional)
217              
218              
219             =cut
220              
221             sub x_fractional_ticks{
222 4     4 1 6 my $self = shift;
223              
224 4 50       10 return $self->{'x_fractional_ticks'} = shift if @_;
225 4         12 return $self->{'x_fractional_ticks'};
226             }
227              
228             =head2 y_fractional_ticks
229              
230             Title : y_fractional_ticks
231             Usage : $obj->y_fractional_ticks($newval)
232             Function:
233             Example :
234             Returns : value of y_fractional_ticks (a scalar)
235             Args : on set, new value (a scalar or undef, optional)
236              
237              
238             =cut
239              
240             sub y_fractional_ticks{
241 4     4 1 5 my $self = shift;
242              
243 4 50       10 return $self->{'y_fractional_ticks'} = shift if @_;
244 4         43 return $self->{'y_fractional_ticks'};
245             }
246              
247             =head2 x_absolute_ticks
248              
249             Title : x_absolute_ticks
250             Usage : $obj->x_absolute_ticks($newval)
251             Function:
252             Example :
253             Returns : value of x_absolute_ticks (a scalar)
254             Args : on set, new value (a scalar or undef, optional)
255              
256              
257             =cut
258              
259             sub x_absolute_ticks{
260 8     8 1 11 my $self = shift;
261              
262 8 50       16 return $self->{'x_absolute_ticks'} = shift if @_;
263 8         42 return $self->{'x_absolute_ticks'};
264             }
265              
266             =head2 y_fractional_ticks
267              
268             Title : y_fractional_ticks
269             Usage : $obj->y_fractional_ticks($newval)
270             Function:
271             Example :
272             Returns : value of y_fractional_ticks (a scalar)
273             Args : on set, new value (a scalar or undef, optional)
274              
275              
276             =cut
277              
278             sub y_absolute_ticks{
279 8     8 0 11 my $self = shift;
280              
281 8 50       17 return $self->{'y_absolute_ticks'} = shift if @_;
282 8         46 return $self->{'y_absolute_ticks'};
283             }
284              
285             =head2 x_intertick_labels
286              
287             Title : x_intertick_labels
288             Usage : $obj->x_intertick_labels($newval)
289             Function:
290             Example :
291             Returns : value of x_intertick_labels (a scalar)
292             Args : on set, new value (a scalar or undef, optional)
293              
294              
295             =cut
296              
297             sub x_intertick_labels{
298 4     4 1 7 my $self = shift;
299              
300 4 50       11 return $self->{'x_intertick_labels'} = shift if @_;
301 4         10 return $self->{'x_intertick_labels'};
302             }
303              
304             =head2 x_tick_labels
305              
306             Title : x_tick_labels
307             Usage : $obj->x_tick_labels($newval)
308             Function:
309             Example :
310             Returns : value of x_tick_labels (a scalar)
311             Args : on set, new value (a scalar or undef, optional)
312              
313              
314             =cut
315              
316             sub x_tick_labels{
317 4     4 1 8 my $self = shift;
318              
319 4 50       12 return $self->{'x_tick_labels'} = shift if @_;
320 4         15 return $self->{'x_tick_labels'};
321             }
322              
323             =head2 y_intertick_labels
324              
325             Title : y_intertick_labels
326             Usage : $obj->y_intertick_labels($newval)
327             Function:
328             Example :
329             Returns : value of y_intertick_labels (a scalar)
330             Args : on set, new value (a scalar or undef, optional)
331              
332              
333             =cut
334              
335             sub y_intertick_labels{
336 4     4 1 6 my $self = shift;
337              
338 4 50       19 return $self->{'y_intertick_labels'} = shift if @_;
339 4         11 return $self->{'y_intertick_labels'};
340             }
341              
342             =head2 y_tick_labels
343              
344             Title : y_tick_labels
345             Usage : $obj->y_tick_labels($newval)
346             Function:
347             Example :
348             Returns : value of y_tick_labels (a scalar)
349             Args : on set, new value (a scalar or undef, optional)
350              
351              
352             =cut
353              
354             sub y_tick_labels{
355 4     4 1 7 my $self = shift;
356              
357 4 50       11 return $self->{'y_tick_labels'} = shift if @_;
358 4         11 return $self->{'y_tick_labels'};
359             }
360              
361             1;