<div dir="ltr">See below<br><br><div class="gmail_quote">On Fri, Sep 26, 2008 at 8:05 AM, Laura McCord <span dir="ltr">&lt;<a href="mailto:mccordl@southwestern.edu">mccordl@southwestern.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
I have my data loaded into an array but everytime I try to graph the<br>
data I get a &quot;Can&#39;t call method &quot;png&quot; on an undefined value...<br>
<br>
I am using Perl and the Graph module to produce a bar graph. Here is a<br>
sample of my data and my source code. Perhaps someone will notice what I<br>
am doing wrong.<br>
<br>
Thanks.<br>
<br>
<br>
Here is some sample data:<br>
<br>
Fri Sep 26 00:00:00 2008 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0.1<br>
Fri Sep 26 01:00:00 2008 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0.0<br>
Fri Sep 26 02:00:00 2008 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0.1<br>
Fri Sep 26 03:00:00 2008 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0.1<br>
Fri Sep 26 04:00:00 2008 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0.2<br>
Fri Sep 26 05:00:00 2008 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0.1<br>
Fri Sep 26 06:00:00 2008 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0.2<br>
Fri Sep 26 07:00:00 2008 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0.1<br>
Fri Sep 26 08:00:00 2008 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0.2<br>
Fri Sep 26 09:00:00 2008 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0.2<br>
Fri Sep 26 10:00:00 2008 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0.2<br>
<br>
Here is a snippet of code:</blockquote><div><br># Got use strict; use warnings; in your code? They&#39;ll help.<br>&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;#Every Hour<br>
 &nbsp; &nbsp; &nbsp; my $res = &#39;60&#39;;<br>
<br>
 &nbsp; &nbsp; &nbsp; # Start on Sep 1st<br>
 &nbsp; &nbsp; &nbsp; my $start_t = &quot;1220227200&quot;;</blockquote><div><br># This is really Aug 31 <br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
 &nbsp; &nbsp; &nbsp; my $start_t_res = int($start_t/$res)*$res;</blockquote><div><br># And if you start to --start from this time, then you&#39;ve just overflowed time_t and you&#39;re trying to start at Wed Dec 31 15:59:59 1969, or time 0.<br>
&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
 &nbsp; &nbsp; &nbsp; #End on Today&#39;s Date<br>
 &nbsp; &nbsp; &nbsp; my $end_t = &quot;(int($start_t/$res)*$res)&quot;;</blockquote><div><br># unused. But you don&#39;t want to quote it anyway. That won&#39;t work.<br>&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
 &nbsp; &nbsp; &nbsp; my ($start,$step,$names,$data) =<br>
RRDs::fetch(&quot;stats.rrd&quot;,&quot;AVERAGE&quot;,&quot;-r&quot;,&quot;$res&quot;,&quot;-s&quot;,<br>
&quot;$start_t_res&quot;,&quot;-e&quot;,&quot;now&quot;);</blockquote><div><br># see above about starting at wrong time. <br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
<br>
 &nbsp; &nbsp; &nbsp; print &quot;Start: &nbsp; &nbsp; &nbsp; &quot;, scalar localtime($start), &quot; ($start)\n&quot;;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Step size: &nbsp; $step seconds\n&quot;;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;print &quot;DS names: &nbsp; &nbsp;&quot;, join (&quot;, &quot;, @$names).&quot;\n&quot;;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;print &quot;Data points: &quot;, $#$data + 1, &quot;\n&quot;;</blockquote><div><br># Try scalar @data here instead.&nbsp;<br></div><div><br># Consider renaming @array1 to @timestamps and @array2 to @values or <br># better: @whatever_those_values_actually_are. That makes it easier for<br>
# us to read your code. <br>#<br># There are faster ways to do this, but if it works, then I&#39;ll skip over it for the most part. <br># The only point I&#39;ll make is that if there are multiple DS&#39;s in your RRD, then you&#39;ll <br>
# only see the last one because the inner foreach loop will overwrite all of the prior<br># values in @line with just the last.<br>#<br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

 &nbsp; &nbsp; &nbsp;&nbsp; print &quot;Data:\n&quot;;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;foreach my $line (@$data) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $start += $step;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $min++;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#Here I am only loading hourly data into the array<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if($min == 60){<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$array1[$i] = localtime($start);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;foreach my $val (@$line) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $array2[$i] = $val;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$i++;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$min=0;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp; &nbsp; for($i=0;$i &lt; @array1; $i++){<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print $array1[$i].&quot; &quot;;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf &quot;%12.1f &quot;, $array2[$i];<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print &quot;\n&quot;;<br>
 &nbsp; &nbsp; &nbsp; }</blockquote><div><br># I prefer something like this here:<br>#<br># for my $i (0..$#timestamps) {<br># &nbsp; &nbsp; printf &quot;$timestamps[$i]: %12.1f\n&quot;, $values[$i];<br># }<br><br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
&nbsp; &nbsp; &nbsp; @actualdata = (\@array1,\@array2);</blockquote><div><br># Let&#39;s comment the above line out and ...<br>&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
 &nbsp; &nbsp; &nbsp; my $graph = new GD::Graph::bars;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;$graph-&gt;set(<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x_label &nbsp; &nbsp; &nbsp; &nbsp; =&gt; &#39;Date/Time&#39;,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y_label &nbsp; &nbsp; &nbsp; &nbsp; =&gt; &#39;Messages&#39;,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; title &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =&gt; &#39;Dropped Messages&#39;,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y_max_value &nbsp; &nbsp; =&gt; 10,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y_tick_number &nbsp; =&gt; 1,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y_label_skip &nbsp; &nbsp;=&gt; 1,<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # shadows<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bar_spacing &nbsp; &nbsp; =&gt; 10,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; shadow_depth &nbsp; &nbsp;=&gt; 4,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; shadowclr &nbsp; &nbsp; &nbsp; =&gt; &#39;dred&#39;,<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; transparent &nbsp; &nbsp; =&gt; 0,<br>
 &nbsp; &nbsp; &nbsp; ) or warn $graph-&gt;error;&nbsp;<br></blockquote><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
 &nbsp; &nbsp; &nbsp; my $image = $graph-&gt;plot(\@actualdata)-&gt;png();</blockquote><div># ...move it down here where it&#39;s a little closer to the action thusly:<br>#<br># my $image = $graph-&gt;plot( [\@timestamps, \@values] )-&gt;png;<br>
<br>Maybe that&#39;ll get you a little closer.<br><br>Good luck,<br>Joshua<br></div></div><br></div>