Exemple #1
0
    def asArtist(self, width, height, margin=20, use_lengths=None,
            scale_bar="left", show_params=None, show_internal_labels=False,
            label_template=None, edge_label_callback=None, shade_param=None, 
            max_value=None, font_size=None, **kw):
        
        if use_lengths is None:
            use_lengths = self.use_lengths_default
        self.updateGeometry(use_lengths=use_lengths)
        
        if width <= 2 * margin:
            raise ValueError('%spt not wide enough for %spt margins' %
                    (width, margin))
        if height <= 2 * margin:
            raise ValueError('%spt not high enough for %spt margins' %
                    (height, margin))
        width -= 2 * margin
        height -= 2 * margin

        label_length = len(self.longest_label)
        label_width = label_length * 0.8 * (font_size or 10) # not very accurate
        (left_labels, right_labels) = self.labelMargins(label_width)
        total_label_width = left_labels + right_labels
        if width < total_label_width:
            raise ValueError('%spt not wide enough for ""%s"' %
                    (width, self.longest_label))
    
        scale = self.updateCoordinates(width-total_label_width, height)

        if shade_param is not None and max_value is None:
            for edge in self.postorder(include_self=True):
                sp = edge.params.get(shade_param, None)
                if max_value is None or sp > max_value:
                    max_value = sp
        renderer = MatplotlibRenderer(shade_param=shade_param, 
                max_value=max_value, font_size=font_size, **kw)

        labelopts = {}
        for labelopt in ['show_params', 'show_internal_labels', 
                'label_template', 'edge_label_callback']:
            labelopts[labelopt] = locals()[labelopt]
        label_style = DendrogramLabelStyle(**labelopts)

        ss = self._draw(renderer, label_style)
        if use_lengths:
            # Placing the scale properly might take some work,
            # for now just always put it in a bottom corner.
            unit = 10**min(0.0, numpy.floor(numpy.log10(width/scale/2.0)))
            if scale_bar == "right":
                x1, x2 = (width-scale*unit, width)
            elif scale_bar == "left":
                x1, x2 = (-left_labels, scale*unit-left_labels)
            else:
                assert not scale_bar, scale_bar
            if scale_bar:
                ss.append(renderer.line(x1, 0.0, x2, 0.0))
                ss.append(renderer.string((x1+x2)/2, 5, str(unit), va='bottom', ha='center'))
        
        g = rlg2mpl.Group(*ss)
        g.translate(margin+left_labels, margin)
        return g
Exemple #2
0
 def getShapes(self, span, rotated, height, yrange=None, done_border=False):
     if yrange is None:
         yrange = self.range
     shape_list = []
     for track in self.tracks:
         if track.needs_border and not done_border:
             border = rlg2mpl.Group(
                 rlg2mpl.Line(span[0],
                              0,
                              span[1],
                              0,
                              strokeWidth=.5,
                              strokeColor=colors.black),
                 rlg2mpl.Line(span[0],
                              height,
                              span[1],
                              height,
                              strokeWidth=.5,
                              strokeColor=colors.black))
             shape_list.append(border)
             done_border = True
         shape_list.extend(
             track.getShapes(span,
                             rotated,
                             height,
                             yrange=yrange,
                             done_border=True))
     return shape_list
Exemple #3
0
 def shape(self, height, yrange, rotated):
     g = rlg2mpl.Group()
     trans = TransformScalePart(g.combined_transform)
     y = height / 2.0
     segments = [[(x1, y), (x2, y)] for (x1, x2) in self.segments]
     a = LineCollection(segments, edgecolor='k', facecolor='k')
     a.set_linewidth(2)
     g.add(a)
     a.set_transform(g.combined_transform)
     return g
Exemple #4
0
 def shape(self, height, yrange, rotated):
     g = rlg2mpl.Group()
     posn = 0
     for span in self.map.spans:
         if not span.lost:
             g.add(self._item_shape(
                     span, self.values[posn:posn+span.length],
                     height, yrange, rotated))
         posn += span.length
     return g
Exemple #5
0
 def shape(self, height, yrange, rotated):
     g = rlg2mpl.Group()
     trans = TransformScalePart(g.combined_transform)
     segment = [(.1,0),(.9,0)]
     if rotated:
         segment = [(y,x) for (x,y) in segment]
     a = LineCollection([segment], colors=self.cvalues, 
             offsets=self.offsets, transOffset=g.combined_transform)
     a.set_linewidth(3)
     g.add(a)
     a.set_transform(trans)
     return g
