SourceForge logo
SourceForge logo
Menu

matplotlib-devel — matplotlib developers

You can subscribe to this list here.

2003 Jan
Feb
Mar
Apr
May
Jun
Jul
Aug
Sep
Oct
(1)
Nov
(33)
Dec
(20)
2004 Jan
(7)
Feb
(44)
Mar
(51)
Apr
(43)
May
(43)
Jun
(36)
Jul
(61)
Aug
(44)
Sep
(25)
Oct
(82)
Nov
(97)
Dec
(47)
2005 Jan
(77)
Feb
(143)
Mar
(42)
Apr
(31)
May
(93)
Jun
(93)
Jul
(35)
Aug
(78)
Sep
(56)
Oct
(44)
Nov
(72)
Dec
(75)
2006 Jan
(116)
Feb
(99)
Mar
(181)
Apr
(171)
May
(112)
Jun
(86)
Jul
(91)
Aug
(111)
Sep
(77)
Oct
(72)
Nov
(57)
Dec
(51)
2007 Jan
(64)
Feb
(116)
Mar
(70)
Apr
(74)
May
(53)
Jun
(40)
Jul
(519)
Aug
(151)
Sep
(132)
Oct
(74)
Nov
(282)
Dec
(190)
2008 Jan
(141)
Feb
(67)
Mar
(69)
Apr
(96)
May
(227)
Jun
(404)
Jul
(399)
Aug
(96)
Sep
(120)
Oct
(205)
Nov
(126)
Dec
(261)
2009 Jan
(136)
Feb
(136)
Mar
(119)
Apr
(124)
May
(155)
Jun
(98)
Jul
(136)
Aug
(292)
Sep
(174)
Oct
(126)
Nov
(126)
Dec
(79)
2010 Jan
(109)
Feb
(83)
Mar
(139)
Apr
(91)
May
(79)
Jun
(164)
Jul
(184)
Aug
(146)
Sep
(163)
Oct
(128)
Nov
(70)
Dec
(73)
2011 Jan
(235)
Feb
(165)
Mar
(147)
Apr
(86)
May
(74)
Jun
(118)
Jul
(65)
Aug
(75)
Sep
(162)
Oct
(94)
Nov
(48)
Dec
(44)
2012 Jan
(49)
Feb
(40)
Mar
(88)
Apr
(35)
May
(52)
Jun
(69)
Jul
(90)
Aug
(123)
Sep
(112)
Oct
(120)
Nov
(105)
Dec
(116)
2013 Jan
(76)
Feb
(26)
Mar
(78)
Apr
(43)
May
(61)
Jun
(53)
Jul
(147)
Aug
(85)
Sep
(83)
Oct
(122)
Nov
(18)
Dec
(27)
2014 Jan
(58)
Feb
(25)
Mar
(49)
Apr
(17)
May
(29)
Jun
(39)
Jul
(53)
Aug
(52)
Sep
(35)
Oct
(47)
Nov
(110)
Dec
(27)
2015 Jan
(50)
Feb
(93)
Mar
(96)
Apr
(30)
May
(55)
Jun
(83)
Jul
(44)
Aug
(8)
Sep
(5)
Oct
Nov
(1)
Dec
(1)
2016 Jan
Feb
Mar
(1)
Apr
May
Jun
(2)
Jul
Aug
(3)
Sep
(1)
Oct
(3)
Nov
Dec
2017 Jan
Feb
(5)
Mar
Apr
May
Jun
Jul
(3)
Aug
Sep
(7)
Oct
Nov
Dec
2018 Jan
Feb
Mar
Apr
May
Jun
Jul
(2)
Aug
Sep
Oct
Nov
Dec
S M T W T F S





1
2
(4)
3
4
(2)
5
(2)
6
(4)
7
(1)
8
(3)
9
(3)
10
11
(3)
12
(1)
13
(8)
14
(3)
15
(1)
16
(2)
17
(2)
18
(4)
19
20
(2)
21
(1)
22
(3)
23
24
25
26
27
(4)
28
(4)
29
(8)
30
31






Showing 1 results of 1

