---
name: "Bio::Graphics::Glyph::whiskerplot"
section: "3pm"
platform: "linux"
package: "libbio-graphics-perl"
version: "2.40-6"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Bio::Graphics::Glyph::whiskerplot"
---

# Bio::Graphics::Glyph::whiskerplot(3pm)

The whiskerplot glyph

## 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.
