Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

Re^7: Is this the correct structure?

by poj (Priest)
on Jul 06, 2013 at 13:03 UTC ( #1042908=note: print w/ replies, xml ) Need Help??


in reply to Re^6: Is this the correct structure?
in thread Is this the correct structure?

You just need to create an array of datasets. Push comes after the ->new.

#$myvar.= '$h'."$counter_objects".", "; #push @all_vars, $myvar; #${h."$counter_objects"} = Chart::Gnuplot::DataSet->new my $ds = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@tmp_y, title => "$legend_name", fill => {density => 0.2}, style => "histograms", ); push @all_vars, $ds; } $chart->plot2d(@all_vars); # no \
poj


Comment on Re^7: Is this the correct structure?
Select or Download Code
Replies are listed 'Best First'.
Re^8: Is this the correct structure?
by Anonymous Monk on Jul 06, 2013 at 16:34 UTC
    Again dissapointment...
    I don't really get it though!! The code executes perfectly, yet I do not get a stacked bar which adds up to 100, as it should based on the input file... In some methods it even stays as low as maybe 20, for some strange reason!
    #!/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 = $plot_title.'.'.$type; #add or remove colours accordingly @colour_array = ("#00308F", "#004225", "#480607", "#AF002A", "#008000" +, "#E25822", "#3B444B", "#7C0A02", "#848482", "#563C5C"); @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 => 'Performance', 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) @all_vars=(); 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 $ds = Chart::Gnuplot::DataSet->new( xdata => \@x, ydata => \@tmp_y, title => "$legend_name", fill => {density => 0.2}, style => "histograms", color => "$pick_colours[$y-1]" ); push @all_vars, $ds; } $chart->plot2d(@all_vars);

    The code with the suggestions/corrections of the kind monks produces no errors, BUT, if you try it on the real example, which is the following dataset:
    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

    using the command:
    perl script.pl datasets EVALUATION png MYIMAGE

    it creates a really awful graph!!!!!

      You have 2 problems. First the data array need to be transposed to create 4 rows with 17 columns

      while(<IN>){ chomp; my @cols = split/\s+/,$_; for my $ix (0..$#cols){ push @{$data[$ix]}, $cols[$ix]; } }

      and second, in the creation of the dataset use

      ydata => [ @{$data[$y]} ],
      otherwise you create a reference to the same data each time

      poj
        YES!
        It works correctly now!
        Thank you for all your effort and time poj!

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (4)
As of 2015-08-01 02:43 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 (285 votes), past polls