From: Martin T. <mar...@mb...> - 2011年07月12日 10:01:18
Dear List,
dear Michael,
> Looks good. Does matplotlib still pass all regression tests with this
> change?
It does pass all regression tests that were passed with the git version
I started with. (There were 10 failures which are still there).
In the meantime, I also wrote a class that already uses my extension.
With it, you can plot rotated or sheared images with all backends.
(There were some quirks to get sheard images on some backends,
see examples/api/demo_affine_image.py, but it worked on some backends
only).
While writing it, I found some inconsistencies in matplotlib:
- bounding boxes are not correctly transformed. BboxBase.tranformed only
transformes the outer points of a bounding box, if you rotate it, this will give
wrong results for several angles. I wrote a function that should be correct for
all affine transformations:
def transform_bbox(bbox, trans):
 x0, y0, x1, y1 = bbox.extents
 tx0, ty0 = trans.transform([x0, y0])
 tx1, ty1 = trans.transform([x1, y1])
 tx2, ty2 = trans.transform([x1, y0])
 tx3, ty3 = trans.transform([x0, y1])
 return Bbox.from_extents(min(tx0, tx1, tx2, tx3), min(ty0, ty1, ty2, ty3),
 max(tx0, tx1, tx2, tx3), max(ty0, ty1, ty2, ty3))
- The other inconsistency is that within matplotlib, extents are
defined different:
in imshow, the parameter extent expects the order (left, right, bottom, top),
while BboxBase.extents is (left, bottom, right, top). This should be changed in
the future, maybe the move to python 3 is a good time for that?
But now to my code to draw images. It's a new class inheriting AxesImage,
but is supposed to once replace AxesImage, as it is compatible.
I'm re-writing _draw_unsampled_image, to actually draw a sampled image.
Thats only because make_image, the method to be rewritten for a sampled
image, is not flexible enough (the caller draws the image, but there is no way
for make_image to tell where that image is to be put). In the future,
the methods
should be renamed (it's a private method, so that's no problem).
class ShearImage(AxesImage):
 def _check_unsampled_image(self, _):
 return True
 def _draw_unsampled_image(self, renderer, gc):
 """
 actually, draw sampled image. This method is more flexible than
 make_image
 """
 mag = renderer.get_image_magnification()
 trans = Affine2D().scale(mag, mag) + self.get_transform() + \
 self.axes.transData.get_affine()
 bbox = self.axes.bbox
 viewLim = transform_bbox(bbox, trans.inverted())
 im, xmin, ymin, dxintv, dyintv, sx, sy = \
 self._get_unsampled_image(self._A, self.get_extent(), viewLim)
 if im is None: return # I'm not if this check is required. -JJL
 im.set_interpolation(self._interpd[self._interpolation])
 im.set_resample(self._resample)
 fc = self.axes.patch.get_facecolor()
 bg = mcolors.colorConverter.to_rgba(fc, 0)
 im.set_bg( *bg)
 # uncomment the following line to see the extent to which the image
 # is drawn
 # im.set_bg(0, 0, 0, 100)
 numrows, numcols = im.get_size()
 ex = self.get_extent()
 tex = Bbox.from_extents([ex[0], ex[2], ex[1], ex[3]])
 tex = transform_bbox(tex, trans)
 if tex.xmin < bbox.xmin:
 left = bbox.xmin
 tx = 0
 else:
 left = tex.xmin
 tx = tex.xmin - bbox.xmin
 if tex.ymin < bbox.ymin:
 bottom = bbox.ymin
 ty = 0
 else:
 bottom = tex.ymin
 ty = tex.ymin - bbox.ymin
 trans = Affine2D().scale(dxintv / numcols,
 dyintv / numrows).translate(xmin, ymin) + \
 trans + \
 Affine2D().translate(-bbox.xmin - tx, -bbox.ymin - ty)
 im.set_matrix(*trans.get_matrix()[:2, :].T.ravel())
 width = min(tex.xmax, bbox.xmax) - left
 height = min(tex.ymax, bbox.ymax) - bottom
 if width <= 0 or height <= 0:
 return
 im.resize(width * mag, height * mag,
 norm=self._filternorm, radius=self._filterrad)
 im._url = self.get_url()
 renderer.draw_image(gc, left, bottom, im)
Last but not least, a little script to test the above. It shows a rotated
image. You can scale and move the image nicely. If you uncomment the
line mentioned above in ShearImage code, you can see where the
image is actually drawn, and you will see that only the necessary parts
are drawn if the image is smaller than the entire axes.
The test script follows:
from pylab import *
ax = axes()
im = ShearImage(ax)
im.set_data(fromfunction(lambda x, y: sin(x + y ** 2), (100, 100)))
im.set_extent(im.get_extent())
transform = Affine2D().rotate_deg(30)
im.set_transform(transform)
ax.images.append(im)
show()
Greetings
Martin

Showing 1 results of 1

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.
Thanks for helping keep SourceForge clean.
X





Briefly describe the problem (required):
Upload screenshot of ad (required):
Select a file, or drag & drop file here.
Screenshot instructions:

Click URL instructions:
Right-click on the ad, choose "Copy Link", then paste here →
(This may not be possible with some types of ads)

More information about our ad policies

Ad destination/click URL:

AltStyle によって変換されたページ (->オリジナル) /