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