8000 Automaticall separate affine from non-affine transforms · matplotlib/matplotlib@d0a6d4b · GitHub
[go: up one dir, main page]

Skip to content

Commit d0a6d4b

Browse files
committed
Automaticall separate affine from non-affine transforms
svn path=/branches/transforms/; revision=3889
1 parent 8327bd4 commit d0a6d4b

File tree

8 files changed

+377
-309
lines changed

8 files changed

+377
-309
lines changed

lib/matplotlib/axes.py

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -545,7 +545,7 @@ def _init_axis(self):
545545
"move this out of __init__ because non-separable axes don't use it"
546546
self.xaxis = maxis.XAxis(self)
547547
self.yaxis = maxis.YAxis(self)
548-
self._update_transAxisXY()
548+
self._update_transScale()
549549

550550
def sharex_foreign(self, axforeign):
551551
"""
@@ -631,12 +631,28 @@ def _set_lim_and_transforms(self):
631631
self.viewLim = mtransforms.Bbox.unit()
632632
self.transAxes = mtransforms.BboxTransform(
633633
mtransforms.Bbox.unit(), self.bbox)
634-
self.transAxisXY = mtransforms.TransformWrapper()
635-
self.transData = self.transAxisXY + self.transAxes
636634

637-
def _update_transAxisXY(self):
638-
self.transAxisXY.set(mtransforms.blended_transform_factory(
635+
# Transforms the x and y axis separately by a scale factor
636+
# It is assumed that this part will have non-linear components
637+
self.transScale = mtransforms.TransformWrapper(mtransforms.IdentityTransform())
638+
639+
# A (possibly non-linear) projection on the (already scaled) data
640+
self.transProjection = mtransforms.IdentityTransform()
641+
642+
# An affine transformation on the data, generally to limit the
643+
# range of the axes
644+
self.transLimits = mtransforms.BboxTransform(
645+
mtransforms.TransformedBbox(self.viewLim, self.transScale), mtransforms.Bbox.unit())
646+
647+
self.transData = self.transScale + self.transProjection + self.transLimits + self.transAxes
648+
649+
650+
def _update_transScale(self):
651+
self.transScale.set(
652+
mtransforms.blended_transform_factory(
639653
self.xaxis.get_transform(), self.yaxis.get_transform()))
654+
655+
self.transData.make_graphviz(open("trans.dot", "w"))
640656

641657
def get_position(self, original=False):
642658
'Return the axes rectangle left, bottom, width, height'
@@ -1537,7 +1553,7 @@ def set_xscale(self, value, **kwargs):
15371553
ACCEPTS: ['log' | 'linear' ]
15381554
"""
15391555
self.xaxis.set_scale(value, **kwargs)
1540-
self._update_transAxisXY()
1556+
self._update_transScale()
15411557

15421558
def get_xticks(self):
15431559
'Return the x ticks as a list of locations'
@@ -1647,7 +1663,7 @@ def set_yscale(self, value, basey=10, subsy=None):
16471663
ACCEPTS: ['log' | 'linear']
16481664
"""
16491665
self.yaxis.set_scale(value, basey, subsy)
1650-
self._update_transAxisXY()
1666+
self._update_transScale()
16511667

16521668
def get_yticks(self):
16531669
'Return the y ticks as a list of locations'

lib/matplotlib/axis.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -508,16 +508,15 @@ def __init__(self, axes, pickradius=15):
508508
self.majorTicks = []
509509
self.minorTicks = []
510510
self.pickradius = pickradius
511-
self._transform = LinearScale(self.axes.viewLim, self.axis).get_transform()
512-
self._scale = 'linear'
511+
self._scale = LinearScale()
513512

514513
self.cla()
515514

516515
def get_transform(self):
517-
return self._transform
518-
516+
return self._scale.get_transform()
517+
519518
def get_scale(self):
520-
return self._scale
519+
return self._scale.name
521520

522521
def set_scale(self, value, base=10, subs=None):
523522
# MGDTODO: Move these settings (ticker etc.) into the scale class itself
@@ -528,17 +527,16 @@ def set_scale(self, value, base=10, subs=None):
528527
self.set_major_formatter(ScalarFormatter())
529528
self.set_minor_locator(NullLocator())
530529
self.set_minor_formatter(NullFormatter())
531-
self._transform = LinearScale(self.axes.viewLim, self.axis).get_transform()
530+
self._scale = LinearScale()
532531
elif value == 'log':
533532
self.set_major_locator(LogLocator(base))
534533
self.set_major_formatter(LogFormatterMathtext(base))
535534
self.set_minor_locator(LogLocator(base,subs))
536535
# MGDTODO: Pass base along
537-
self._transform = LogScale(self.axes.viewLim, self.axis).get_transform()
536+
self._scale = LogScale()
538537
miny, maxy = getattr(self.axes.viewLim, 'interval' + self.axis)
539538
if min(miny, maxy)<=0:
540539
self.axes.autoscale_view()
541-
self._scale = value
542540

543541
def get_children(self):
544542
children = [self.label]

lib/matplotlib/backends/backend_agg.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,14 +132,14 @@ def __init__(self, width, height, dpi):
132132

133133
# MGDTODO: This is a hack for now to allow for arbitrary transformations
134134
def draw_path(self, gc, path, trans, rgbFace=None):
135-
new_path, affine = path.transformed_without_affine(trans)
136-
self._renderer.draw_path(gc, new_path, affine, rgbFace)
135+
assert trans.is_affine()
136+
self._renderer.draw_path(gc, path, trans, rgbFace)
137137

138138
# MGDTODO: This is a hack for now to allow for arbitrary transformations
139139
def draw_markers(self, gc, marker_path, marker_trans, path, trans, rgbFace=None):
140140
assert marker_trans.is_affine()
141-
new_path, affine = path.transformed_without_affine(trans)
142-
self._renderer.draw_markers(gc, marker_path, marker_trans, new_path, affine, rgbFace)
141+
assert trans.is_affine()
142+
self._renderer.draw_markers(gc, marker_path, marker_trans, path, trans, rgbFace)
143143

144144
def draw_mathtext(self, gc, x, y, s, prop, angle):
145145
"""

0 commit comments

Comments
 (0)
0