[Bioperl-l] patch xyplot.pm negative values Bio::Graphics/GMOD

Albert Vilella avilella at gmail.com
Sat Jun 11 15:18:04 EDT 2005

Hi all,

xyplot negative values:

Lincoln and Guenther: this are very hacky modifications (I still haven't
completely familiarized myself with Bio::Graphics)

I took a look at the code in xyplot.pm, and tested it on a local png
file (I don't have a GBrowse setup to test). Please check if what
has been done is correct.

It seems to me that _draw_boxes needs to be modified, so that the
boxes aren't wrongly plotted, but _draw_histogram, _draw_line and
_draw_points don't need anything special, a part from the existence of
the scale.

In _draw_boxes, negative boxes need to be plotted from the middle of
the track down to their score, so I modified it in a similar fashion
as it is done in _draw_scale

--- xyplot.pm.~1.15.~   2005-06-11 08:03:02.000000000 +0200
+++ xyplot.pm   2005-06-11 21:04:37.895586696 +0200
@@ -64,7 +64,8 @@

   my $type = $self->option('graph_type') || $self->option('graphtype')
|| 'boxes';
   $self->_draw_histogram($gd,$x,$y)  if $type eq 'histogram';
-  $self->_draw_boxes($gd,$x,$y)      if $type eq 'boxes';
+  #we need $dx and $dy for calculating $half for negative boxes
+  $self->_draw_boxes($gd,$x,$y,$dx,$dy)      if $type eq 'boxes';
   $self->_draw_line ($gd,$x,$y)      if $type eq 'line'
                                        or $type eq 'linepoints';
   $self->_draw_points($gd,$x,$y)     if $type eq 'points'
@@ -141,7 +142,7 @@

 sub _draw_boxes {
   my $self = shift;
-  my ($gd,$left,$top) = @_;
+  my ($gd,$left,$top,$dx,$dy) = @_;

   my @parts  = $self->parts;
   my $fgcolor = $self->fgcolor;
@@ -152,8 +153,17 @@
   for (my $i = 0; $i < @parts; $i++) {
     my $part = $parts[$i];
     my $next = $parts[$i+1];
+    my ($dummy1,$dummy2,$dummy3,$zero) =
     my ($x1,$y1,$x2,$y2) = $part->calculate_boundaries($left,$top);
-    $self->filled_box($gd,$x1,$part->{_y_position},$x2,$y2,$bgcolor,
+    # If negative box
+    if ($zero < ($part->{_y_position})) {
+        my ($dummyx1,$ny1,$dummyx2,$ny2) =
+        my $half = ($ny1+$ny2)/2;
+        $self->filled_box($gd,$x1,$part->{_y_position},$x2,$half,
+    # Normal positive box
+    } else {
+        $self->filled_box($gd,$x1,$part->{_y_position},$x2,$y2,
+    }
     next unless $next;
     my ($x3,$y3,$x4,$y4) = $next->calculate_boundaries($left,$top);
     $gd->line($x2,$y2,$x3,$y4,$fgcolor) if $x2 < $x3;

This results in boxes being plot upward if positive and downward if
negative from the middle of the track, (midpoint between $min_score
and $max_score). I don't know if it is the best thing to do, but it
makes sense to me.

Also, negative boxes will have a different color than positive boxes. It
also makes sense to me.

If you can check if it is ok and test it in a running GBrowse server,
that would be great.



PD: I haven't done anything about the log coordinates.

More information about the Bioperl-l mailing list