Exemple #6
0
 def shape(self, height, yrange, rotated):
     g = rlg2mpl.Group()
     (X, Y, I) = (0, 1, 2)
     #scaled_axes = [[X, I], [I, Y]][rotated]
     scaled_axes = [[X, X], [Y, Y]][rotated]
     scaled_axes = [[X, Y], [X, Y]][rotated]
     trans = TransformScalePart(g.combined_transform, scaled_axes)
     a = CircleCollection([.5], edgecolors=self.cvalues,
             facecolors=self.cvalues, offsets=self.offsets,
             transOffset=g.combined_transform)
     g.add(a)
     a.set_transform(trans)
     return g
Exemple #7
0
 def getShapes(self, span, rotated, height, 
         yrange=None, done_border=False):
     shape_list = [feature.shape(height,
             yrange or self.range, rotated) for feature in self.features]
     if self.needs_border and not done_border:
         border = rlg2mpl.Group(
                 rlg2mpl.Line(span[0], 0, span[1], 0,
                         strokeWidth=.5, strokeColor=colors.black),
                 rlg2mpl.Line(span[0], height, span[1], height,
                         strokeWidth=.5, strokeColor=colors.black)
                 )
         shape_list = [border] + shape_list
     return shape_list
Exemple #8
0
 def __call__(self, height, label, map, value, yrange, rotated):
     #return self.FeatureClass(label, map)
     g = rlg2mpl.Group()
     last = first = None
     if self.range_required and not yrange:
         warnings.warn("'%s' graph values are all zero" % label)
         yrange = 1.0
     if map.useful and self.one_span:
         map = map.getCoveringSpan()
     for (i, span) in enumerate(map.spans):
         #if last is not None:
         #    g.add(rlg2mpl.Line(last, height, part.Start, height))
         if span.lost or (value is None and self.range_required):
             continue
         if span.Reverse:
             (start, end) = (span.End, span.Start)
             (tidy_start, tidy_end) = (span.tidy_end, span.tidy_start)
         else:
             (start, end) = (span.Start, span.End)
             (tidy_start, tidy_end) = (span.tidy_start, span.tidy_end)
         shape = self._item_shape(start,
                                  end,
                                  tidy_start,
                                  tidy_end,
                                  height,
                                  value,
                                  yrange,
                                  rotated,
                                  last=i == len(map.spans) - 1)
         g.add(shape)
         last = end
         if first is None:
             first = start
     if self.showLabel and label and last is not None and height > 7:
         font_height = 12  #self.label_font.get_size_in_points()
         text_width = llen(label, font_height)
         if (text_width < abs(first - last)):
             label_shape = Text(
                 (first + last) / 2,
                 height / 2,
                 label,
                 ha="center",
                 va="center",
                 rotation=[0, 90][rotated],
                 #font_properties=self.label_font,
             )
             g.add(label_shape)
         else:
             pass  #warnings.warn("couldn't fit feature label '%s'" % label)
     return g
Exemple #9
0
 def shape(self, height, yrange, rotated):
     g = rlg2mpl.Group()
     (X, Y, I) = (0, 1, 2)
     shapes = [self.shapes, self.rshapes][rotated]
     trans = TransformScalePart(g.combined_transform)
     artists = []
     for (motif, cvalues, offsets) in self.per_shape_values:
         shape = shapes[motif]
         a = PolyCollection([shape], closed=True,
             facecolors=cvalues, edgecolors=cvalues, offsets=offsets, 
             transOffset=g.combined_transform)
         g.add(a)
         a.set_transform(trans)
     return g
Exemple #10
0
 def shape(self, height, yrange, rotated):
     rot = 0
     if rotated: rot += 90
     #if span.Reverse: rot+= 180
     g = rlg2mpl.Group()
     kw = dict(ha='center', va='baseline', rotation=rot,
             font_properties=self.font_properties)
     for (motif, cvalues, offsets) in self.per_shape_values:
         letter = self.alphabet[motif]
         c = len(cvalues)
         for (i, (x,y)) in enumerate(offsets):
             s = Text(x, y, letter, color=cvalues[i%c], **kw)
             g.add(s)
     return g
Exemple #11
0
 def makeArtist(self, vertical=False):
     g = rlg2mpl.Group()
     for (y, ym, p) in self._tracks:
         smap = self.smap.inverse()
         for s in p.getShapes(span=(smap.Start, smap.End),
                              rotated=vertical,
                              height=float(p.height),
                              yrange=self.yrange[p.tag]):
             trans = matplotlib.transforms.Affine2D()
             trans.translate(0, y)
             s.set_transform(s.get_transform() + trans)
             g.add(s)
     if vertical:
         g.rotate(90)
         g.scale(-1.0, 1.0)
     return g