Provided by: libbio-graphics-perl_2.39-4_all bug

NAME

       Bio::Graphics::Glyph::whiskerplot - The whiskerplot glyph

SYNOPSIS

         See L<Bio::Graphics::Panel> and L<Bio::Graphics::Glyph>.

DESCRIPTION

       This glyph is used for drawing features associated with numeric data using "box and
       whisker" style data points, which display the mean value, extreme ranges and first and
       third quartiles (or standard deviation). The boxes drawn by this glyph are similar to
       <http://www.abs.gov.au/websitedbs/D3310116.NSF/0/3c35ac1e828c23ef4a2567ac0020ec8a?OpenDocument>,
       except that they are oriented vertically so that the position and height of the box
       indicates the mean value and spread of the data, and the width indicates the genomic
       extent of the value.

       Like the xyplot glyph (from which it inherits the whiskerplot is designed to work on a
       single feature group that contains subfeatures.  It is the subfeatures that carry the
       score information. The best way to arrange for this is to create an aggregator for the
       feature.  We'll take as an example a histogram of repeat density in which interval are
       spaced every megabase and the score indicates the number of repeats in the interval; we'll
       assume that the database has been loaded in in such a way that each interval is a distinct
       feature with the method name "density" and the source name "repeat".  Furthermore, all the
       repeat features are grouped together into a single group (the name of the group is
       irrelevant).  If you are using Bio::DB::GFF and Bio::Graphics directly, the sequence of
       events would look like this:

         my $agg = Bio::DB::GFF::Aggregator->new(-method    => 'repeat_density',
                                                 -sub_parts => 'density:repeat');
         my $db  = Bio::DB::GFF->new(-dsn=>'my_database',
                                     -aggregators => $agg);
         my $segment  = $db->segment('Chr1');
         my @features = $segment->features('repeat_density');

         my $panel = Bio::Graphics::Panel->new;
         $panel->add_track(\@features,
                           -glyph => 'xyplot',
                           -scale => 'both',
       );

       If you are using Generic Genome Browser, you will add this to the configuration file:

         aggregators = repeat_density{density:repeat}
                       clone alignment etc

       Note that it is a good idea to add some padding to the left and right of the panel;
       otherwise the scale will be partially cut off by the edge of the image.

       The mean (or median) of the data will be taken from the feature score. The range and
       quartile data must either be provided in a feature tag named "range", or must be generated
       dynamically by a -range callback option passed to add_track. The data returned by the tag
       or option should be an array reference containing the following five fields:

        [$median,$range_low,$range_high,$quartile_low,$quartile_high]

       where $range_low and $range_high correspond to the low and high value of the "whiskers"
       and $quartile_low and $quartile_high correspond to the low and high value of the "box."

       If $median is undef or missing, then the score field of the feature will be used instead.
       It may be useful to repeat the median in the score field in any case, in order to allow
       the minimum and maximum range calculations of the graph itself to occur.

       See Examples for three ways of generating an image.

   OPTIONS
       The following options are standard among all Glyphs.  See Bio::Graphics::Glyph for a full
       explanation.

         Option      Description                      Default
         ------      -----------                      -------

         -fgcolor      Foreground color               black

         -outlinecolor Synonym for -fgcolor

         -bgcolor      Background color               turquoise

         -fillcolor    Synonym for -bgcolor

         -linewidth    Line width                     1

         -height       Height of glyph                10

         -font         Glyph font                     gdSmallFont

         -label        Whether to draw a label        0 (false)

         -description  Whether to draw a description  0 (false)

         -hilite       Highlight color                undef (no color)

       In addition, the alignment glyph recognizes all the options of the xyplot glyph, as well
       as the following glyph-specific option:

         Option         Description                  Default
         ------         -----------                  -------

         -range        Callback to return median,    none - data comes from feature "range" tag
                       range and quartiles for each
                       sub feature

EXAMPLES

       Here are three examples of how to use this glyph.

   Example 1: Incorporating the numeric data in each subfeature
        #!/usr/bin/perl
        use strict;

        use Bio::Graphics;
        use Bio::SeqFeature::Generic;

        my $bsg = 'Bio::SeqFeature::Generic';

        my $feature = $bsg->new(-start=>0,-end=>1000);

        for (my $i=0;$i<1000;$i+=20) {
          my $y = (($i-500)/10)**2;
          my $range = make_range($y);
          my $part = $bsg->new(-start=>$i,-end=>$i+16,
                              -score=>$y,-tag => { range=>$range });
          $feature->add_SeqFeature($part);
        }

        my $panel = Bio::Graphics::Panel->new(-length=>1000,-width=>800,-key_style=>'between',
                                             -pad_left=>40,-pad_right=>40);
        $panel->add_track($feature,
                         -glyph=>'arrow',
                         -double=>1,
                         -tick=>2);

        $panel->add_track($feature,
                         -glyph=>'whiskerplot',
                         -scale=>'both',
                         -height=>200,
                         -min_score => -500,
                         -key  =>'Whiskers',
                         -bgcolor => 'orange',
                        );
        print $panel->png;

        sub make_range {
          my $score        = shift;
          my $range_top    = $score + 5*sqrt($score) + rand(50);
          my $range_bottom = $score - 5*sqrt($score) - rand(50);
          my $quartile_top    = $score + 2*sqrt($score) + rand(50);
          my $quartile_bottom = $score - 2*sqrt($score) - rand(50);
          return [$score,$range_bottom,$range_top,$quartile_bottom,$quartile_top];
        }

   Example 2: Generating the range data with a callback
        #!/usr/bin/perl
        use strict;

        use Bio::Graphics;
        use Bio::SeqFeature::Generic;

        my $bsg = 'Bio::SeqFeature::Generic';
        my $feature = $bsg->new(-start=>0,-end=>1000);

        for (my $i=0;$i<1000;$i+=20) {
          my $y = (($i-500)/10)**2;
          my $part = $bsg->new(-start=>$i,-end=>$i+16,-score=>$y);
          $feature->add_SeqFeature($part);
        }

        my $panel = Bio::Graphics::Panel->new(-length=>1000,-width=>800,-key_style=>'between',
                                             -pad_left=>40,-pad_right=>40);
        $panel->add_track($feature,
                         -glyph=>'arrow',
                         -double=>1,
                         -tick=>2);

        $panel->add_track($feature,
                         -glyph=>'whiskerplot',
                         -scale=>'both',
                         -height=>200,
                         -min_score => -500,
                         -key  =>'Whiskers',
                         -bgcolor => 'orange',
                         -range => \&make_range,
                        );
        print $panel->png;

        sub make_range {
          my $feature = shift;
          my $score        = $feature->score;
          my $range_top    = $score + 5*sqrt($score) + rand(50);
          my $range_bottom = $score - 5*sqrt($score) - rand(50);
          my $quartile_top    = $score + 2*sqrt($score) + rand(50);
          my $quartile_bottom = $score - 2*sqrt($score) - rand(50);
          return [$score,$range_bottom,$range_top,$quartile_bottom,$quartile_top];
        }

   Example 3: Generating the image from a FeatureFile
       The file:
            [general]
            pixels = 840
            pad_left = 40
            pad_right = 40

            [contig]
            glyph     = arrow
            double    = 1
            tick      = 2

            [data]
            glyph     = whiskerplot
            scale     = both
            height    = 200
            min_score = -500
            max_score = 2800
            key       = Whiskers
            bgcolor   = orange

            chr1   .       contig  1       1000    .       .       .       Contig chr1
            chr1   .       data    0       16      2500    .       .       Dataset data1; range 2209,2769,2368,2619
            chr1   .       data    20      36      2304    .       .       Dataset data1; range 2051,2553,2163,2435
            chr1   .       data    40      56      2116    .       .       Dataset data1; range 1861,2384,1983,2253
            chr1   .       data    60      76      1936    .       .       Dataset data1; range 1706,2181,1819,2059
            chr1   .       data    80      96      1764    .       .       Dataset data1; range 1516,1995,1646,1849
            chr1   .       data    100     116     1600    .       .       Dataset data1; range 1359,1834,1513,1699
            chr1   .       data    120     136     1444    .       .       Dataset data1; range 1228,1654,1330,1565
            chr1   .       data    140     156     1296    .       .       Dataset data1; range 1105,1520,1198,1385
            chr1   .       data    160     176     1156    .       .       Dataset data1; range 983,1373,1062,1270
            chr1   .       data    180     196     1024    .       .       Dataset data1; range 853,1184,914,1116
            chr1   .       data    200     216     900     .       .       Dataset data1; range 722,1093,801,965
            chr1   .       data    220     236     784     .       .       Dataset data1; range 621,945,724,859
            chr1   .       data    240     256     676     .       .       Dataset data1; range 532,833,605,742
            chr1   .       data    260     276     576     .       .       Dataset data1; range 433,714,485,653
            chr1   .       data    280     296     484     .       .       Dataset data1; range 331,600,418,545
            chr1   .       data    300     316     400     .       .       Dataset data1; range 275,535,336,459
            chr1   .       data    320     336     324     .       .       Dataset data1; range 198,434,270,374
            chr1   .       data    340     356     256     .       .       Dataset data1; range 167,378,219,322
            chr1   .       data    360     376     196     .       .       Dataset data1; range 114,303,118,249
            chr1   .       data    380     396     144     .       .       Dataset data1; range 39,248,87,197
            chr1   .       data    400     416     100     .       .       Dataset data1; range 17,173,68,141
            chr1   .       data    420     436     64      .       .       Dataset data1; range -14,125,18,84
            chr1   .       data    440     456     36      .       .       Dataset data1; range -8,74,11,64
            chr1   .       data    460     476     16      .       .       Dataset data1; range -46,77,0,43
            chr1   .       data    480     496     4       .       .       Dataset data1; range -40,43,-7,36
            chr1   .       data    500     516     0       .       .       Dataset data1; range -43,0,-43,22
            chr1   .       data    520     536     4       .       .       Dataset data1; range -6,52,-4,54
            chr1   .       data    540     556     16      .       .       Dataset data1; range -5,38,-27,52
            chr1   .       data    560     576     36      .       .       Dataset data1; range -43,109,18,66
            chr1   .       data    580     596     64      .       .       Dataset data1; range -1,134,3,112
            chr1   .       data    600     616     100     .       .       Dataset data1; range 49,186,69,124
            chr1   .       data    620     636     144     .       .       Dataset data1; range 79,225,71,169
            chr1   .       data    640     656     196     .       .       Dataset data1; range 124,289,120,266
            chr1   .       data    660     676     256     .       .       Dataset data1; range 154,378,197,320
            chr1   .       data    680     696     324     .       .       Dataset data1; range 220,439,249,396
            chr1   .       data    700     716     400     .       .       Dataset data1; range 291,511,331,458
            chr1   .       data    720     736     484     .       .       Dataset data1; range 350,627,400,572
            chr1   .       data    740     756     576     .       .       Dataset data1; range 446,718,502,633
            chr1   .       data    760     776     676     .       .       Dataset data1; range 515,833,576,777
            chr1   .       data    780     796     784     .       .       Dataset data1; range 606,959,724,856
            chr1   .       data    800     816     900     .       .       Dataset data1; range 747,1058,799,1004
            chr1   .       data    820     836     1024    .       .       Dataset data1; range 817,1231,958,1089
            chr1   .       data    840     856     1156    .       .       Dataset data1; range 961,1341,1069,1225
            chr1   .       data    860     876     1296    .       .       Dataset data1; range 1103,1511,1219,1385
            chr1   .       data    880     896     1444    .       .       Dataset data1; range 1218,1660,1338,1535
            chr1   .       data    900     916     1600    .       .       Dataset data1; range 1377,1828,1496,1703
            chr1   .       data    920     936     1764    .       .       Dataset data1; range 1547,2020,1674,1858
            chr1   .       data    940     956     1936    .       .       Dataset data1; range 1691,2188,1824,2043
            chr1   .       data    960     976     2116    .       .       Dataset data1; range 1869,2376,2019,2225
            chr1   .       data    980     996     2304    .       .       Dataset data1; range 2040,2554,2178,2418

       The script to render it
            #!/usr/bin/perl

            use strict;
            use Bio::Graphics::FeatureFile;

            my $data = Bio::Graphics::FeatureFile->new(-file=>'test.gff');

            my(undef,$panel) = $data->render;
            print $panel->png;

BUGS

       Please report them.

SEE ALSO

       Bio::Graphics::Panel, Bio::Graphics::Track, Bio::Graphics::Glyph::transcript2,
       Bio::Graphics::Glyph::anchored_arrow, Bio::Graphics::Glyph::arrow,
       Bio::Graphics::Glyph::box, Bio::Graphics::Glyph::primers, Bio::Graphics::Glyph::segments,
       Bio::Graphics::Glyph::toomany, Bio::Graphics::Glyph::transcript,

AUTHOR

       Lincoln Stein <lstein@cshl.org>

       Copyright (c) 2001 Cold Spring Harbor Laboratory

       This library is free software; you can redistribute it and/or modify it under the same
       terms as Perl itself.  See DISCLAIMER.txt for disclaimers of warranty.