Hi,
I would like to export a zone of a Figure in .png.
Something like figure.savefig(“mypicture.png”, box = (0,0,5,5))
How may I proceed, without drawing all the plots again ?
I use wxagg.
Thanks,
Nicolas
Hi,
I would like to export a zone of a Figure in .png.
Something like figure.savefig(“mypicture.png”, box = (0,0,5,5))
How may I proceed, without drawing all the plots again ?
I use wxagg.
Thanks,
Nicolas
Look at PIL, you have normaly a such function there.
Le jeudi 28 juin 2007, Nicolas a écrit :
Hi,
I would like to export a zone of a Figure in .png.
Something like figure.savefig("mypicture.png", box = (0,0,5,5))
How may I proceed, without drawing all the plots again ?
I use wxagg.
Thanks,Nicolas
---------------------------------
Ne gardez plus qu'une seule adresse mail ! Copiez vos mails vers Yahoo!
--
Lionel Roubeyrie - lroubeyrie@...1068...
Chargé d'études et de maintenance
LIMAIR - la Surveillance de l'Air en Limousin
http://www.limair.asso.fr
Thanks for your reply.
However, I don’t want to had a PIL dependency.
Is there any other method, using only matplotlib or wx ?
Nicolas
agg offers methods to convert the image pixel buffer to strings or
buffers, which you could then convert to numpy arrays, so a slice
extraction, and reconvert back to a buffer and ultimately a PNG. I
don't have time right now to write some example code, but you may want
to poke around in backend_agg to see if you can figure it out, and if
not remind me next week.
Thanks,
JDH
On 6/28/07, Nicolas <nico_75_0@...136...> wrote:
Thanks for your reply.
However, I don't want to had a PIL dependency.
Is there any other method, using only matplotlib or wx ?
Hi,
I can figure the first steps :
something like :
matrix = []
buffer = self.get_renderer().tostring_argb()
l, h = self.GetSize()
for ligne in xrange(h):
matrix.append([])
for colonne in xrange(l):
i = 4*(ligne*h + colonne)
pixel = buffer[i:i+4]
matrix[-1].append(pixel)
zone_to_export = array(matrix)[pixely0:pixely1, pixelx0:pixelx1]
new_buffer = buffer("".join("".join(elt for elt in ligne) for ligne in zone_to_export ))
But then I don’t know what to with this new buffer.
I tried to create a new RenderAgg instance, so as to use its png export facilities.
r = RendererAgg(pixelx1 - pixelx0, pixely1 - pixely0, Value(dpi))
…
r._renderer.write_png(nom)
But I don’t know what to put between the two previous lines.
How may I load a buffer content into a RenderAgg instance ?
I suppose I may use something like :
r.draw_image(0, 0, im)
but what is the correct format for im ? Is there an Image class in matplotlib (I looked for, but didn’t find).
How may I convert my buffer ?
Thanks a lot,
Nicolas
How may I transform my buffer into an image ?
On 6/28/07, John Hunter < jdh2358@…287…> wrote:
On 6/28/07, Nicolas < > nico_75_0@…136…> wrote:
Thanks for your reply.
However, I don’t want to had a PIL dependency.
Is there any other method, using only matplotlib or wx ?
agg offers methods to convert the image pixel buffer to strings or
buffers, which you could then convert to numpy arrays, so a slice
extraction, and reconvert back to a buffer and ultimately a PNG. I
don’t have time right now to write some example code, but you may wantto poke around in backend_agg to see if you can figure it out, and if
not remind me next week.Thanks,
JDH
I don't know how to do it with the MPL agg back-end, but I think you mentioned wx, and you can do it there instead. a wxImage can be constructed from a buffer object, then saved as a PNG. You may need to set the rgb and alpha portions separately. See the wxPython wiki and search for "Image".
Also:
matrix =
buffer = self.get_renderer().tostring_argb()
l, h = self.GetSize()
for ligne in xrange(h):
matrix.append()
for colonne in xrange(l):
i = 4*(ligne*h + colonne)
pixel = buffer[i:i+4]
matrix[-1].append(pixel)
This is a very slow way to create the numpy array!
Option a: first create an empty array:
matrix = numpy.empty((l,h,4), numpy.byte)
then fill that in. but even better:
you can build the array directly from the buffer string:
matrix = numpy.fromstring(buffer, dtype=numpy.byte)
lotlib-users
--
Christopher Barker, Ph.D.
Oceanographer
Emergency Response Division
NOAA/NOS/OR&R (206) 526-6959 voice
7600 Sand Point Way NE (206) 526-6329 fax
Seattle, WA 98115 (206) 526-6317 main reception
Chris.Barker@...259...
Thank you very much.
I know very little about numpy in fact.
If I don’t find a pure matplotlib method, I will use your suggestion with wx.
I think however matplotlib may be used only (and it will be even better as I plan to make a Qt version in the future)
So, in :
from matplotlib.transforms import Value
from matplotlib.backends.backend_agg import RendererAgg
r = RendererAgg(50, 50, Value(72))
r.draw_image
(0, 0, im)
What is the correct format for im ?
Thanks,
Nicolas
On 7/2/07, Christopher Barker < Chris.Barker@…259…> wrote:
I don’t know how to do it with the MPL agg back-end, but I think you
mentioned wx, and you can do it there instead. a wxImage can be
constructed from a buffer object, then saved as a PNG. You may need to
set the rgb and alpha portions separately. See the wxPython wiki and
search for “Image”.Also:
matrix = [] buffer = self.get_renderer().tostring_argb() l, h = self.GetSize() for ligne in xrange(h): matrix.append([]) for colonne in xrange(l): i = 4*(ligne*h + colonne) pixel = buffer[i:i+4] matrix[-1].append(pixel)
This is a very slow way to create the numpy array!
Option a: first create an empty array:
matrix = numpy.empty((l,h,4), numpy.byte)
then fill that in. but even better:
you can build the array directly from the buffer string:
matrix = numpy.fromstring(buffer, dtype=numpy.byte)
lotlib-users–
Christopher Barker, Ph.D.
OceanographerEmergency Response Division
NOAA/NOS/OR&R (206) 526-6959 voice7600 Sand Point Way NE (206) 526-6329 fax
Seattle, WA 98115 (206) 526-6317 main receptionChris.Barker@…259…
Nicolas wrote:
I think however matplotlib may be used only (and it will be even better as I plan to make a Qt version in the future)
good idea.
So, in :
>>> from matplotlib.transforms import Value
>>> from matplotlib.backends.backend_agg import RendererAgg
>>> r = RendererAgg(50, 50, Value(72))
>>> r.draw_image (0, 0, im)What is the correct format for im ?
I'm no expert, but probably a string that's the same format as what tostring_argb() returns, so something like this should work (untested!):
buffer = self.get_renderer().tostring_argb()
l, h = self.GetSize()
matrix = numpy.fromstring(buffer, dtype=numpy.byte)
matrix.shape = (l,h,4) # 4 for a,r,g,b
sub_matrix = matrix[min_x:max_x, min:y_max_y, :]
r.draw_image (0, 0, sub_matrix.tostring())
-Chris
--
Christopher Barker, Ph.D.
Oceanographer
Emergency Response Division
NOAA/NOS/OR&R (206) 526-6959 voice
7600 Sand Point Way NE (206) 526-6329 fax
Seattle, WA 98115 (206) 526-6317 main reception
Chris.Barker@...259...