Hi Ben,
  glad you found the answer. Once again, does F.get_size_inches() have to 
return to
the user the numpy array? Why not a list or tuple? I don't mind matplotlib 
internal
stuff. ;-)

In an answer to your proposed workaround

> DefaultSize = tuple(F.get_size_inches())

let me comment that (I think) I tried also
 
DefaultSize = F.get_size_inches()[:]

but that also did not work for me. And was similarly think of the copy module 
haven't
bothered to try that. ;-)


  Yes, please document this at least if you really cannot return a simple list 
or tuple.
Thanks,
Martin

Benjamin Root wrote:
> 
> 
> On Thu, Feb 16, 2012 at 3:09 PM, Martin Mokrejs <mmokr...@fold.natur.cuni.cz 
> <mailto:mmokr...@fold.natur.cuni.cz>> wrote:
> 
>     Hi Benjamin,
>      thank you for you explanation. My comment is below in the text:
> 
>     Benjamin Root wrote:
>     >
>     >
>     > On Tue, Feb 14, 2012 at 4:43 PM, Martin Mokrejs 
> <mmokr...@fold.natur.cuni.cz <mailto:mmokr...@fold.natur.cuni.cz> 
> <mailto:mmokr...@fold.natur.cuni.cz <mailto:mmokr...@fold.natur.cuni.cz>>> 
> wrote:
>     >
>     >     Ah, this seems to be the issue that my figsize was growing all the 
> time so it
>     >     went over the maximum limits.
>     >
>     >     I thought this is valid:
>     >     DefaultSize = F.get_size_inches()
>     >     print str(DefaultSize)
>     >     blah
>     >     F.set_size_inches(DefaultSize)
>     >
>     >     See http://matplotlib.sourceforge.net/api/figure_api.html
>     >
>     >     <quote>
>     >     set_size_inches(*args, **kwargs)
>     >
>     >        set_size_inches(w,h, forward=False)
>     >
>     >        Set the figure size in inches
>     >
>     >        Usage:
>     >
>     >        fig.set_size_inches(w,h)  # OR
>     >        fig.set_size_inches((w,h) )
>     >
>     >        optional kwarg forward=True will cause the canvas size to be 
> automatically updated; eg you can resize the figure window from the shell
>     >
>     >        ACCEPTS: a w,h tuple with w,h in inches
>     >     </quote>
>     >
>     >     Nope, it does not work. The print call gives me: [ 8.  6.]. So, 
> this is not a tuple?
>     >     Or python-2.7 issue how is it printed ... I fear? ;-)
>     >     Anyway, doing
>     >
>     >     F.set_size_inches(11.2, 15)
>     >
>     >     works for me.
>     >
>     >     Martin
>     >
>     >
>     > I am a little bit confused by your code example.  You get the figure 
> size and print it, and *then* you set it with the exact same values, and you 
> are surprised that it came out as [8. 6.]?  Note that the figure size is 
> stored internally as a numpy array, so when you do "print str(DefaultSize)", 
> you will get the string representation of the numpy array.  You can still 
> pass in a tuple, list, or two separate elements.  Try this code:
> 
>     No, in my experience it did NOT work. I suspect F.set_size_inches() 
> either did not like the input tuple or something else. Now. after reading 
> your clarification, are you sure it can input the numpy array as well? What I 
> also tried was to re-set the figsize to original values.
> 
> 
> Yes, it can.  I found the source of the problem, see further down.
>  
> 
>     Ouch, I use pylab not matplotlib directly. :(
> 
> 
> Doesn't matter.
>  
> 
>     $ python
>     Python 2.7.2 (default, Feb  7 2012, 19:33:08)
>     [GCC 4.5.3] on linux2
>     Type "help", "copyright", "credits" or "license" for more information.
>     >>> import pylab
>     >>> F = pylab.gcf()
>     >>> print F.get_size_inches()
>     [ 8.  6.]
>     >>> DefaultSize = F.get_size_inches()
>     >>> print DefaultSize
>     [ 8.  6.]
>     >>> F.set_size_inches(10, 10)
>     >>> print F.get_size_inches()
>     [ 10.  10.]
>     >>> F.set_size_inches(DefaultSize[0], DefaultSize[1])
>     >>> print F.get_size_inches()
>     [ 10.  10.]
>     >>>
> 
> 
> The bug here is assuming that DefaultSize still contained the values you 
> printed earlier.  This is subtle (and I missed it before), but what you are 
> getting back from F.get_size_inches() is a view of the internal numpy array.  
> When you set the new size, the internal array was updated, not replaced.  
> This is much in the same vein as Python mutables, but taken a bit further 
> than you are probably used to.  Because the internal array was updated, the 
> view (stored in DefaultSize) showed the new data as well.  So, when you tried 
> to set (what you thought was still) the original size, it was merely setting 
> the current values back to itself.  Therefore, no change.
> 
> So, to force DefaultSize to be immutable, just cast it as a tuple:
> 
>>>> DefaultSize = tuple(F.get_size_inches())
> 
>  
> 
>     Why in the above example I cannot return back to figsize [ 8.  6.] ?
> 
>     >
>     > import matplotlib.pyplot as plt
>     > fig = plt.figure()
>     > print fig.get_size_inches()
>     > fig.set_size_inches(11.2, 15.0)
>     > print fig.get_size_inches()
>     > fig.set_size_inches((4.0, 7.2))
>     > print fig.get_size_inches()
>     > fig.set_size_inches([9.3, 11.1])
>     > print fig.get_size_inches()
>     >
>     >
>     > You should see:
>     >
>     > [ 8.  6.]
>     > [ 11.2  15. ]
>     > [ 4.   7.2]
>     > [  9.2  11.1]
> 
>     Yes, this works.
> 
>     >
>     > Everything works as expected.  There is nothing special about python 
> 2.7 in this regard.  Let us know if you are still having problems updating 
> your figures and include a stand-alone example showing how the figure size is 
> not being updated.
> 
>     What does the internal numpy array representation bring good to the 
> figsize? ;-)
>     Why don't you use a simple list/tuple? I am sure you know what you're 
> doing,
>     am just curious. Especially if slicing behaves differently compared to 
> list/tuple
>     and the .__str__() also gives in my eyes weird output. Sure, matter of 
> taste. ;)
> 
> 
> We use numpy arrays internally for several reasons.  Primarially is that we 
> have to do mathematical operations with this information.  list/tuple do not 
> lend itself to that (which is why numpy exists in the first place).  numpy 
> arrays also enforce type checking (so you can't put a string for a size 
> value, or anything else that doesn't make sense).  Another reason is that the 
> slicing is significantly more advanced than for list/tuples.  Internally, 
> there is a 2x2 array.  I can slice in either dimension very easily, while a 
> list of lists would not be easy.  Lastly, we need a combination of the 
> immutability of tuples (don't want people changing the array size), but the 
> mutability of lists (we want to be able to change the individual values).
> 
> I will admit that this issue is not immediately intuitive, and some 
> documentation should probably be added to help prevent users like yourself 
> from falling into this trap.
> 
> I hope that helps!
> Ben Root
> 

------------------------------------------------------------------------------
Virtualization & Cloud Management Using Capacity Planning
Cloud computing makes use of virtualization - but cloud computing 
also focuses on allowing computing to be delivered as a service.
http://www.accelacomm.com/jaw/sfnl/114/51521223/
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to