Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked
 
PerlMonks  

Re: Is this the correct structure?

by 2teez (Priest)
on Jul 04, 2013 at 20:28 UTC ( #1042517=note: print w/ replies, xml ) Need Help??


in reply to Is this the correct structure?

Hi,
I think really, you can achieve what you wanted, by combining all your have except that I would not favour C type of "for loop".. See a headup below:

use warnings; use strict; use Data::Dumper; <DATA>; #remove the heading if not needed my @data; my $counter; while(<DATA>){ chomp; $counter = 0; for (split/\s+/,$_){ push @{$data[$counter++]},$_; } } print Dumper \@data; __DATA__ METHOD 0TM 1TM 2TM >2TM method1 3 68 18 10 method2 3 80 10 6 method3 3 87 9 1 method4 5 83 9 3 method5 6 75 15 4 method6 14 77 6 3 method7 12 82 2 3 method8 9 84 3 3 method9 13 68 16 3 method10 5 65 20 9 method11 9 64 20 7 method12 5 68 18 9 method13 6 82 9 2 method14 11 79 8 2 method15 6 69 20 5 method16 5 80 11 3 method17 1 68 17 14
You get an ARRAY of ARRAY, then you can print out want you want.
for more info. Please check perldsc.
Update:
The code above produces ...
$VAR1 = [ [ 'method1', 'method2', 'method3', 'method4', 'method5', 'method6', 'method7', 'method8', 'method9', 'method10', 'method11', 'method12', 'method13', 'method14', 'method15', 'method16', 'method17' ], [ '3', '3', '3', '5', '6', '14', '12', '9', '13', '5', '9', '5', '6', '11', '6', '5', '1' ], [ '68', '80', '87', '83', '75', '77', '82', '84', '68', '65', '64', '68', '82', '79', '69', '80', '68' ], [ '18', '10', '9', '9', '15', '6', '2', '3', '16', '20', '20', '18', '9', '8', '20', '11', '17' ], [ '10', '6', '1', '3', '4', '3', '3', '3', '3', '9', '7', '9', '2', '2', '5', '3', '14' ] ];

If you tell me, I'll forget.
If you show me, I'll remember.
if you involve me, I'll understand.
--- Author unknown to me


Comment on Re: Is this the correct structure?
Select or Download Code
Replies are listed 'Best First'.
Re^2: Is this the correct structure?
by Anonymous Monk on Jul 04, 2013 at 23:11 UTC
    Thank you all!
    Here is where I am at right now:
    #!/usr/bin/perl use Chart::Gnuplot; #one must specify FILENAME to get data from (tab-delimited), a name fo +r the output file, a type for output file (e.g. pdf, png, eps) and a +plot title ($infile, $title, $type, $plot_title) = @ARGV; $outfile = $title.'.'.$type; #add or remove colours accordingly @colour_array = ("lblue", "brown", "blue", "lred", "lgreen", "yellow", + "green", "red", "purple", "orange", "pink", "dyellow"); @data; $counter; open IN, "$infile" or die $!; $label_line = <IN>; chomp $label_line; #find the labels data (for n +aming the colours in the stacked bars) @split_labels = split(/\t/, $label_line); while(<IN>) { chomp; $counter = 0; for (split/\t/,$_) { push @{$data[$counter++]}, $_; } } close IN; #x-axis labels is the row #0 in the AoA @data @x = @{$data[0]}; $total_y = @data-1; #find how many y rows we have => how many colou +rs we need (-1 because #0 is x-axis) @pick_colours = @colour_array[ 0 .. $total_y - 1 ]; # Initiate the chart object $chart = Chart::Gnuplot->new( output => $outfile, title => $title, xlabel => { text => 'Method', color => 'black', offset => "-1", font => 'Times-Roman, 20' }, ylabel => { text => $plot_title, color => 'black', offset => -1, font => 'Times-Roman, 20' }, yrange => [0, '*'], xtics => { rotate => '-270', font => 'Times-Roman, 15' }, ytics => { font => 'Times-Roman, 15' }, bg => { color => 'white', density => 0.2, }, plotbg => 'white', legend => {position => 'outside bottom'}, border => { sides => 'bottom, left', linetype => 3, width => 2, color => 'black', }, "style histogram" => 'rowstacked' ); #all the rest rows in @data are used for creating the histogram bars #create object foreach series of data (column in excel) $counter_objects=0; for $y ( 1 .. $#data ) { $legend_name = $split_labels[$y]; #get the name for the legend, + e.g 1TM, 2TM, >2TM @tmp_y = @{$data[$y]}; #create temp array $counter_objects++; ${y."$counter_objects"} = Chart::Gnuplot::DataSet->new ( xdata => \@x, ydata => \@tmp_y, title => "$legend_name", fill => {density => 0.2}, style => "histograms", ); } #$chart->plot2d($h1, $h2, $h3, $h4);

    My main problem is that I want this script to be a general one, so I cannot know beforehand how many rows and columns I will have... I based my script in one example provided on the net, but in that one, the user had 4 arrays ( columns), which were hardcoded, so it was easy to say $chart -> plot2d ($h1, $h2, $3, $4). How can I do it in my case? And also, is the way I am trying to create the objects in the above for loop dynamically, correct? I think now, but I cannot figure out which is the correct syntax in this case. My thought was to somehow create the objects for the chart (in this case I need 4, aka 0TM, 1TM, 2TM, >2TM).

      It looks like you are trying to create a stacked bar histogram. Do you want horizontal or vertical bars ?

      poj
        Exactly, yes, a stacked bar histogram... I would prefer vertical bars, if possible...

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1042517]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (19)
As of 2015-07-07 22:16 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (93 votes), past polls