in reply to Hide plotted data that exceeds y_max_value in graph produced by GD::Graph::Lines

Well, first of all, wouldn't you want to know just how much above 2 the value really is?

One option, not elegant, would be to make use of the y_number_format method. I believe you can return strings here. You supply a function. In this case, if the number is between y_min and y_max, print the number. If it is above y_max print "above 2".

  • Comment on Re: Hide plotted data that exceeds y_max_value in graph produced by GD::Graph::Lines

Replies are listed 'Best First'.
Re^2: Hide plotted data that exceeds y_max_value in graph produced by GD::Graph::Lines
by djodja (Initiate) on Feb 17, 2010 at 10:11 UTC

    Thank you for your replies

    I will address both suggestions on this reply as they seem to be pretty much the same.

    * Well, first of all, wouldn't you want to know just how much above 2 the value really is?

    I do know what the value is because I have a table with those values along side the graph. But the main purpose of the graph is for my researchers to be able to compare different sets of values within the same scale.

    * GD graphs are not very flexible, but you could come up with some hack to fix the problem. For instance, how about looping thru the data points and set any value greater than y_max to y_max, or even to zero. Then do the plot.
    * One option, not elegant, would be to make use of the y_number_format method. I believe you can return strings here. You supply a function. In this case, if the number is between y_min and y_max, print the number. If it is above y_max print "above 2".

    These are not the solutions. I need the value to be plotted correctly so that slope of the curve is as it should be. If I assign any data point value that is greater then y_max_value to y_max_value, the curve will be completely diferent.

    What I really need is for GD::Graph to extrapolate and not really represent where the data point should be plotted. One solution would be to get rid of the graph title and draw a white rectangle above the top margin of the graph. Although not pretty, this would work.

    Isn't there a method in GD::Graph that would make the plotting of the curve dependent on the y_max_value?

    Once again, thank you for your replies

    May Perl be with you

    djodja

      What I really need is for GD::Graph to extrapolate and not really represent where the data point should be plotted.

      What do you mean by that?

      1. Do you want GD::Graph to simply omit any point outside the limits you specify?

        If so, should it connect the previous point directly to next?

      2. Or, do you want the graph drawn in full, but with any points or line sections that would go above or below the Y scale clipped?

        If so, one way to tackle this is two plot two graphs. Each with the same options, but one with null data ([[0],[0]]). You then blit (copy) that section of the full graph over the blank graph and print that.

        It's easier to demonstrate than describe:

        #! perl -slw use strict; use GD::Graph::lines; my @logConc = 1 .. 50; my @data = map{ -3 + rand( 6 ) } 1 .. 50; my @graphs = map GD::Graph::lines->new(500,300, 1), 1..2; for ( @graphs ) { $_->set( x_label => 'Logged stuff', y_label => 'Intensity', title => "Plot of stuff", line_width => 1, legend_spacing => 5, x_tick_number => 'auto', box_axis => 0, y_min_value => -2, y_max_value => 2, transparent => 0 ) or die $_->error; $_->set_legend('legend'); } ## Draw the full graph my $gd1 = $graphs[ 0 ]->plot( [ \@logConc, \@data ] ) or die $graphs[0]->error; ## Draw another with the same size and options, but null data. my $gd2 = $graphs[ 1 ]->plot([[0],[0]]); ## Copy the relevant portion of the full graph over the empty one $gd2->copy( $gd1, 0, 20, 0, 20, 500, 230 ); ## And display the latter. open PNG, '>:raw', 'junk.png'; print PNG $gd2->png(); close PNG; system 'junk.png';

        In theory, you could use just one graph by plotting an empty dataset, getting the gd object, setting the clip region and then plotting again with the real dataset. Unfortunately, the plots don't align correctly ;(


      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.