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
(12)
2
(10)
3
(1)
4
(12)
5
(1)
6
(4)
7
(2)
8
(30)
9
(10)
10
(14)
11
(6)
12
(1)
13
(11)
14
(14)
15
(2)
16
17
(1)
18
19
20
(1)
21
(2)
22
(2)
23
(3)
24
(1)
25
(3)
26
27
28





Showing results of 143

<< < 1 .. 3 4 5 6 > >> (Page 5 of 6)
From: Fernando P. <Fer...@co...> - 2005年02月08日 00:34:00
Attachments: backend_ps.diff
Hi all,
I went through backend_ps picking out the low-hanging fruit. O(N^2) stuff, 
string += concatenations, unnecessary copies, stuff like that. Here's a 
patch. I tested it on a few small things and didn't really see much 
difference, so it would be good if you have a nasty PS to make (something with 
many thousands of line calls). The diff is attached against CVS, I don't 
want to commit anything like this wihtout a bit of review/test from others.
In trying to test it, I also ran the supplied pstest.py in examples/, after 
uncommenting the savefig() call. I noticed the generated postscript crashes 
gv. This is not good. I tested this bad-PS corruption both with my patch 
and with unmodified backend_ps, and it happens in both cases. I don't really 
know what it could be.
Is there a set 	of tests I can use to check against, other than the examples/ dir?
Best,
f
From: Abraham S. <ab...@cn...> - 2005年02月07日 22:04:20
Attachments: config4.py
John Hunter wrote:
>Quick comments. I'd like to continue using the matplotlib naming
>convention (UpperCase) for class names, rather than underscore
>separated
> 
>
Okay, I started to convert the names. I haven't yet done this for the 
more internal functions (i.e. things like lines_properties).
>class trait_color(Trait):
>
>also, 
>
>I don't think we should use the name Trait or HasTrait, since that
>will confuse people into thinking we are using enthought traits
>(Property and HasProperty ?) 
> 
>
Fair enough. I changed it to HasProperties and Property.. It's a little 
verbose, but I guess it won't be used very much outside of the file.
>Finally, another feature I would like to be able to support, which
>won't be hard, is to enable the use of an RC class or something like
>it in Artist constructors
>
>Here is what we currently have
>
> def __init__(self, xdata, ydata,
> linewidth = None, # default to rc
> linestyle = None, # default to rc
> color = None, # default to rc
>...snip..
> ):
>
>This overloads None which leads to strange usages like
>linestyle='None' to turn off lines (note the quotes). I would rather
>do something like
>
>
> def __init__(self, xdata, ydata,
> linewidth = RC('lines.linewidth'),
> linestyle = RC('lines.linestyle')
>...snip...
> ):
> if isinstance(linewidth, RC): linewidth=linewidth()
>
>Note that this is different than
>
> def __init__(self, xdata, ydata,
> linewidth = rc.lines.linewidth,
> linestyle = rc.lines.linestyle,
>...snip...
> ):
> 
>
Okay, I changed the HasProperties class to include a 'get()' function as 
well. This allows for:
rc.get('lines.linewidth') ==> a Property-subclass instance
The only problem with this, is that this might not be what the person is 
expecting. I could easily change the get function to instead return the 
value of the Property, but there are uses for getting the actual 
Property back as well.. Of course one can override the __float__, 
__int__, etc. methods, but this still requires explicit conversion, thus 
the user still has to know something about the internals.
My current solution was to add a function 'getValue', which is the same 
as get, but returns just the value. This could also very easily be 
wrapped up in a function:
def RC(name): return rc.getValue(name)
>The syntax above is not the point. What I want to emphasize is that I
>want a self documenting way of saying this parameter defaults to an rc
>param, and that param should be evaluated *at init time*. If you can
>do it with the second syntax, that looks better, but if I read your
>code correctly, something like rc.lines.linewidth evaluates to a float
>at module load time and so cannot be used as a sentinel at module init
>time. Is this correct?
> 
>
Nope, it keeps as a property, and thus has sentinel-capabilities.
>In any case, it looks very promising. Two final comments. Like
>Fernando, I'm not too concerned about being able to parse existing rc
>files. It's a minor burden to require people simply to take the new
>format and customize it. Also, do you need to extend the fontsize
>train to support fontsizes in points, eg 12.0 ?
> 
>
Currently it accepts either a float or one of the keywords. It should be 
fairly easy to extend it to also use the syntax '12.4pt' or '12in' (i.e. 
LaTeX style -- of course someone would have to write a conversion 
function..)
>Well if it already parses existing rc, no reason to kill it.
> 
>
As long as we keep the 1-to-1 mapping, it's easy enough to do. It's the 
same code (plus reading in the file) what is done for rc.get('x.y.z')
Abe
From: Jochen V. <vo...@se...> - 2005年02月07日 11:11:54
Hello John,
On Sun, Feb 06, 2005 at 11:49:36AM -0600, John Hunter wrote:
> Last time Paul looked at this (when he implemented freetype fonts for
> PS mathtext), he came to the conclusion that it was not possible to
> extract individual glyphs fro ps file, and had to resort to dumping in
> the entire file. I don't believe this is the case.
I agree, there is no reason why we should not be able to
create a font with only selected glyphs.
> Any takers?
I always meant to take a look at that, but momentarily I am a little
bit short of time. So if anybody else could implement this, this
would be great! Otherwise I might be able to have a look during next
weekend.
All the best,
Jochen
--=20
http://seehuhn.de/
From: Fernando P. <Fer...@co...> - 2005年02月06日 22:40:52
John Hunter wrote:
> For Fernando's test case, I was able to reduce the typical run time
> from 1.02s to 0.2s for PNGs and 1.35s to 0.26s for PS . Here are my
> notes on the various changes and the gains they brought. With
> collections, I think we could halve this again for PS, or at the very
> least get this down to agg speeds.
This is great, many thanks for working on this. For reference, here's what I 
was getting before:
[logtest]> ./logtest.py
Loading data...
pylab times...
plot: 3.38 s
png : 2.57 s
eps : 3.45 s
gnuplot...
plot: 0.16 s
eps : 0.06 s
Plot sizes:
-rw-r--r-- 1 fperez wavelet 27196 Feb 5 17:19 fig_gnuplot.eps
-rw-r--r-- 1 fperez wavelet 575701 Feb 5 17:19 fig_pylab.eps
-rw-r--r-- 1 fperez wavelet 33057 Feb 5 17:19 fig_pylab.png
and these are the current results:
[logtest]> ./logtest.py
Loading data...
pylab times...
plot: 0.70 s
png : 0.46 s
eps : 0.74 s
gnuplot...
plot: 0.02 s
eps : 0.21 s
Plot file info:
-rw-r--r-- 1 fperez wavelet 27196 Feb 6 15:19 fig_gnuplot.eps
-rw-r--r-- 1 fperez wavelet 417598 Feb 6 15:19 fig_pylab.eps
-rw-r--r-- 1 fperez wavelet 31550 Feb 6 15:19 fig_pylab.png
Note also how the pylab filesizes went down a bit, probably thanks to not 
having all the extra minor ticks.
For interactive work (which measures the time for the show() call, hence is 
higher than above), the improvement is also very noticeable:
In [6]: timing(fun2.plot_line,ptype='error') # pylab-based
Out[6]: 2.5686090000000004
In [7]: timing(fun2.plot_line_gp,ptype='error') # gnuplot-based
Out[7]: 0.56791400000000003
We're now within a factor of 5 of gnuplot (yesterday it was about 10x)
> and here is the final profiler output of the newly optimized code
> 
> 
> 58247 function calls (58081 primitive calls) in 0.980 CPU seconds
Wow, that's a lot of function calls... Given the cost of python function 
calls, I suspect that a major further improvement would require some manual 
inlining of some of this to reduce this number significantly. I'm not sure 
how worth this would be doing, given the cost in readability/architecture it 
may have. Just as a reference for you, here's the time for 58000 empty calls 
with one argument on my laptop (timings() is in IPython.genutils):
In [17]: def nothing(x):
 ....: pass
 ....:
In [18]: timings(58000,nothing,5)
Out[18]: (0.21196699999999957, 3.6546034482758548e-06)
 ^^ total time ^^ ^^ time per call ^^
But as far as I'm concerned, this is already much, much better than just a few 
days ago. Between the major fixes to correctness of log plots, and these 
performance improvements, I am very happy.
Many thanks for this effort. For those of us who spend a lot of time making 
log plots, this is great.
Best,
f
From: John H. <jdh...@ac...> - 2005年02月06日 22:08:34
Fernando sent me some test scripts and profile information which set
me on a path to enhance log plot performance. The biggest hit was
coming from the large number of tick labels which were formatted as
mathtext. mathtext is faster now than it used to be, but it is still
slow. I emailed the pyparsing Paul Mcguire and he's going to try and
take another look for some performance enhancements.
But superscript layout for mathtext is relatively easy, eg 10ドル^{-4}$
and so I special-cased this in the text module using a regex and did
the layout "by hand". I also changed the default behavior of the subs
property in the log tick locator. The value None now means to
autosub. If the number of decades is small, you'll get full subbing
for minor ticks as before. If the number of decades is large, you'll
get no minor ticks. You can override the default by explicitly
setting subs in semilogx and friends.
I also inlined some of the num -> string conversions in backend ps.
These were being done by a function that called another function and
the profiler indicated we were paying a big hit.
There are more big gains to be had -- eg backend ps could implement
the various collection draw methods and the lines module could use
collections for drawing markers. But that is for another day.
For Fernando's test case, I was able to reduce the typical run time
from 1.02s to 0.2s for PNGs and 1.35s to 0.26s for PS . Here are my
notes on the various changes and the gains they brought. With
collections, I think we could halve this again for PS, or at the very
least get this down to agg speeds.
Baseline
 plot: 1.15 s
 png : 1.02 s
 eps : 1.35 s
Skipping layout of empty strings
 plot: 0.8 s
 png : 0.67 s
 eps : 1.02 s
Using dot rather than Matrix
 plot: 0.74 s
 png : 0.62 s
 eps : 0.97 s
Optimizing super script drawing by skipping mathtext parser
 png : 0.46 s
 eps : 0.62 s
Implemented autosubbing to reduce the number of subticks for large
decade ranges
 png : 0.21 s
 eps : 0.36 s
Inline num2str backend ps draw_lines and draw_line
 png : 0.20 s
 eps : 0.26 s
and here is the final profiler output of the newly optimized code
 58247 function calls (58081 primitive calls) in 0.980 CPU seconds
 Ordered by: standard name
 ncalls tottime percall cumtime percall filename:lineno(function)
 3/1 0.000 0.000 0.980 0.980 <string>:1(?)
 1 0.000 0.000 0.000 0.000 ArrayPrinter.py:7(?)
 1 0.000 0.000 0.000 0.000 FFT.py:21(?)
 1 0.000 0.000 0.000 0.000 LinearAlgebra.py:14(LinAlgError)
 1 0.010 0.010 0.010 0.010 LinearAlgebra.py:6(?)
 1 0.000 0.000 0.000 0.000 MLab.py:9(?)
 1 0.010 0.010 0.020 0.020 Matrix.py:1(?)
 1 0.000 0.000 0.000 0.000 Matrix.py:66(Matrix)
 710 0.000 0.000 0.000 0.000 Numeric.py:130(asarray)
 131 0.000 0.000 0.000 0.000 Numeric.py:146(repeat)
 1 0.000 0.000 0.000 0.000 Numeric.py:492(Unpickler)
 1 0.000 0.000 0.000 0.000 Numeric.py:499(Pickler)
 131 0.000 0.000 0.000 0.000 Numeric.py:561(nonzero)
 127 0.010 0.000 0.010 0.000 Numeric.py:593(ones)
 1 0.010 0.010 0.030 0.030 Numeric.py:85(?)
 5 0.000 0.000 0.000 0.000 Precision.py:15(_get_precisions)
 1 0.000 0.000 0.000 0.000 Precision.py:21(_fill_table)
 1 0.000 0.000 0.000 0.000 Precision.py:28(PrecisionError)
 23 0.000 0.000 0.000 0.000 Precision.py:31(_lookup)
 1 0.000 0.000 0.000 0.000 Precision.py:7(?)
 1 0.000 0.000 0.000 0.000 RandomArray.py:1(?)
 1 0.000 0.000 0.000 0.000 RandomArray.py:13(ArgumentError)
 1 0.000 0.000 0.000 0.000 RandomArray.py:16(seed)
 1 0.000 0.000 0.000 0.000 StringIO.py:30(?)
 1 0.000 0.000 0.000 0.000 StringIO.py:38(StringIO)
 1 0.000 0.000 0.000 0.000 UTC.py:1(?)
 1 0.000 0.000 0.000 0.000 UTC.py:5(UTC)
 1 0.000 0.000 0.000 0.000 UserArray.py:1(?)
 1 0.000 0.000 0.000 0.000 UserArray.py:4(UserArray)
 2 0.000 0.000 0.000 0.000 UserDict.py:19(__getitem__)
 9 0.000 0.000 0.000 0.000 UserDict.py:41(has_key)
 1 0.000 0.000 0.000 0.000 __future__.py:48(?)
 1 0.000 0.000 0.000 0.000 __future__.py:66(_Feature)
 3 0.000 0.000 0.000 0.000 __future__.py:67(__init__)
 1 0.000 0.000 0.000 0.000 __init__.py:0(?)
 5 0.000 0.000 0.050 0.010 __init__.py:1(?)
 1 0.000 0.000 0.000 0.000 __init__.py:12(?)
 1 0.000 0.000 0.050 0.050 __init__.py:15(?)
 1 0.000 0.000 0.000 0.000 __init__.py:187(Verbose)
 1 0.000 0.000 0.000 0.000 __init__.py:206(__init__)
 1 0.000 0.000 0.000 0.000 __init__.py:21(?)
 2 0.000 0.000 0.000 0.000 __init__.py:211(set_level)
 2279 0.010 0.000 0.020 0.000 __init__.py:220(report)
 1 0.000 0.000 0.000 0.000 __init__.py:243(wrap)
 4 0.000 0.000 0.000 0.000 __init__.py:253(wrapper)
 2279 0.010 0.000 0.010 0.000 __init__.py:264(ge)
 1 0.000 0.000 0.000 0.000 __init__.py:27(timezone)
 2 0.000 0.000 0.000 0.000 __init__.py:271(get_home)
 4 0.000 0.000 0.000 0.000 __init__.py:290(_get_data_path)
 1 0.010 0.010 0.010 0.010 __init__.py:30(?)
 9 0.000 0.000 0.000 0.000 __init__.py:333(validate_bool)
 12 0.000 0.000 0.000 0.000 __init__.py:341(validate_float)
 1 0.000 0.000 0.000 0.000 __init__.py:347(validate_int)
 1 0.000 0.000 0.000 0.000 __init__.py:353(validate_numerix)
 1 0.000 0.000 0.000 0.000 __init__.py:361(validate_toolbar)
 1 0.000 0.000 0.000 0.000 __init__.py:372(validate_nseq_float)
 1 0.000 0.000 0.000 0.000 __init__.py:373(__init__)
 1 0.000 0.000 0.000 0.000 __init__.py:375(__call__)
 15 0.000 0.000 0.000 0.000 __init__.py:384(validate_color)
 196 0.000 0.000 0.000 0.000 __init__.py:40(dot)
 5 0.000 0.000 0.000 0.000 __init__.py:414(validate_comma_sep_str)
 4 0.000 0.000 0.000 0.000 __init__.py:428(validate_fontsize)
 1 0.000 0.000 0.000 0.000 __init__.py:438(validate_verbose)
 1 0.000 0.000 0.000 0.000 __init__.py:443(validate_verbose_fileo)
 1 0.000 0.000 0.000 0.000 __init__.py:458(validate_verbose_erro)
 4 0.000 0.000 0.000 0.000 __init__.py:48(draw_if_interactive)
 1 0.000 0.000 0.000 0.000 __init__.py:49(show)
 1 0.000 0.000 0.000 0.000 __init__.py:578(matplotlib_fname)
 1 0.000 0.000 0.000 0.000 __init__.py:6(?)
 1 0.010 0.010 0.010 0.010 __init__.py:615(rc_params)
 1 0.000 0.000 0.000 0.000 __init__.py:63(_munge_zone)
 2 0.000 0.000 0.000 0.000 __init__.py:683(rc)
 2 0.000 0.000 0.000 0.000 __init__.py:803(get_backend)
 1 0.000 0.000 0.000 0.000 __init__.py:839(MPLError)
 1 0.000 0.000 0.000 0.000 __init__.py:9(?)
 1 0.000 0.000 0.000 0.000 _contour.py:1(?)
 1 0.000 0.000 0.000 0.000 _image.py:1(?)
 1 0.000 0.000 0.000 0.000 _mathtext_data.py:3(?)
 1 0.000 0.000 0.000 0.000 _nc_imports.py:1(?)
 1 0.000 0.000 0.000 0.000 _nc_imports.py:5(_TypeNamespace)
 1 0.000 0.000 0.000 0.000 _pylab_helpers.py:1(?)
 1 0.000 0.000 0.000 0.000 _pylab_helpers.py:11(get_fig_manager)
 1 0.000 0.000 0.000 0.000 _pylab_helpers.py:37(get_all_fig_managers)
 12 0.000 0.000 0.000 0.000 _pylab_helpers.py:46(get_active)
 1 0.000 0.000 0.000 0.000 _pylab_helpers.py:52(set_active)
 1 0.000 0.000 0.000 0.000 _pylab_helpers.py:6(Gcf)
 1 0.000 0.000 0.000 0.000 _transforms.py:1(?)
 1 0.000 0.000 0.000 0.000 afm.py:257(AFM)
 1 0.000 0.000 0.000 0.000 afm.py:35(?)
 1 0.000 0.000 0.000 0.000 artist.py:1(?)
 2 0.000 0.000 0.000 0.000 artist.py:146(get_label)
 2 0.000 0.000 0.000 0.000 artist.py:148(set_label)
 182 0.000 0.000 0.000 0.000 artist.py:166(update_from)
 1 0.000 0.000 0.000 0.000 artist.py:23(Artist)
 281 0.000 0.000 0.040 0.000 artist.py:30(__init__)
 3 0.000 0.000 0.000 0.000 artist.py:42(is_transform_set)
 233 0.000 0.000 0.000 0.000 artist.py:46(set_transform)
 3 0.000 0.000 0.000 0.000 artist.py:55(get_transform)
 284 0.000 0.000 0.000 0.000 artist.py:66(set_figure)
 46 0.000 0.000 0.000 0.000 artist.py:74(set_clip_box)
 177 0.000 0.000 0.000 0.000 artist.py:90(get_visible)
 468 0.000 0.000 0.000 0.000 artist.py:94(get_clip_on)
 1 0.010 0.010 0.080 0.080 axes.py:1(?)
 1 0.000 0.000 0.000 0.000 axes.py:113(_process_plot_var_args)
 3 0.000 0.000 0.680 0.227 axes.py:1237(draw)
 2 0.000 0.000 0.000 0.000 axes.py:127(__init__)
 2 0.000 0.000 0.000 0.000 axes.py:131(_clear_color_cycle)
 2 0.000 0.000 0.000 0.000 axes.py:146(__call__)
 1 0.000 0.000 0.000 0.000 axes.py:1505(get_ylim)
 2 0.000 0.000 0.000 0.000 axes.py:151(set_lineprops)
 2 0.000 0.000 0.000 0.000 axes.py:1525(grid)
 2 0.000 0.000 0.000 0.000 axes.py:1552(hold)
 1 0.000 0.000 0.000 0.000 axes.py:170(is_filled)
 1 0.000 0.000 0.000 0.000 axes.py:1706(legend)
 2 0.000 0.000 0.000 0.000 axes.py:1771(get_handles)
 1 0.000 0.000 0.000 0.000 axes.py:195(_plot_2_args)
 2 0.000 0.000 0.010 0.005 axes.py:2227(plot)
 1 0.000 0.000 0.000 0.000 axes.py:235(_plot_3_args)
 4 0.000 0.000 0.000 0.000 axes.py:260(_grab_next_args)
 1 0.000 0.000 0.000 0.000 axes.py:2694(semilogy)
 2 0.000 0.000 0.000 0.000 axes.py:2768(_send_xlim_event)
 2 0.000 0.000 0.000 0.000 axes.py:2772(_send_ylim_event)
 2 0.000 0.000 0.000 0.000 axes.py:2777(set_xlim)
 2 0.000 0.000 0.000 0.000 axes.py:2860(set_ylim)
 1 0.000 0.000 0.000 0.000 axes.py:2872(set_yscale)
 4 0.000 0.000 0.000 0.000 axes.py:289(makeValue)
 1 0.010 0.010 0.010 0.010 axes.py:297(Axes)
 2 0.000 0.000 0.000 0.000 axes.py:2971(ishold)
 1 0.000 0.000 0.010 0.010 axes.py:313(__init__)
 1 0.000 0.000 0.000 0.000 axes.py:3299(SubplotBase)
 1 0.000 0.000 0.000 0.000 axes.py:3314(__init__)
 1 0.000 0.000 0.000 0.000 axes.py:3369(Subplot)
 1 0.000 0.000 0.010 0.010 axes.py:3383(__init__)
 1 0.000 0.000 0.000 0.000 axes.py:3389(PolarAxes)
 1 0.000 0.000 0.010 0.010 axes.py:344(_init_axis)
 1 0.000 0.000 0.000 0.000 axes.py:349(set_figure)
 1 0.000 0.000 0.000 0.000 axes.py:3704(PolarSubplot)
 1 0.000 0.000 0.000 0.000 axes.py:375(_set_lim_and_transforms)
 1 0.000 0.000 0.010 0.010 axes.py:408(axhline)
 1 0.000 0.000 0.000 0.000 axes.py:50(_process_plot_format)
 2 0.000 0.000 0.000 0.000 axes.py:592(has_data)
 3 0.000 0.000 0.000 0.000 axes.py:601(_set_artist_props)
 1 0.000 0.000 0.000 0.000 axes.py:608(cla)
 2 0.000 0.000 0.000 0.000 axes.py:681(update_datalim)
 2 0.010 0.005 0.010 0.005 axes.py:689(add_line)
 1 0.000 0.000 0.000 0.000 axes.py:705(_get_verts_in_data_coords)
 2 0.000 0.000 0.000 0.000 axes.py:729(autoscale_view)
 69 0.000 0.000 0.000 0.000 axis.py:125(get_loc)
 69 0.000 0.000 0.160 0.002 axis.py:129(draw)
 69 0.000 0.000 0.000 0.000 axis.py:158(set_label1)
 69 0.000 0.000 0.000 0.000 axis.py:165(set_label2)
 220 0.000 0.000 0.000 0.000 axis.py:173(_set_artist_props)
 1 0.000 0.000 0.000 0.000 axis.py:183(XTick)
 12 0.000 0.000 0.020 0.002 axis.py:189(_get_text1)
 12 0.010 0.001 0.010 0.001 axis.py:215(_get_text2)
 1 0.000 0.000 0.000 0.000 axis.py:23(Tick)
 12 0.000 0.000 0.010 0.001 axis.py:236(_get_tick1line)
 12 0.000 0.000 0.000 0.000 axis.py:251(_get_tick2line)
 12 0.000 0.000 0.000 0.000 axis.py:266(_get_gridline)
 27 0.000 0.000 0.010 0.000 axis.py:282(update_position)
 27 0.000 0.000 0.000 0.000 axis.py:294(get_view_interval)
 1 0.000 0.000 0.060 0.060 axis.py:3(?)
 1 0.000 0.000 0.000 0.000 axis.py:303(YTick)
 32 0.000 0.000 0.000 0.000 axis.py:311(_get_text1)
 32 0.000 0.000 0.000 0.000 axis.py:333(_get_text2)
 32 0.000 0.000 0.020 0.001 axis.py:353(_get_tick1line)
 32 0.000 0.000 0.000 0.000 axis.py:367(_get_tick2line)
 32 0.000 0.000 0.000 0.000 axis.py:381(_get_gridline)
 42 0.000 0.000 0.000 0.000 axis.py:399(update_position)
 42 0.000 0.000 0.000 0.000 axis.py:412(get_view_interval)
 1 0.000 0.000 0.000 0.000 axis.py:421(Ticker)
 1 0.000 0.000 0.000 0.000 axis.py:426(Axis)
 2 0.000 0.000 0.010 0.005 axis.py:436(__init__)
 44 0.000 0.000 0.070 0.002 axis.py:44(__init__)
 4 0.000 0.000 0.010 0.003 axis.py:453(cla)
 6 0.000 0.000 0.000 0.000 axis.py:484(_set_artist_props)
 6 0.010 0.002 0.240 0.040 axis.py:488(draw)
 36 0.000 0.000 0.000 0.000 axis.py:595(_copy_tick_props)
 4 0.000 0.000 0.000 0.000 axis.py:610(get_major_locator)
 6 0.000 0.000 0.040 0.007 axis.py:626(get_major_ticks)
 6 0.000 0.000 0.020 0.003 axis.py:645(get_minor_ticks)
 4 0.000 0.000 0.000 0.000 axis.py:659(grid)
 5 0.000 0.000 0.000 0.000 axis.py:680(set_major_formatter)
 4 0.000 0.000 0.000 0.000 axis.py:689(set_minor_formatter)
 5 0.000 0.000 0.000 0.000 axis.py:699(set_major_locator)
 5 0.000 0.000 0.000 0.000 axis.py:709(set_minor_locator)
 1 0.000 0.000 0.000 0.000 axis.py:760(XAxis)
 12 0.000 0.000 0.040 0.003 axis.py:763(_get_tick)
 1 0.000 0.000 0.000 0.000 axis.py:766(_get_label)
 3 0.000 0.000 0.000 0.000 axis.py:801(_update_label_postion)
 11 0.000 0.000 0.000 0.000 axis.py:848(get_view_interval)
 8 0.000 0.000 0.000 0.000 axis.py:852(get_data_interval)
 1 0.000 0.000 0.000 0.000 axis.py:858(YAxis)
 32 0.000 0.000 0.030 0.001 axis.py:861(_get_tick)
 1 0.000 0.000 0.000 0.000 axis.py:865(_get_label)
 3 0.000 0.000 0.000 0.000 axis.py:902(_update_label_postion)
 14 0.000 0.000 0.000 0.000 axis.py:949(get_view_interval)
 11 0.000 0.000 0.000 0.000 axis.py:953(get_data_interval)
 1 0.000 0.000 0.000 0.000 backend_agg.py:100(__init__)
 1940 0.110 0.000 0.120 0.000 backend_agg.py:140(draw_line)
 78 0.010 0.000 0.020 0.000 backend_agg.py:185(draw_text)
 43 0.000 0.000 0.020 0.000 backend_agg.py:206(get_text_width_height)
 36 0.000 0.000 0.000 0.000 backend_agg.py:223(get_canvas_width_height)
 121 0.020 0.000 0.030 0.000 backend_agg.py:228(_get_agg_font)
 84 0.000 0.000 0.000 0.000 backend_agg.py:249(points_to_pixels)
 1 0.000 0.000 0.000 0.000 backend_agg.py:274(new_figure_manager)
 1 0.000 0.000 0.000 0.000 backend_agg.py:286(FigureCanvasAgg)
 2 0.000 0.000 0.320 0.160 backend_agg.py:297(draw)
 2 0.060 0.030 0.760 0.380 backend_agg.py:326(print_figure)
 1 0.010 0.010 0.020 0.020 backend_agg.py:70(?)
 1 0.000 0.000 0.000 0.000 backend_agg.py:93(RendererAgg)
 1 0.000 0.000 0.000 0.000 backend_bases.py:16(RendererBase)
 84 0.000 0.000 0.000 0.000 backend_bases.py:20(open_group)
 84 0.000 0.000 0.000 0.000 backend_bases.py:26(close_group)
 312 0.000 0.000 0.000 0.000 backend_bases.py:332(new_gc)
 1 0.000 0.000 0.000 0.000 backend_bases.py:339(GraphicsContextBase)
 468 0.000 0.000 0.000 0.000 backend_bases.py:351(__init__)
 1037 0.000 0.000 0.000 0.000 backend_bases.py:385(get_capstyle)
 1037 0.000 0.000 0.000 0.000 backend_bases.py:391(get_clip_rectangle)
 1037 0.000 0.000 0.000 0.000 backend_bases.py:397(get_dashes)
 1 0.000 0.000 0.000 0.000 backend_bases.py:4(?)
 1037 0.000 0.000 0.000 0.000 backend_bases.py:407(get_joinstyle)
 1037 0.000 0.000 0.000 0.000 backend_bases.py:420(get_linewidth)
 1076 0.000 0.000 0.000 0.000 backend_bases.py:426(get_rgb)
 36 0.000 0.000 0.000 0.000 backend_bases.py:43(flipy)
 276 0.000 0.000 0.000 0.000 backend_bases.py:433(set_alpha)
 201 0.000 0.000 0.000 0.000 backend_bases.py:440(set_antialiased)
 201 0.000 0.000 0.000 0.000 backend_bases.py:449(set_capstyle)
 144 0.000 0.000 0.000 0.000 backend_bases.py:458(set_clip_rectangle)
 256 0.000 0.000 0.000 0.000 backend_bases.py:464(set_dashes)
 42 0.000 0.000 0.000 0.000 backend_bases.py:47(points_to_pixels)
 468 0.000 0.000 0.020 0.000 backend_bases.py:472(set_foreground)
 60 0.000 0.000 0.000 0.000 backend_bases.py:493(set_joinstyle)
 393 0.000 0.000 0.000 0.000 backend_bases.py:502(set_linewidth)
 192 0.000 0.000 0.000 0.000 backend_bases.py:508(set_linestyle)
 1 0.000 0.000 0.000 0.000 backend_bases.py:521(Event)
 1 0.000 0.000 0.000 0.000 backend_bases.py:534(LocationEvent)
 1 0.000 0.000 0.000 0.000 backend_bases.py:577(MouseEvent)
 1 0.000 0.000 0.000 0.000 backend_bases.py:623(KeyEvent)
 1 0.000 0.000 0.000 0.000 backend_bases.py:647(FigureCanvasBase)
 2 0.000 0.000 0.000 0.000 backend_bases.py:664(__init__)
 1 0.000 0.000 0.000 0.000 backend_bases.py:739(switch_backends)
 1 0.000 0.000 0.000 0.000 backend_bases.py:751(mpl_connect)
 1 0.000 0.000 0.000 0.000 backend_bases.py:787(FigureManagerBase)
 1 0.000 0.000 0.000 0.000 backend_bases.py:795(__init__)
 1 0.000 0.000 0.000 0.000 backend_bases.py:821(Cursors)
 1 0.000 0.000 0.000 0.000 backend_bases.py:827(NavigationToolbar2)
 1079 0.000 0.000 0.000 0.000 backend_ps.py:103(set_color)
 1037 0.000 0.000 0.000 0.000 backend_ps.py:111(set_linewidth)
 1037 0.000 0.000 0.000 0.000 backend_ps.py:116(set_linejoin)
 1037 0.020 0.000 0.020 0.000 backend_ps.py:121(set_linecap)
 1037 0.010 0.000 0.020 0.000 backend_ps.py:126(set_linedash)
 39 0.000 0.000 0.000 0.000 backend_ps.py:138(set_font)
 41 0.010 0.000 0.010 0.000 backend_ps.py:150(get_text_width_height)
 25 0.000 0.000 0.000 0.000 backend_ps.py:167(flipy)
 80 0.000 0.000 0.000 0.000 backend_ps.py:171(_get_font)
 970 0.020 0.000 0.270 0.000 backend_ps.py:276(draw_line)
 64 0.010 0.000 0.010 0.000 backend_ps.py:283(_draw_lines)
 64 0.000 0.000 0.010 0.000 backend_ps.py:292(draw_lines)
 3 0.000 0.000 0.000 0.000 backend_ps.py:312(draw_polygon)
 39 0.000 0.000 0.010 0.000 backend_ps.py:337(draw_text)
 156 0.000 0.000 0.000 0.000 backend_ps.py:363(new_gc)
 1037 0.100 0.000 0.250 0.000 backend_ps.py:385(_draw_ps)
 1 0.000 0.000 0.000 0.000 backend_ps.py:4(?)
 3947 0.040 0.000 0.100 0.000 backend_ps.py:41(_num_to_str)
 1 0.000 0.000 0.000 0.000 backend_ps.py:420(GraphicsContextPS)
 64 0.000 0.000 0.000 0.000 backend_ps.py:422(set_linestyle)
 1 0.020 0.020 0.020 0.020 backend_ps.py:437(encodeTTFasPS)
 991 0.020 0.000 0.120 0.000 backend_ps.py:50(_nums_to_str)
 1 0.000 0.000 0.000 0.000 backend_ps.py:514(FigureCanvasPS)
 1 0.000 0.000 0.380 0.380 backend_ps.py:520(print_figure)
 39 0.000 0.000 0.000 0.000 backend_ps.py:53(quote_ps_string)
 1 0.000 0.000 0.000 0.000 backend_ps.py:645(FigureManagerPS)
 1036 0.010 0.000 0.010 0.000 backend_ps.py:66(seq_allequal)
 1 0.000 0.000 0.000 0.000 backend_ps.py:83(RendererPS)
 1 0.000 0.000 0.000 0.000 backend_ps.py:89(__init__)
 1 0.000 0.000 0.000 0.000 bisect.py:1(?)
 1 0.000 0.000 0.000 0.000 calendar.py:30(_localized_month)
 2 0.000 0.000 0.000 0.000 calendar.py:31(__init__)
 1 0.000 0.000 0.000 0.000 calendar.py:43(_localized_day)
 2 0.000 0.000 0.000 0.000 calendar.py:44(__init__)
 1 0.000 0.000 0.000 0.000 calendar.py:6(?)
 1 0.000 0.000 0.000 0.000 cbook.py:101(Sorter)
 1 0.000 0.000 0.000 0.000 cbook.py:11(silent_list)
 1 0.000 0.000 0.000 0.000 cbook.py:151(Xlator)
 1 0.000 0.000 0.000 0.000 cbook.py:212(Null)
 1 0.000 0.000 0.000 0.000 cbook.py:236(dict_delall)
 1 0.000 0.000 0.000 0.000 cbook.py:243(RingBuffer)
 1 0.000 0.000 0.000 0.000 cbook.py:249(__Full)
 129 0.000 0.000 0.000 0.000 cbook.py:278(enumerate)
 1 0.000 0.000 0.000 0.000 cbook.py:34(Bunch)
 1 0.010 0.010 0.010 0.010 cbook.py:4(?)
 4 0.000 0.000 0.000 0.000 cbook.py:431(popd)
 1 0.000 0.000 0.000 0.000 cbook.py:457(Stack)
 1 0.000 0.000 0.000 0.000 cbook.py:464(__init__)
 10 0.000 0.000 0.000 0.000 cbook.py:468(__call__)
 2 0.000 0.000 0.000 0.000 cbook.py:484(push)
 3 0.000 0.000 0.000 0.000 cbook.py:503(clear)
 1 0.000 0.000 0.000 0.000 cbook.py:508(bubble)
 8 0.000 0.000 0.000 0.000 cbook.py:531(popall)
 281 0.000 0.000 0.000 0.000 cbook.py:54(iterable)
 4384 0.060 0.000 0.060 0.000 cbook.py:60(is_string_like)
 2 0.000 0.000 0.000 0.000 cbook.py:75(is_scalar)
 3 0.000 0.000 0.000 0.000 cbook.py:78(flatten)
 1 0.000 0.000 0.060 0.060 cm.py:3(?)
 1 0.000 0.000 0.000 0.000 cm.py:398(ScalarMappable)
 1 0.000 0.000 0.000 0.000 collections.py:159(PolyCollection)
 1 0.000 0.000 0.000 0.000 collections.py:21(Collection)
 1 0.000 0.000 0.000 0.000 collections.py:213(RegularPolyCollection)
 1 0.000 0.000 0.000 0.000 collections.py:276(LineCollection)
 1 0.000 0.000 0.000 0.000 collections.py:64(PatchCollection)
 1 0.000 0.000 0.000 0.000 collections.py:9(?)
 1 0.000 0.000 0.060 0.060 colors.py:30(?)
 333 0.010 0.000 0.010 0.000 colors.py:339(hex2color)
 1 0.000 0.000 0.000 0.000 colors.py:345(ColorConverter)
 477 0.010 0.000 0.020 0.000 colors.py:358(to_rgb)
 1 0.000 0.000 0.000 0.000 colors.py:458(Colormap)
 1 0.000 0.000 0.000 0.000 colors.py:469(LinearSegmentedColormap)
 14 0.000 0.000 0.000 0.000 colors.py:478(__init__)
 1 0.000 0.000 0.000 0.000 colors.py:530(normalize)
 2 0.000 0.000 0.000 0.000 copy.py:133(_copy_dict)
 162 0.000 0.000 0.000 0.000 copy.py:315(_reconstruct)
 1 0.000 0.000 0.000 0.000 copy.py:373(_EmptyClass)
 1 0.000 0.000 0.000 0.000 copy.py:49(?)
 1 0.000 0.000 0.000 0.000 copy.py:54(Error)
 164 0.000 0.000 0.000 0.000 copy.py:65(copy)
 2 0.000 0.000 0.000 0.000 copy_reg.py:14(pickle)
 2 0.000 0.000 0.000 0.000 copy_reg.py:27(constructor)
 162 0.000 0.000 0.000 0.000 copy_reg.py:91(__newobj__)
 12 0.000 0.000 0.000 0.000 copy_reg.py:94(_slotnames)
 1 0.000 0.000 0.000 0.000 dates.py:207(DateFormatter)
 1 0.000 0.000 0.000 0.000 dates.py:285(IndexDateFormatter)
 1 0.000 0.000 0.000 0.000 dates.py:308(rrulewrapper)
 1 0.000 0.000 0.000 0.000 dates.py:324(DateLocator)
 1 0.000 0.000 0.000 0.000 dates.py:347(RRuleLocator)
 1 0.000 0.000 0.000 0.000 dates.py:386(YearLocator)
 1 0.000 0.000 0.000 0.000 dates.py:446(MonthLocator)
 1 0.000 0.000 0.000 0.000 dates.py:463(WeekdayLocator)
 1 0.000 0.000 0.000 0.000 dates.py:484(DayLocator)
 1 0.000 0.000 0.000 0.000 dates.py:498(HourLocator)
 1 0.000 0.000 0.000 0.000 dates.py:516(MinuteLocator)
 1 0.000 0.000 0.000 0.000 dates.py:534(SecondLocator)
 1 0.000 0.000 0.000 0.000 dates.py:77(?)
 1 0.000 0.000 0.000 0.000 errors.py:15(DistutilsError)
 1 0.000 0.000 0.000 0.000 errors.py:19(DistutilsModuleError)
 1 0.000 0.000 0.000 0.000 errors.py:24(DistutilsClassError)
 1 0.000 0.000 0.000 0.000 errors.py:31(DistutilsGetoptError)
 1 0.000 0.000 0.000 0.000 errors.py:35(DistutilsArgError)
 1 0.000 0.000 0.000 0.000 errors.py:40(DistutilsFileError)
 1 0.000 0.000 0.000 0.000 errors.py:46(DistutilsOptionError)
 1 0.000 0.000 0.000 0.000 errors.py:55(DistutilsSetupError)
 1 0.000 0.000 0.000 0.000 errors.py:60(DistutilsPlatformError)
 1 0.000 0.000 0.000 0.000 errors.py:66(DistutilsExecError)
 1 0.000 0.000 0.000 0.000 errors.py:71(DistutilsInternalError)
 1 0.000 0.000 0.000 0.000 errors.py:76(DistutilsTemplateError)
 1 0.000 0.000 0.000 0.000 errors.py:81(CCompilerError)
 1 0.000 0.000 0.000 0.000 errors.py:84(PreprocessError)
 1 0.000 0.000 0.000 0.000 errors.py:87(CompileError)
 1 0.000 0.000 0.000 0.000 errors.py:9(?)
 1 0.000 0.000 0.000 0.000 errors.py:90(LibError)
 1 0.000 0.000 0.000 0.000 errors.py:94(LinkError)
 1 0.000 0.000 0.000 0.000 errors.py:98(UnknownFileError)
 1 0.000 0.000 0.000 0.000 figure.py:1(?)
 1 0.000 0.000 0.000 0.000 figure.py:16(Figure)
 1 0.000 0.000 0.000 0.000 figure.py:160(get_size_inches)
 3 0.000 0.000 0.000 0.000 figure.py:163(get_edgecolor)
 3 0.000 0.000 0.000 0.000 figure.py:167(get_facecolor)
 6 0.000 0.000 0.000 0.000 figure.py:171(set_edgecolor)
 6 0.000 0.000 0.000 0.000 figure.py:178(set_facecolor)
 1 0.000 0.000 0.000 0.000 figure.py:18(__init__)
 1 0.000 0.000 0.010 0.010 figure.py:243(add_subplot)
 1 0.000 0.000 0.000 0.000 figure.py:285(clf)
 3 0.000 0.000 0.680 0.227 figure.py:304(draw)
 1 0.000 0.000 0.000 0.000 figure.py:404(_set_artist_props)
 8 0.000 0.000 0.010 0.001 figure.py:416(gca)
 1 0.000 0.000 0.000 0.000 figure.py:424(sca)
 2 0.000 0.000 0.760 0.380 figure.py:435(savefig)
 2 0.000 0.000 0.000 0.000 figure.py:65(set_canvas)
 2 0.000 0.000 0.000 0.000 figure.py:69(hold)
 1 0.000 0.000 0.000 0.000 fnmatch.py:11(?)
 28 0.000 0.000 0.000 0.000 fnmatch.py:40(filter)
 2 0.000 0.000 0.000 0.000 fnmatch.py:72(translate)
 2 0.000 0.000 0.000 0.000 font_manager.py:124(x11FontDirectory)
 4 0.010 0.003 0.040 0.010 font_manager.py:145(findSystemFonts)
 6 0.000 0.000 0.000 0.000 font_manager.py:175(weight_as_number)
 1 0.010 0.010 0.010 0.010 font_manager.py:192(FontKey)
 6 0.000 0.000 0.000 0.000 font_manager.py:197(__init__)
 1 0.000 0.000 0.060 0.060 font_manager.py:34(?)
 6 0.000 0.000 0.000 0.000 font_manager.py:365(add_filename)
 1 0.000 0.000 0.000 0.000 font_manager.py:442(setWeights)
 1 0.000 0.000 0.000 0.000 font_manager.py:489(FontProperties)
 192 0.000 0.000 0.000 0.000 font_manager.py:544(__init__)
 357 0.000 0.000 0.000 0.000 font_manager.py:573(__hash__)
 12 0.000 0.000 0.000 0.000 font_manager.py:583(get_family)
 6 0.000 0.000 0.000 0.000 font_manager.py:594(get_style)
 6 0.000 0.000 0.000 0.000 font_manager.py:599(get_variant)
 6 0.000 0.000 0.000 0.000 font_manager.py:604(get_weight)
 6 0.000 0.000 0.000 0.000 font_manager.py:610(get_stretch)
 28 0.000 0.000 0.000 0.000 font_manager.py:683(set_size)
 275 0.000 0.000 0.000 0.000 font_manager.py:688(get_size_in_points)
 100 0.000 0.000 0.000 0.000 font_manager.py:702(copy)
 1 0.000 0.000 0.000 0.000 font_manager.py:711(ttfdict_to_fnames)
 1 0.000 0.000 0.000 0.000 font_manager.py:723(FontManager)
 1 0.010 0.010 0.050 0.050 font_manager.py:734(__init__)
 192 0.000 0.000 0.000 0.000 font_manager.py:811(get_default_size)
 6 0.000 0.000 0.010 0.002 font_manager.py:830(findfont)
 1 0.000 0.000 0.000 0.000 glob.py:1(?)
 30 0.020 0.001 0.030 0.001 glob.py:42(glob1)
 4092 0.010 0.000 0.010 0.000 glob.py:49(<lambda>)
 90 0.000 0.000 0.000 0.000 glob.py:55(has_magic)
 30 0.000 0.000 0.030 0.001 glob.py:9(glob)
 1 0.000 0.000 0.000 0.000 image.py:18(AxesImage)
 1 0.000 0.000 0.000 0.000 image.py:282(FigureImage)
 1 0.000 0.000 0.000 0.000 image.py:5(?)
 5 0.000 0.000 0.000 0.000 legend.py:160(_set_artist_props)
 3 0.000 0.000 0.000 0.000 legend.py:164(_approx_text_height)
 3 0.000 0.000 0.040 0.013 legend.py:168(draw)
 3 0.000 0.000 0.000 0.000 legend.py:191(_get_handle_text_bbox)
 1 0.000 0.000 0.000 0.000 legend.py:208(_get_handles)
 1 0.000 0.000 0.000 0.000 legend.py:22(?)
 1 0.000 0.000 0.000 0.000 legend.py:267(_get_texts)
 3 0.000 0.000 0.000 0.000 legend.py:294(_offset)
 3 0.000 0.000 0.020 0.007 legend.py:312(_update_positions)
 6 0.000 0.000 0.020 0.003 legend.py:316(get_tbounds)
 1 0.000 0.000 0.000 0.000 legend.py:40(Legend)
 1 0.000 0.000 0.000 0.000 legend.py:81(__init__)
 6 0.000 0.000 0.000 0.000 lines.py:146(get_window_extent)
 355 0.000 0.000 0.000 0.000 lines.py:168(set_data)
 2 0.000 0.000 0.000 0.000 lines.py:201(set_data_clipping)
 198 0.000 0.000 0.010 0.000 lines.py:215(_get_numeric_clipped_data_in_range)
 192 0.030 0.000 0.490 0.003 lines.py:250(draw)
 2 0.000 0.000 0.000 0.000 lines.py:293(get_markersize)
 8 0.000 0.000 0.000 0.000 lines.py:294(get_xdata)
 8 0.000 0.000 0.000 0.000 lines.py:295(get_ydata)
 1 0.000 0.000 0.000 0.000 lines.py:35(Line2D)
 1 0.000 0.000 0.000 0.000 lines.py:360(set_color)
 1 0.000 0.000 0.000 0.000 lines.py:368(set_linewidth)
 136 0.000 0.000 0.000 0.000 lines.py:385(set_marker)
 1 0.000 0.000 0.000 0.000 lines.py:4(?)
 2 0.000 0.000 0.000 0.000 lines.py:419(set_markersize)
 81 0.010 0.000 0.010 0.000 lines.py:427(set_xdata)
 132 0.000 0.000 0.000 0.000 lines.py:438(set_ydata)
 66 0.000 0.000 0.000 0.000 lines.py:487(_draw_nothing)
 132 0.010 0.000 0.020 0.000 lines.py:501(_draw_solid)
 60 0.010 0.000 0.010 0.000 lines.py:525(_draw_dotted)
 39 0.000 0.000 0.010 0.000 lines.py:689(_draw_tickleft)
 39 0.000 0.000 0.000 0.000 lines.py:694(_draw_tickright)
 21 0.010 0.000 0.010 0.000 lines.py:700(_draw_tickup)
 21 0.000 0.000 0.010 0.000 lines.py:706(_draw_tickdown)
 6 0.020 0.003 0.390 0.065 lines.py:711(_draw_plus)
 136 0.000 0.000 0.030 0.000 lines.py:75(__init__)
 110 0.000 0.000 0.000 0.000 lines.py:759(update_from)
 1 0.000 0.000 0.000 0.000 lines.py:799(set_lw)
 1 0.000 0.000 0.010 0.010 mathtext.py:141(?)
 1 0.000 0.000 0.000 0.000 mathtext.py:175(Fonts)
 1 0.000 0.000 0.000 0.000 mathtext.py:211(DummyFonts)
 1 0.000 0.000 0.000 0.000 mathtext.py:226(BakomaTrueTypeFonts)
 1 0.000 0.000 0.000 0.000 mathtext.py:334(BakomaPSFonts)
 1 0.000 0.000 0.000 0.000 mathtext.py:434(Element)
 1 0.000 0.000 0.000 0.000 mathtext.py:554(SpaceElement)
 1 0.000 0.000 0.000 0.000 mathtext.py:597(SymbolElement)
 1 0.000 0.000 0.000 0.000 mathtext.py:654(GroupElement)
 1 0.000 0.000 0.000 0.000 mathtext.py:719(ExpressionElement)
 1 0.000 0.000 0.000 0.000 mathtext.py:728(Handler)
 1 0.000 0.000 0.000 0.000 mlab.py:55(?)
 1 0.000 0.000 0.000 0.000 mlab.py:85(linspace)
 1 0.000 0.000 0.000 0.000 numeric_version.py:1(?)
 1 0.000 0.000 0.000 0.000 patches.py:1(?)
 1 0.000 0.000 0.000 0.000 patches.py:10(Patch)
 9 0.000 0.000 0.000 0.000 patches.py:115(draw)
 1 0.000 0.000 0.000 0.000 patches.py:184(Shadow)
 3 0.000 0.000 0.000 0.000 patches.py:19(__init__)
 1 0.000 0.000 0.000 0.000 patches.py:222(Rectangle)
 3 0.000 0.000 0.000 0.000 patches.py:229(__init__)
 9 0.000 0.000 0.000 0.000 patches.py:245(get_verts)
 3 0.000 0.000 0.000 0.000 patches.py:254(get_x)
 3 0.000 0.000 0.000 0.000 patches.py:258(get_y)
 3 0.000 0.000 0.000 0.000 patches.py:270(set_x)
 3 0.000 0.000 0.000 0.000 patches.py:278(set_y)
 3 0.000 0.000 0.000 0.000 patches.py:302(set_bounds)
 1 0.000 0.000 0.000 0.000 patches.py:317(RegularPolygon)
 1 0.000 0.000 0.000 0.000 patches.py:347(Polygon)
 1 0.000 0.000 0.000 0.000 patches.py:359(Wedge)
 1 0.000 0.000 0.000 0.000 patches.py:381(Circle)
 3 0.000 0.000 0.000 0.000 patches.py:60(get_edgecolor)
 3 0.000 0.000 0.000 0.000 patches.py:63(get_facecolor)
 6 0.000 0.000 0.000 0.000 patches.py:77(set_edgecolor)
 6 0.000 0.000 0.000 0.000 patches.py:85(set_facecolor)
 1 0.000 0.000 0.000 0.000 patches.py:93(set_linewidth)
 1 0.000 0.000 0.000 0.000 pickle.py:1273(_EmptyClass)
 1 0.000 0.000 0.000 0.000 pickle.py:172(Pickler)
 1 0.010 0.010 0.010 0.010 pickle.py:25(?)
 1 0.000 0.000 0.000 0.000 pickle.py:59(PickleError)
 1 0.000 0.000 0.000 0.000 pickle.py:63(PicklingError)
 1 0.000 0.000 0.000 0.000 pickle.py:70(UnpicklingError)
 1 0.000 0.000 0.000 0.000 pickle.py:83(_Stop)
 1 0.000 0.000 0.000 0.000 pickle.py:841(Unpickler)
 1 0.000 0.000 0.000 0.000 posixpath.py:117(dirname)
 192 0.000 0.000 0.000 0.000 posixpath.py:171(exists)
 4 0.000 0.000 0.000 0.000 posixpath.py:184(isdir)
 3 0.000 0.000 0.000 0.000 posixpath.py:197(isfile)
 146 0.000 0.000 0.000 0.000 posixpath.py:366(normpath)
 28 0.000 0.000 0.000 0.000 posixpath.py:39(normcase)
 144 0.000 0.000 0.000 0.000 posixpath.py:393(abspath)
 144 0.000 0.000 0.000 0.000 posixpath.py:47(isabs)
 181 0.000 0.000 0.000 0.000 posixpath.py:56(join)
 31 0.000 0.000 0.000 0.000 posixpath.py:74(split)
 3 0.000 0.000 0.000 0.000 posixpath.py:89(splitext)
 1 0.000 0.000 0.980 0.980 profile:0(execfile('testlog.py'))
 0 0.000 0.000 profile:0(profiler)
 1 0.000 0.000 0.200 0.200 pylab.py:1(?)
 1 0.000 0.000 0.000 0.000 pylab.py:1038(_ObjectInspector)
 1 0.000 0.000 0.010 0.010 pylab.py:1676(axhline)
 1 0.010 0.010 0.170 0.170 pylab.py:184(?)
 1 0.000 0.000 0.010 0.010 pylab.py:2204(semilogy)
 1 0.000 0.000 0.000 0.000 pylab.py:2349(grid)
 1 0.000 0.000 0.000 0.000 pylab.py:2362(legend)
 2 0.000 0.000 0.760 0.380 pylab.py:763(savefig)
 1 0.000 0.000 0.000 0.000 pylab.py:773(figure)
 8 0.000 0.000 0.010 0.001 pylab.py:834(gca)
 12 0.000 0.000 0.000 0.000 pylab.py:853(gcf)
 2 0.000 0.000 0.000 0.000 pylab.py:906(hold)
 2 0.000 0.000 0.010 0.005 pylab.py:921(ishold)
 1 0.000 0.000 0.000 0.000 pylab.py:938(load)
 2 0.000 0.000 0.000 0.000 pylab.py:993(rc)
 1 0.000 0.000 0.000 0.000 pyparsing.py:100(RecursiveGrammarException)
 1 0.000 0.000 0.000 0.000 pyparsing.py:1004(StringStart)
 1 0.000 0.000 0.000 0.000 pyparsing.py:1022(StringEnd)
 1 0.000 0.000 0.000 0.000 pyparsing.py:1039(ParseExpression)
 103 0.000 0.000 0.000 0.000 pyparsing.py:1041(__init__)
 67/11 0.000 0.000 0.000 0.000 pyparsing.py:1058(leaveWhitespace)
 1 0.000 0.000 0.000 0.000 pyparsing.py:108(ParseResults)
 19/5 0.000 0.000 0.000 0.000 pyparsing.py:1087(streamline)
 1 0.000 0.000 0.000 0.000 pyparsing.py:1127(And)
 40 0.000 0.000 0.000 0.000 pyparsing.py:1132(__init__)
 1 0.000 0.000 0.000 0.000 pyparsing.py:1173(Or)
 15 0.000 0.000 0.000 0.000 pyparsing.py:1178(__init__)
 1 0.000 0.000 0.000 0.000 pyparsing.py:1230(MatchFirst)
 48 0.000 0.000 0.000 0.000 pyparsing.py:1235(__init__)
 2/1 0.000 0.000 0.000 0.000 pyparsing.py:1269(__str__)
 1 0.000 0.000 0.000 0.000 pyparsing.py:1284(ParseElementEnhance)
 47 0.000 0.000 0.000 0.000 pyparsing.py:1286(__init__)
 28/12 0.000 0.000 0.000 0.000 pyparsing.py:1304(leaveWhitespace)
 15/5 0.000 0.000 0.000 0.000 pyparsing.py:1323(streamline)
 2 0.000 0.000 0.000 0.000 pyparsing.py:1342(__str__)
 1 0.000 0.000 0.000 0.000 pyparsing.py:1353(NotAny)
 5 0.000 0.000 0.000 0.000 pyparsing.py:1359(__init__)
 1 0.000 0.000 0.000 0.000 pyparsing.py:1390(ZeroOrMore)
 5 0.000 0.000 0.000 0.000 pyparsing.py:1392(__init__)
 1 0.000 0.000 0.000 0.000 pyparsing.py:1427(OneOrMore)
 1 0.000 0.000 0.000 0.000 pyparsing.py:1460(Optional)
 9 0.000 0.000 0.000 0.000 pyparsing.py:1465(__init__)
 1 0.000 0.000 0.000 0.000 pyparsing.py:1481(__str__)
 1 0.000 0.000 0.000 0.000 pyparsing.py:1491(SkipTo)
 1 0.000 0.000 0.000 0.000 pyparsing.py:1531(Forward)
 4 0.000 0.000 0.000 0.000 pyparsing.py:1536(__init__)
 4 0.000 0.000 0.000 0.000 pyparsing.py:1539(__lshift__)
 1 0.000 0.000 0.000 0.000 pyparsing.py:1576(_ForwardNoRecurse)
 1 0.000 0.000 0.000 0.000 pyparsing.py:1580(TokenConverter)
 21 0.000 0.000 0.000 0.000 pyparsing.py:1582(__init__)
 1 0.000 0.000 0.000 0.000 pyparsing.py:1586(Upcase)
 1 0.000 0.000 0.000 0.000 pyparsing.py:1592(Combine)
 10 0.000 0.000 0.000 0.000 pyparsing.py:1597(__init__)
 1 0.000 0.000 0.000 0.000 pyparsing.py:1616(Group)
 8 0.000 0.000 0.000 0.000 pyparsing.py:1618(__init__)
 1 0.000 0.000 0.000 0.000 pyparsing.py:1625(Dict)
 1 0.000 0.000 0.000 0.000 pyparsing.py:1652(Suppress)
 1 0.000 0.000 0.000 0.000 pyparsing.py:1663(delimitedList)
 1 0.000 0.000 0.000 0.000 pyparsing.py:27(?)
 1 0.000 0.000 0.000 0.000 pyparsing.py:346(ParserElement)
 230 0.000 0.000 0.000 0.000 pyparsing.py:348(__init__)
 19 0.000 0.000 0.000 0.000 pyparsing.py:365(setName)
 10 0.000 0.000 0.000 0.000 pyparsing.py:383(setParseAction)
 40 0.000 0.000 0.000 0.000 pyparsing.py:548(__add__)
 1 0.000 0.000 0.000 0.000 pyparsing.py:554(__radd__)
 48 0.000 0.000 0.000 0.000 pyparsing.py:560(__or__)
 15 0.000 0.000 0.000 0.000 pyparsing.py:572(__xor__)
 4 0.000 0.000 0.000 0.000 pyparsing.py:584(__invert__)
 2 0.000 0.000 0.000 0.000 pyparsing.py:588(suppress)
 81 0.000 0.000 0.000 0.000 pyparsing.py:594(leaveWhitespace)
 20 0.000 0.000 0.000 0.000 pyparsing.py:622(__str__)
 58 0.000 0.000 0.000 0.000 pyparsing.py:628(streamline)
 1 0.000 0.000 0.000 0.000 pyparsing.py:654(Token)
 80 0.000 0.000 0.000 0.000 pyparsing.py:656(__init__)
 1 0.000 0.000 0.000 0.000 pyparsing.py:660(setName)
 1 0.000 0.000 0.000 0.000 pyparsing.py:667(Empty)
 1 0.000 0.000 0.000 0.000 pyparsing.py:669(__init__)
 1 0.000 0.000 0.000 0.000 pyparsing.py:676(Literal)
 65 0.010 0.000 0.010 0.000 pyparsing.py:678(__init__)
 1 0.000 0.000 0.000 0.000 pyparsing.py:70(ParseException)
 1 0.000 0.000 0.000 0.000 pyparsing.py:707(CaselessLiteral)
 1 0.000 0.000 0.000 0.000 pyparsing.py:730(Word)
 8 0.000 0.000 0.000 0.000 pyparsing.py:737(__init__)
 85 0.000 0.000 0.000 0.000 pyparsing.py:75(__init__)
 8 0.000 0.000 0.000 0.000 pyparsing.py:785(__str__)
 10 0.000 0.000 0.000 0.000 pyparsing.py:794(charsAsStr)
 1 0.000 0.000 0.000 0.000 pyparsing.py:808(CharsNotIn)
 5 0.000 0.000 0.000 0.000 pyparsing.py:813(__init__)
 5 0.000 0.000 0.000 0.000 pyparsing.py:860(__str__)
 1 0.000 0.000 0.000 0.000 pyparsing.py:874(White)
 1 0.000 0.000 0.000 0.000 pyparsing.py:931(PositionToken)
 1 0.000 0.000 0.000 0.000 pyparsing.py:932(__init__)
 1 0.000 0.000 0.000 0.000 pyparsing.py:937(GoToColumn)
 1 0.000 0.000 0.000 0.000 pyparsing.py:960(LineStart)
 1 0.000 0.000 0.000 0.000 pyparsing.py:983(LineEnd)
 1 0.000 0.000 0.000 0.000 pyparsing.py:985(__init__)
 1 0.000 0.000 0.000 0.000 random.py:40(?)
 1 0.000 0.000 0.000 0.000 random.py:624(WichmannHill)
 1 0.000 0.000 0.000 0.000 random.py:64(Random)
 1 0.000 0.000 0.000 0.000 random.py:81(__init__)
 1 0.000 0.000 0.000 0.000 random.py:90(seed)
 1 0.000 0.000 0.010 0.010 re.py:1(?)
 1 0.000 0.000 0.000 0.000 relativedelta.py:15(weekday)
 7 0.000 0.000 0.000 0.000 relativedelta.py:18(__init__)
 1 0.000 0.000 0.000 0.000 relativedelta.py:45(relativedelta)
 1 0.000 0.000 0.000 0.000 relativedelta.py:6(?)
 1 0.000 0.000 0.000 0.000 rrule.py:224(rrule)
 1 0.000 0.000 0.000 0.000 rrule.py:50(weekday)
 7 0.000 0.000 0.000 0.000 rrule.py:53(__init__)
 1 0.000 0.000 0.000 0.000 rrule.py:6(?)
 1 0.000 0.000 0.000 0.000 rrule.py:613(_iterinfo)
 1 0.000 0.000 0.000 0.000 rrule.py:80(rrulebase)
 1 0.000 0.000 0.000 0.000 rrule.py:807(rruleset)
 1 0.000 0.000 0.000 0.000 rrule.py:809(_genitem)
 1 0.000 0.000 0.000 0.000 rrule.py:876(_rrulestr)
 1 0.000 0.000 0.000 0.000 sets.py:393(ImmutableSet)
 1 0.000 0.000 0.000 0.000 sets.py:41(?)
 1 0.000 0.000 0.000 0.000 sets.py:418(Set)
 1 0.000 0.000 0.000 0.000 sets.py:564(_TemporarilyImmutableSet)
 1 0.000 0.000 0.000 0.000 sets.py:83(BaseSet)
 116 0.000 0.000 0.000 0.000 sre.py:129(match)
 39 0.000 0.000 0.000 0.000 sre.py:139(sub)
 8 0.000 0.000 0.010 0.001 sre.py:177(compile)
 8 0.000 0.000 0.000 0.000 sre.py:190(escape)
 8 0.000 0.000 0.000 0.000 sre.py:212(_join)
 163 0.000 0.000 0.010 0.000 sre.py:216(_compile)
 1 0.000 0.000 0.000 0.000 sre.py:277(Scanner)
 1 0.010 0.010 0.010 0.010 sre.py:94(?)
 1 0.000 0.000 0.000 0.000 sre_compile.py:11(?)
 17 0.000 0.000 0.000 0.000 sre_compile.py:151(_compile_charset)
 13 0.000 0.000 0.000 0.000 sre_compile.py:155(<lambda>)
 17 0.000 0.000 0.000 0.000 sre_compile.py:180(_optimize_charset)
 6 0.000 0.000 0.000 0.000 sre_compile.py:229(_mk_bitmap)
 35/11 0.000 0.000 0.000 0.000 sre_compile.py:24(_compile)
 13 0.000 0.000 0.000 0.000 sre_compile.py:322(_simple)
 11 0.000 0.000 0.000 0.000 sre_compile.py:329(_compile_info)
 71 0.000 0.000 0.000 0.000 sre_compile.py:42(<lambda>)
 21 0.000 0.000 0.000 0.000 sre_compile.py:438(isstring)
 11 0.000 0.000 0.000 0.000 sre_compile.py:444(_code)
 11 0.000 0.000 0.010 0.001 sre_compile.py:459(compile)
 1 0.000 0.000 0.000 0.000 sre_constants.py:12(?)
 3 0.000 0.000 0.000 0.000 sre_constants.py:146(makedict)
 1 0.000 0.000 0.000 0.000 sre_constants.py:25(error)
 1 0.000 0.000 0.000 0.000 sre_parse.py:11(?)
 62 0.000 0.000 0.000 0.000 sre_parse.py:133(__len__)
 100 0.000 0.000 0.000 0.000 sre_parse.py:137(__getitem__)
 13 0.000 0.000 0.000 0.000 sre_parse.py:139(__setitem__)
 13 0.000 0.000 0.000 0.000 sre_parse.py:141(__getslice__)
 57 0.000 0.000 0.000 0.000 sre_parse.py:145(append)
 48/24 0.000 0.000 0.000 0.000 sre_parse.py:147(getwidth)
 1 0.000 0.000 0.000 0.000 sre_parse.py:182(Tokenizer)
 11 0.000 0.000 0.000 0.000 sre_parse.py:183(__init__)
 199 0.000 0.000 0.000 0.000 sre_parse.py:187(__next)
 106 0.010 0.000 0.010 0.000 sre_parse.py:200(match)
 155 0.000 0.000 0.000 0.000 sre_parse.py:206(get)
 1 0.000 0.000 0.000 0.000 sre_parse.py:210(tell)
 1 0.000 0.000 0.000 0.000 sre_parse.py:212(seek)
 1 0.000 0.000 0.000 0.000 sre_parse.py:240(_class_escape)
 13 0.000 0.000 0.000 0.000 sre_parse.py:269(_escape)
 20/11 0.000 0.000 0.010 0.001 sre_parse.py:312(_parse_sub)
 21/11 0.000 0.000 0.010 0.001 sre_parse.py:367(_parse)
 11 0.000 0.000 0.010 0.001 sre_parse.py:614(parse)
 1 0.000 0.000 0.000 0.000 sre_parse.py:73(Pattern)
 11 0.000 0.000 0.000 0.000 sre_parse.py:75(__init__)
 9 0.000 0.000 0.000 0.000 sre_parse.py:80(opengroup)
 9 0.000 0.000 0.000 0.000 sre_parse.py:91(closegroup)
 1 0.000 0.000 0.000 0.000 sre_parse.py:96(SubPattern)
 35 0.000 0.000 0.000 0.000 sre_parse.py:98(__init__)
 6 0.000 0.000 0.000 0.000 stat.py:29(S_IFMT)
 4 0.000 0.000 0.000 0.000 stat.py:45(S_ISDIR)
 2 0.000 0.000 0.000 0.000 stat.py:54(S_ISREG)
 8 0.000 0.000 0.000 0.000 string.py:125(join)
 1 0.000 0.000 0.000 0.000 string.py:20(?)
 1 0.000 0.000 0.020 0.020 sysconfig.py:10(?)
 1 0.000 0.000 0.000 0.000 table.py:145(Table)
 1 0.000 0.000 0.000 0.000 table.py:21(?)
 1 0.000 0.000 0.000 0.000 table.py:37(Cell)
 1 0.000 0.000 0.980 0.980 testlog.py:2(?)
 84 0.010 0.000 0.090 0.001 text.py:216(draw)
 1 0.000 0.000 0.000 0.000 text.py:3(?)
 1 0.000 0.000 0.000 0.000 text.py:31(Text)
 18 0.000 0.000 0.000 0.000 text.py:314(get_position)
 156 0.000 0.000 0.000 0.000 text.py:318(get_prop_tup)
 81 0.000 0.000 0.020 0.000 text.py:344(get_window_extent)
 28 0.000 0.000 0.000 0.000 text.py:365(get_rotation_matrix)
 93 0.000 0.000 0.000 0.000 text.py:40(__init__)
 15 0.000 0.000 0.000 0.000 text.py:501(set_position)
 69 0.000 0.000 0.000 0.000 text.py:510(set_x)
 99 0.000 0.000 0.000 0.000 text.py:520(set_y)
 142 0.000 0.000 0.000 0.000 text.py:556(set_text)
 89 0.000 0.000 0.000 0.000 text.py:567(is_math_text)
 84 0.000 0.000 0.020 0.000 text.py:584(_get_layout_super)
 184 0.000 0.000 0.000 0.000 text.py:73(get_rotation)
 72 0.000 0.000 0.000 0.000 text.py:84(update_from)
 72 0.020 0.000 0.030 0.000 text.py:95(_get_layout)
 1 0.000 0.000 0.000 0.000 ticker.py:107(?)
 1 0.000 0.000 0.000 0.000 ticker.py:117(TickHelper)
 96 0.000 0.000 0.000 0.000 ticker.py:122(verify_intervals)
 27 0.000 0.000 0.000 0.000 ticker.py:130(set_view_interval)
 27 0.000 0.000 0.000 0.000 ticker.py:133(set_data_interval)
 1 0.000 0.000 0.000 0.000 ticker.py:136(Formatter)
 12 0.000 0.000 0.000 0.000 ticker.py:148(set_locs)
 1 0.000 0.000 0.000 0.000 ticker.py:151(NullFormatter)
 45 0.000 0.000 0.000 0.000 ticker.py:153(__call__)
 1 0.000 0.000 0.000 0.000 ticker.py:157(FixedFormatter)
 1 0.000 0.000 0.000 0.000 ticker.py:171(FuncFormatter)
 1 0.000 0.000 0.000 0.000 ticker.py:183(FormatStrFormatter)
 1 0.000 0.000 0.000 0.000 ticker.py:197(ScalarFormatter)
 27 0.000 0.000 0.000 0.000 ticker.py:204(__call__)
 27 0.000 0.000 0.000 0.000 ticker.py:211(pprint_val)
 1 0.000 0.000 0.000 0.000 ticker.py:234(LogFormatter)
 1 0.000 0.000 0.000 0.000 ticker.py:240(__init__)
 45 0.000 0.000 0.000 0.000 ticker.py:273(is_decade)
 90 0.000 0.000 0.000 0.000 ticker.py:277(nearest_long)
 1 0.000 0.000 0.000 0.000 ticker.py:282(LogFormatterExponent)
 1 0.000 0.000 0.000 0.000 ticker.py:305(LogFormatterMathtext)
 45 0.000 0.000 0.000 0.000 ticker.py:310(__call__)
 1 0.000 0.000 0.000 0.000 ticker.py:329(Locator)
 4 0.000 0.000 0.000 0.000 ticker.py:362(nonsingular)
 1 0.000 0.000 0.000 0.000 ticker.py:377(IndexLocator)
 1 0.000 0.000 0.000 0.000 ticker.py:395(FixedLocator)
 1 0.000 0.000 0.000 0.000 ticker.py:408(NullLocator)
 6 0.000 0.000 0.000 0.000 ticker.py:413(__call__)
 1 0.000 0.000 0.000 0.000 ticker.py:417(LinearLocator)
 4 0.000 0.000 0.000 0.000 ticker.py:428(__init__)
 2 0.000 0.000 0.000 0.000 ticker.py:485(closeto)
 1 0.000 0.000 0.000 0.000 ticker.py:489(Base)
 8 0.000 0.000 0.000 0.000 ticker.py:491(__init__)
 2 0.000 0.000 0.000 0.000 ticker.py:501(le)
 8 0.000 0.000 0.000 0.000 ticker.py:521(ge)
 12 0.000 0.000 0.000 0.000 ticker.py:527(get_base)
 1 0.000 0.000 0.000 0.000 ticker.py:530(MultipleLocator)
 8 0.000 0.000 0.000 0.000 ticker.py:536(__init__)
 6 0.000 0.000 0.000 0.000 ticker.py:539(__call__)
 2 0.000 0.000 0.000 0.000 ticker.py:552(autoscale)
 2 0.000 0.000 0.000 0.000 ticker.py:570(decade_down)
 1 0.000 0.000 0.000 0.000 ticker.py:576(decade_up)
 4 0.000 0.000 0.000 0.000 ticker.py:581(is_decade)
 1 0.000 0.000 0.000 0.000 ticker.py:585(LogLocator)
 2 0.000 0.000 0.000 0.000 ticker.py:590(__init__)
 2 0.000 0.000 0.000 0.000 ticker.py:597(base)
 2 0.000 0.000 0.000 0.000 ticker.py:603(subs)
 12 0.000 0.000 0.000 0.000 ticker.py:614(__call__)
 2 0.000 0.000 0.000 0.000 ticker.py:651(autoscale)
 1 0.000 0.000 0.000 0.000 ticker.py:672(AutoLocator)
 4 0.000 0.000 0.000 0.000 ticker.py:678(__init__)
 6 0.000 0.000 0.000 0.000 ticker.py:681(__call__)
 6 0.000 0.000 0.000 0.000 ticker.py:686(refresh)
 2 0.000 0.000 0.000 0.000 ticker.py:691(autoscale)
 8 0.000 0.000 0.000 0.000 ticker.py:699(get_locator)
 1 0.000 0.000 0.000 0.000 traceback.py:1(?)
 1 0.000 0.000 0.000 0.000 transforms.py:187(?)
 1499 0.020 0.000 0.020 0.000 transforms.py:192(zero)
 1146 0.000 0.000 0.000 0.000 transforms.py:194(one)
 572 0.020 0.000 0.030 0.000 transforms.py:196(origin)
 572 0.010 0.000 0.040 0.000 transforms.py:199(unit_bbox)
 284 0.000 0.000 0.040 0.000 transforms.py:212(identity_transform)
 88 0.010 0.000 0.020 0.000 transforms.py:220(translation_transform)
 9 0.000 0.000 0.000 0.000 transforms.py:267(bbox_all)
 62 0.000 0.000 0.000 0.000 transforms.py:296(lbwh_to_bbox)
 4 0.000 0.000 0.000 0.000 transforms.py:317(get_bbox_transform)
 223 0.000 0.000 0.000 0.000 transforms.py:326(blend_xy_sep_transform)
 9 0.000 0.000 0.000 0.000 transforms.py:377(inverse_transform_bbox)
 2 0.000 0.000 0.000 0.000 tzinfo.py:12(memorized_timedelta)
 1 0.000 0.000 0.000 0.000 tzinfo.py:2(?)
 1 0.000 0.000 0.000 0.000 tzinfo.py:299(AmbiguousTimeError)
 1 0.000 0.000 0.000 0.000 tzinfo.py:47(BaseTzInfo)
 1 0.000 0.000 0.000 0.000 tzinfo.py:57(StaticTzInfo)
 1 0.000 0.000 0.000 0.000 tzinfo.py:96(DstTzInfo)
From: John H. <jdh...@ac...> - 2005年02月06日 20:05:08
>>>>> "Abraham" == Abraham Schneider <ab...@cn...> writes:
 Abraham> This might work as a compromise. Instead of using the
 Abraham> traits class, I wrote a quick and dirty Traits Lite(tm)
 Abraham> class. I think the traits class provided a lot more
 Abraham> functionality than was needed, and what was needed
 Abraham> required very little code.
OK, this is looking much more promising. I have given a quick glance
over and will test it more extensively this afternoon.
Quick comments. I'd like to continue using the matplotlib naming
convention (UpperCase) for class names, rather than underscore
separated
class trait_color(Trait):
also, 
I don't think we should use the name Trait or HasTrait, since that
will confuse people into thinking we are using enthought traits
(Property and HasProperty ?) 
Finally, another feature I would like to be able to support, which
won't be hard, is to enable the use of an RC class or something like
it in Artist constructors
Here is what we currently have
 def __init__(self, xdata, ydata,
 linewidth = None, # default to rc
 linestyle = None, # default to rc
 color = None, # default to rc
...snip..
 ):
This overloads None which leads to strange usages like
linestyle='None' to turn off lines (note the quotes). I would rather
do something like
 def __init__(self, xdata, ydata,
 linewidth = RC('lines.linewidth'),
 linestyle = RC('lines.linestyle')
...snip...
 ):
 if isinstance(linewidth, RC): linewidth=linewidth()
Note that this is different than
 def __init__(self, xdata, ydata,
 linewidth = rc.lines.linewidth,
 linestyle = rc.lines.linestyle,
...snip...
 ):
The syntax above is not the point. What I want to emphasize is that I
want a self documenting way of saying this parameter defaults to an rc
param, and that param should be evaluated *at init time*. If you can
do it with the second syntax, that looks better, but if I read your
code correctly, something like rc.lines.linewidth evaluates to a float
at module load time and so cannot be used as a sentinel at module init
time. Is this correct?
In any case, it looks very promising. Two final comments. Like
Fernando, I'm not too concerned about being able to parse existing rc
files. It's a minor burden to require people simply to take the new
format and customize it. Also, do you need to extend the fontsize
train to support fontsizes in points, eg 12.0 ?
 Abraham> Sorry for sending in such a large file once again. I
 Abraham> wanted to be able to parse the entire RC file to make
 Abraham> sure that things were going to work okay.
No problem, I think we can handle it.
 Abraham> It still needs some work, but it's pretty functional for
 Abraham> a proof of concept. It's capable of parsing the RC file,
 Abraham> validating the type-assignment, and uses the
 Abraham> 'rc.lines.color = xxx' format. It's also fairly modular,
 Abraham> so additions should be easy.
Well if it already parses existing rc, no reason to kill it.
I look forward to looking more closely at it -- thanks!
JDH
From: John H. <jdh...@ac...> - 2005年02月06日 17:59:43
As noted here previously, PS/EPS files are 25 times larger than they
need to be in many cases because we embed the entire freetype font
into them. I think this is a problem that needs to be addressed, so
I'm posting here in hopes to motivate Paul, Jochen, or anyonw else
wanting to kill an afternoon to look into it.
Last time Paul looked at this (when he implemented freetype fonts for
PS mathtext), he came to the conclusion that it was not possible to
extract individual glyphs fro ps file, and had to resort to dumping in
the entire file. I don't believe this is the case. See, eg
agg22/font_freetype/agg_font_freetype.cpp in the matplotlib src distro
and the routine decompose_ft_outline in which a freetype glyph outline
is converted to an agg path (at least that is my read of it). We
could port this code to ft2font, and use it to embed the individual
glyph information in postscript, me thinks (caveat, I know nothing
about postscript font embedding).
The other idea, which I think is worth doing independently of the
embedding issue, is to support an rc option so that postscript uses
postscript fonts (eg what matplotlib used to do before we started
embedding using the supplied afm files for metrics and the AFM class
to parse them). For scripts that don't use mathtext, this is a
perfectly viable solution which would produce the minimal files, since
nothing has to be embedded.
But I think the embedding problem is the top priority. We can see
where we are vis-a-vis file sizes after that.
Any takers?
JDH`
From: Fernando P. <Fer...@co...> - 2005年02月05日 20:34:36
John Hunter wrote:
> Thanks for chugging along on this. When time permits, I know Fernando
> is interested in joining in this discussion because we previously
> discussed adopting a python based config file that allowed recursive
> includes that might be usable both for ipython and matplotlib,
I can't really work on this right now (I'll be fixing the mpl-related %run 
things first), but I have a generic comment to make. I want ipython to be 
usable as a standalone package, without traits or any other very fancy things. 
 So I'd like to have a simple module whose job is only to load a config file 
written in pure python, with the only unusual feature of allowing recursive 
inclusions with an intelligent path search. This is quite simple to write (if 
it weren't for recursion/path, it would be a trivial execfile() call).
I would then layer on top of this, perhaps a traits-based system which would 
allow for example gui editing of parameters. But ipython will always run in a 
plain terminal without traits or any kind of gui.
I am also not terribly interested in keeping backwards compatibility. The 
main reason I don't call ipython 1.0 is API changes: I still consider its 
design to be in flux, so even though I try hard not to break things just for 
the fun of it, I'm willing to in order to have a clean design for the future. 
 At some point when I implement the new python-based rc system, I'll simply 
have to tell users to edit their config files to the new format. Not 
particularly pleasant, but it's a one-time pain. And the time it would take 
to write and maintain a solid, bulletproof format cross-reader is IMHO better 
spent on other tasks.
Regards,
f
From: John H. <jdh...@ac...> - 2005年02月04日 23:11:10
>>>>> "Abraham" == Abraham Schneider <ab...@cn...> writes:
 Abraham> Hi. Well, not sure anyone is interested in following up
 Abraham> on the config file issue, but if so, attached is a
 Abraham> complete version (sorry for the big size!). One class and
 Abraham> two functions were moved from __init__.py, but besides
 Abraham> that it's all new (and thus the non-patch). But at least
 Abraham> my quick tests shows it to be backwards compatible
 Abraham> (i.e. it can read the .matplotlibrc files, and rc(...)
 Abraham> was rewritten to work with the new system).
 Abraham> A very quick synopsis: config['text']['color'] = 'r'
 Abraham> config['text.color'] = 'g' config['text.c'] = 'b'
 Abraham> rc('text', color=(100, 100, 100))
I'm interested. I haven't had time to follow it closely yet, but I do
plan on taking a close look soon. One thing I would like to see is a
syntax like
rc.text.color = 'red'
I think by creating a proper class for the rc instance and text
attribute and overriding setattr and getattr appropriately, you can
achieve this.
FYI, I'll include some code I worked on over holiday investigating
using enthought traits for rc files which does support a syntax like
this. Note the usage of
 rc.lines.color = 'r'
Thanks for chugging along on this. When time permits, I know Fernando
is interested in joining in this discussion because we previously
discussed adopting a python based config file that allowed recursive
includes that might be usable both for ipython and matplotlib,
JDH
import sys, os, re
from traits import *
from matplotlib.cbook import is_string_like
from matplotlib.artist import Artist
doprint = True
flexible_true_trait = Trait(
 True, 
 { 'true': True, 't': True, 'yes': True, 'y': True, 'on': True, True: True,
 'false': False, 'f': False, 'no': False, 'n': False, 'off': False, False: False
 } )
flexible_false_trait = Trait( False, flexible_true_trait )
colors = {
 'c' : '#00bfbf',
 'b' : '#0000ff',
 'g' : '#008000',
 'k' : '#000000',
 'm' : '#bf00bf',
 'r' : '#ff0000',
 'w' : '#ffffff',
 'y' : '#bfbf00',
 'gold' : '#FFD700',	
 'peachpuff' : '#FFDAB9',	
 'navajowhite' : '#FFDEAD',	
 }
def hex2color(s):
 "Convert hex string (like html uses, eg, #efefef) to a r,g,b tuple"
 return tuple([int(n, 16)/255.0 for n in (s[1:3], s[3:5], s[5:7])])
class RGBA(HasTraits):
 # r,g,b,a in the range 0-1 with default color 0,0,0,1 (black)
 r = Range(0., 1., 0.)
 g = Range(0., 1., 0.)
 b = Range(0., 1., 0.)
 a = Range(0., 1., 1.)
 def __init__(self, r=0., g=0., b=0., a=1.):
 self.r = r
 self.g = g
 self.b = b
 self.a = a
 def __repr__(self):
 return 'r,g,b,a = (%1.2f, %1.2f, %1.2f, %1.2f)'%\
 (self.r, self.g, self.b, self.a)
def tuple_to_rgba(ob, name, val):
 tup = [float(x) for x in val]
 if len(tup)==3:
 r,g,b = tup
 return RGBA(r,g,b)
 elif len(tup)==4:
 r,g,b,a = tup
 return RGBA(r,g,b,a)
 else:
 raise ValueError
tuple_to_rgba.info = 'a RGB or RGBA tuple of floats'
def hex_to_rgba(ob, name, val):
 rgx = re.compile('^#[0-9A-Fa-f]{6}$')
 if not is_string_like(val):
 raise TypeError
 if rgx.match(val) is None:
 raise ValueError
 r,g,b = hex2color(val)
 return RGBA(r,g,b,1.0)
hex_to_rgba.info = 'a hex color string'
def colorname_to_rgba(ob, name, val):
 hex = colors[val.lower()]
 r,g,b = hex2color(hex)
 return RGBA(r,g,b,1.0)
colorname_to_rgba.info = 'a named color'
def float_to_rgba(ob, name, val):
 val = float(val)
 return RGBA(val, val, val, 1.)
float_to_rgba.info = 'a grayscale intensity'
Color = Trait(RGBA(), float_to_rgba, colorname_to_rgba, RGBA,
 hex_to_rgba, tuple_to_rgba)
def file_exists(ob, name, val):
 fh = file(val, 'r')
 return val
def path_exists(ob, name, val):
 os.path.exists(val)
linestyles = ('-', '--', '-.', ':', 'steps', 'None')
TICKLEFT, TICKRIGHT, TICKUP, TICKDOWN = range(4)
linemarkers = (None, '.', ',', 'o', '^', 'v', '<', '>', 's',
 '+', 'x', 'd', 'D', '|', '_', 'h', 'H',
 'p', '1', '2', '3', '4',
 TICKLEFT,
 TICKRIGHT,
 TICKUP,
 TICKDOWN,
 'None'
 )
class LineRC(HasTraits):
 linewidth = Float(0.5) 
 linestyle = Trait(*linestyles)
 color = Color
 marker = Trait(*linemarkers)
 markerfacecolor = Color
 markeredgecolor = Color 
 markeredgewidth = Float(0.5)
 markersize = Float(6) 
 antialiased = flexible_true_trait 
 data_clipping = flexible_false_trait 
class PatchRC(HasTraits):
 linewidth = Float(1.0) 
 facecolor = Color
 edgecolor = Color 
 antialiased = flexible_true_trait 
timezones = 'UTC', 'US/Central', 'ES/Eastern' # fixme: and many more
backends = ('GTKAgg', 'Cairo', 'FltkAgg', 'GD', 'GDK', 'GTK', 'Agg',
 'GTKCairo', 'Paint', 'PS', 'SVG', 'Template', 'TkAgg',
 'WX')
class RC(HasTraits):
 backend = Trait(*backends)
 numerix = Trait('Numeric', 'numarray')
 interactive = flexible_false_trait
 toolbar = Trait('toolbar2', 'classic', None)
 timezone = Trait(*timezones)
 lines = Trait(LineRC())
 patch = Trait(PatchRC())
rc = RC()
rc.lines.color = 'r'
if doprint:
 print 'RC'
 rc.print_traits()
 print 'RC lines'
 rc.lines.print_traits()
 print 'RC patches'
 rc.patch.print_traits()
class Patch(Artist, HasTraits):
 linewidth = Float(0.5)
 facecolor = Color
 fc = facecolor
 edgecolor = Color
 fill = flexible_true_trait
 def __init__(self,
 edgecolor=None, 
 facecolor=None,
 linewidth=None,
 antialiased = None, 
 fill=1,
 **kwargs
 ):
 Artist.__init__(self)
 if edgecolor is None: edgecolor = rc.patch.edgecolor
 if facecolor is None: facecolor = rc.patch.facecolor
 if linewidth is None: linewidth = rc.patch.linewidth
 if antialiased is None: antialiased = rc.patch.antialiased
 self.edgecolor = edgecolor
 self.facecolor = facecolor
 self.linewidth = linewidth
 self.antialiased = antialiased 
 self.fill = fill
 
p = Patch()
p.facecolor = '#bfbf00'
p.edgecolor = 'gold'
p.facecolor = (1,.5,.5,.25)
p.facecolor = 0.25
p.fill = 'f'
print 'p.facecolor', type(p.facecolor), p.facecolor
print 'p.fill', type(p.fill), p.fill
if p.fill_: print 'fill'
else: print 'no fill'
if doprint:
 print
 print 'Patch'
 print_traits()
From: Abraham S. <ab...@cn...> - 2005年02月04日 23:03:52
Attachments: config.py
Hi. Well, not sure anyone is interested in following up on the config 
file issue, but if so, attached is a complete version (sorry for the big 
size!). One class and two functions were moved from __init__.py, but 
besides that it's all new (and thus the non-patch). But at least my 
quick tests shows it to be backwards compatible (i.e. it can read the 
.matplotlibrc files, and rc(...) was rewritten to work with the new system).
A very quick synopsis:
config['text']['color'] = 'r'
config['text.color'] = 'g'
config['text.c'] = 'b'
rc('text', color=(100, 100, 100))
I believe the new syntax allows for easy addition of plugins. Several 
possible methods exist to handle this:
(1) allow a new file '.pylabrc' which will automatically be parsed as a 
python file. The function 'read_rc_file(...)' still allows old-style 
config files to be used inside the new method, but then we don't need to 
introduce new syntax for setting up plugins. If no '.pylabrc' file, 
process '.matplotlibrc' file old style.
(2) if '.matplotlibrc' is a directory, then assume new style. Each file 
in this directory will automatically be processed as a python file. If 
not a directory, process same as old method.
(3) Allow python code to be included in the .matplotlibrc file as:
#include <python-script>
Thus, instead of requiring new config-file syntax for configuration of 
the plugins, they can simply be put in python files.
Abe
From: Fernando P. <Fer...@co...> - 2005年02月04日 21:19:33
John Hunter wrote:
> I just committed some changes to CVS for auto-log scaling of line
> plots - you pay a performance hit for log plots but it appears to
> work. Eg, you can do
> 
> x = arange(-2.002, 10, 0.01)
> y = sin(2*pi*x)
> plot(x,y)
> set(gca(), xscale='log')
> 
> and only the positive data are plotted. 
OK, with ssh CVS this works quite well. If you try the same with
 set(gca(), yscale='log')
you'll see a funky junction. I think here gnuplot can again give us some 
guidance for good bailout behaviour:
http://amath.colorado.edu/faculty/fperez/tmp/log-sin.ps
I think this is a reasonable approach.
Now, there is something funky though in semilogy:
In [13]: plot(frange(.1,1,npts=20),frange(0.1,1,npts=20))
Out[13]: [<matplotlib.lines.Line2D instance at 0x40f631ac>]
In [14]: set(gca(), yscale='log')
Out[14]: [None]
Works perfectly. Yet:
In [15]: close('all')
In [16]: semilogy(frange(.1,1,npts=20),frange(0.1,1,npts=20))
ERROR: min() or max() arg is an empty sequence
I'd expect these two to be identical, no? Perhaps you just haven't had the 
time to track down all the places where this needs to be applied.
At any rate, this is a huge improvement for log plots (which I happen to use 
every day). You've pretty much bought yourself the %run backend work, and at 
least a stab at the gtk stuff for ipython :)
Best,
f
ps. Now that I'm good with ssh CVS, let me know if you finish polishing this 
up, and I can test it quickly and report back. I have a ton of pretty 
stressful log plots I can throw at it.
From: Fernando P. <Fer...@co...> - 2005年02月04日 20:48:49
John Hunter wrote:
>>>>>>"Fernando" == Fernando Perez <Fer...@co...> writes:
> 
> 
> Fernando> On second thought, I am starting to like the
> Fernando> mouse-proximity thingie: it allows you to point at a
> Fernando> specific axis and set only that one, which can be very
> Fernando> useful if you have a bunch of subplots and want to only
> Fernando> change one specific axis. This, which I imagine would
> Fernando> take some careful work at the command line, would be
> Fernando> trivial to do if you could just put your mouse pointer
> Fernando> over it and hit a key/button.
> 
> I think you misunderstand my question. mouse proximity is a given. I
> am referring to how to toggle log scale for the x and y axes
> separately with keybindings for the *axes under the mouse point*.
> 
> I am just as likely to want logx ans logy, which is why I wasn't
> assuming 'l'. But if gnuplot does the y axis with 'l', I'm happy to
> follow suit, but the question of the appropriate key for toggling the
> x scale is open.
Ah, gnuplot simply doesn't provide a separate x one. You get y with 'l', and 
if you want x, you mouse over it and do it. That's all they give you via 
hotkeys. You can always call the logscaling commands
set logscale x
I've found that solution to work well, but one person's everyday usage case is 
often someone else's weird corner case, so feel free to follow your own instincts.
Best,
f
From: John H. <jdh...@ac...> - 2005年02月04日 20:42:48
>>>>> "Fernando" == Fernando Perez <Fer...@co...> writes:
 Fernando> On second thought, I am starting to like the
 Fernando> mouse-proximity thingie: it allows you to point at a
 Fernando> specific axis and set only that one, which can be very
 Fernando> useful if you have a bunch of subplots and want to only
 Fernando> change one specific axis. This, which I imagine would
 Fernando> take some careful work at the command line, would be
 Fernando> trivial to do if you could just put your mouse pointer
 Fernando> over it and hit a key/button.
I think you misunderstand my question. mouse proximity is a given. I
am referring to how to toggle log scale for the x and y axes
separately with keybindings for the *axes under the mouse point*.
I am just as likely to want logx ans logy, which is why I wasn't
assuming 'l'. But if gnuplot does the y axis with 'l', I'm happy to
follow suit, but the question of the appropriate key for toggling the
x scale is open.
JDH
From: Fernando P. <Fer...@co...> - 2005年02月04日 19:22:48
Fernando Perez wrote:
>>I would like a key binding for toggling log/linear scale for x and y
>>independently. 'x' and 'y' are not good choices since they are
>>overloaded with constraining axes in interactive pan/zoom with the
>>toolbar. Suggestions? '1' and '2'? CTRL-x and and CTRL-y? 'l' and
>>'L'?
> 
> 
> I like 'l'/'L' for gnuplot consistency. Note that their implementation is a 
> bit funky though: 'l' toggles y-axis log (the most common case), while 'L' 
> toggles log on the axis closest to the mouse pointer. I'll leave it up to you 
> to decide whether you like this mouse-proximity thing or not. But 'l' for 
> y-log, which is probably the most common type of log plot, I think is nice.
On second thought, I am starting to like the mouse-proximity thingie: it 
allows you to point at a specific axis and set only that one, which can be 
very useful if you have a bunch of subplots and want to only change one 
specific axis. This, which I imagine would take some careful work at the 
command line, would be trivial to do if you could just put your mouse pointer 
over it and hit a key/button.
So now I'm +1 on following gnuplot's inspiration here.
As to which y-axis a plain 'l' should modify in the presence of subplots, I'm 
not sure. All? The first one? Is there a concept of 'active axis' in a plot 
with subplots? I simply don't know mpl enough to say anything useful here.
cheers,
f
From: Fernando P. <Fer...@co...> - 2005年02月04日 19:06:33
John Hunter wrote:
> If you have data points really close to 0, eg 
> 
> 1 >>> x = arange(-2.00, 10, 0.01)
> 
> 2 >>> amin(abs(x))
> Out[2]: 4.163336342344337e-17
> 
> You may a heavy performance price because so many decades are plotted,
> each with minor ticks, and ticks are expensive in the current impl.
I had a look at gnuplot's strategy:
planck[~]> npy
In [1]: x = frange(1e-40, 10, npts=1003)
In [2]: gp('set logscale y')
In [3]: plot x,filename='logplotex.eps'
The result is here:
http://amath.colorado.edu/faculty/fperez/tmp/logplotex.eps
They seem to plot a maximum of 11 major ticks (that's what I'm guessing from a 
bunch of tests). When it fits, each major tick is a decade, but at some point 
their algorithm switches over (like in my example) to every 3rd, 5th, 
whatever-th decade, and the minor ticks become decade ticks themselves. When 
this happens, there are no logarithmically spaced ticks any more, obviously.
This is overall a nice approach, I think. I have quite a few plots which 
cover 30 decades, and in matplotlib the result looks very crowded, while 
gnuplot's enforcement of a max of 11 (or whatever) major ticks gives a clean 
looking plot.
Gnuplot has many problems (hence my switch -finally- to mpl), but it has over 
a decade of fine-tuning of its behavior and interface, so it's not a bad 
source of inspiration. It is mature and robust, and many of the things it 
does, it does really well. I'll keep bringing up areas where I feel we can 
benefit from it (I know it reasonably well) as I move all my code over to mpl.
Cheers,
f
From: John H. <jdh...@ac...> - 2005年02月04日 18:53:36
>>>>> "Fernando" == Fernando Perez <Fer...@co...> writes:
 Fernando> Hmm. Is it possible that this hasn't propagated to
 Fernando> public CVS yet? I just updated, and this is what I get:
Highly probably - public CVS lags are getting better but are still
measurable
 backend_bases.py revision: 1.31
 lines.py revision: 1.14
 axes.py revision: 1.64
From: Fernando P. <Fer...@co...> - 2005年02月04日 18:44:09
John Hunter wrote:
> I just committed some changes to CVS for auto-log scaling of line
> plots - you pay a performance hit for log plots but it appears to
> work. Eg, you can do
> 
> x = arange(-2.002, 10, 0.01)
> y = sin(2*pi*x)
> plot(x,y)
> set(gca(), xscale='log')
> 
> and only the positive data are plotted. 
Hmm. Is it possible that this hasn't propagated to public CVS yet? I just 
updated, and this is what I get:
planck[mwadap]> pylab
In [1]: x = arange(-2.002, 10, 0.01)
In [2]: y = sin(2*pi*x)
In [3]: plot(x,y)
Out[3]: [<matplotlib.lines.Line2D instance at 0x41041f0c>]
In [4]: set(gca(), xscale='log')
---------------------------------------------------------------------------
exceptions.ValueError Traceback (most recent 
call last)
/home/fperez/research/code/mwadap/<console>
/usr/lib/python2.3/site-packages/matplotlib/pylab.py in set(h, *args, **kwargs)
 1230 raise RuntimeError(msg)
 1231
-> 1232 draw_if_interactive()
 1233 return [x for x in flatten(ret)]
 1234
/usr/local/home/fperez/code/python/IPython/genutils.py in wrapper(*args, **kw)
/usr/lib/python2.3/site-packages/matplotlib/backends/__init__.py in 
draw_if_interactive()
 40 def draw_if_interactive():
 41 draw_if_interactive._called = True
---> 42 __draw_int()
 43 # Flag to store state, so external callers (like ipython) can 
keep track
 44 # of draw calls.
/usr/lib/python2.3/site-packages/matplotlib/backends/backend_tkagg.py in 
draw_if_interactive()
 56 figManager = Gcf.get_active()
 57 if figManager is not None:
---> 58 figManager.show()
 59
 60
/usr/lib/python2.3/site-packages/matplotlib/backends/backend_tkagg.py in 
show(self)
 276 # anim.py requires this
 277 if sys.platform=='win32' : self.window.update()
--> 278 else: self.canvas.draw()
 279 self._shown = True
 280
/usr/lib/python2.3/site-packages/matplotlib/backends/backend_tkagg.py in 
draw(self)
 141
 142 def draw(self):
--> 143 FigureCanvasAgg.draw(self)
 144 tkagg.blit(self._tkphoto, self.renderer._renderer, 2)
 145 self._master.update_idletasks()
/usr/lib/python2.3/site-packages/matplotlib/backends/backend_agg.py in draw(self)
 310 self.renderer = RendererAgg(w, h, self.figure.dpi)
 311 self._lastKey = key
--> 312 self.figure.draw(self.renderer)
 313
 314 def tostring_rgb(self):
/usr/lib/python2.3/site-packages/matplotlib/figure.py in draw(self, renderer)
 336
 337 # render the axes
--> 338 for a in self.axes: a.draw(renderer)
 339
 340 # render the figure text
/usr/lib/python2.3/site-packages/matplotlib/axes.py in draw(self, renderer)
 1480 if not self.get_visible(): return
 1481 renderer.open_group('axes')
-> 1482 self.transData.freeze() # eval the lazy objects
 1483 self.transAxes.freeze() # eval the lazy objects
 1484 if self.axison:
ValueError: Cannot take log of nonpositive value
Note that I'm running straight off the CVS directory, because the RPM 
rebuild/reinstall takes too long for permanent testing. What I did was just 
to manually copy the .so files back into the CVS dir, renamed 
/usr/lib/python2.3/site-packages/matplotlib to .ori, and made a symlink:
planck[site-packages]> d matplotlib
/usr/lib/python2.3/site-packages
lrwxrwxrwx 1 root 51 Feb 4 11:18 matplotlib -> 
/usr/local/installers/src/matplotlib/lib/matplotlib/
This seems to work OK (I checked with a few print statements that I am indeed 
running off the CVS matplotlib/ dir). Since the most recent CVS update 
doesn't seem to change any C++ code, this should be OK, no?
I'm seeing further weirdness with log plots. Try this:
semilogy(frange(.1,1,npts=20),frange(0.1,1,npts=20))
semilogy(frange(.1,1,npts=20),frange(0.0,1,npts=20))
semilogy(frange(.1,1,npts=20),frange(0.1,1,npts=20))
Not only does the second one crash, but then, the third line (identical to the 
first) also crashes. Something is left in an internally inconsistent state, 
and essentially all log plots become impossible afterwards. The only solution 
is to restart pylab altogether.
> If you have data points really close to 0, eg 
> 
> 1 >>> x = arange(-2.00, 10, 0.01)
> 
> 2 >>> amin(abs(x))
> Out[2]: 4.163336342344337e-17
> 
> You may a heavy performance price because so many decades are plotted,
> each with minor ticks, and ticks are expensive in the current impl.
> 
> I am also implementing some default keypress events on the pylab
> figure manager canvas. Eg 'g' to toggle grid mode.
> 
> I would like a key binding for toggling log/linear scale for x and y
> independently. 'x' and 'y' are not good choices since they are
> overloaded with constraining axes in interactive pan/zoom with the
> toolbar. Suggestions? '1' and '2'? CTRL-x and and CTRL-y? 'l' and
> 'L'?
I like 'l'/'L' for gnuplot consistency. Note that their implementation is a 
bit funky though: 'l' toggles y-axis log (the most common case), while 'L' 
toggles log on the axis closest to the mouse pointer. I'll leave it up to you 
to decide whether you like this mouse-proximity thing or not. But 'l' for 
y-log, which is probably the most common type of log plot, I think is nice.
> Are there other keybindings people would like to see implemented in
> the default pylab figures?
'r' for the ruler thingie?
Best,
f
From: John H. <jdh...@ac...> - 2005年02月04日 18:26:40
I just committed some changes to CVS for auto-log scaling of line
plots - you pay a performance hit for log plots but it appears to
work. Eg, you can do
 x = arange(-2.002, 10, 0.01)
 y = sin(2*pi*x)
 plot(x,y)
 set(gca(), xscale='log')
and only the positive data are plotted. 
If you have data points really close to 0, eg 
 1 >>> x = arange(-2.00, 10, 0.01)
 2 >>> amin(abs(x))
 Out[2]: 4.163336342344337e-17
You may a heavy performance price because so many decades are plotted,
each with minor ticks, and ticks are expensive in the current impl.
I am also implementing some default keypress events on the pylab
figure manager canvas. Eg 'g' to toggle grid mode.
I would like a key binding for toggling log/linear scale for x and y
independently. 'x' and 'y' are not good choices since they are
overloaded with constraining axes in interactive pan/zoom with the
toolbar. Suggestions? '1' and '2'? CTRL-x and and CTRL-y? 'l' and
'L'?
Are there other keybindings people would like to see implemented in
the default pylab figures?
JDH
 
From: John H. <jdh...@ac...> - 2005年02月04日 03:28:22
>>>>> "John" == John Hunter <jdh...@ac...> writes:
 John> The bad news is I don't know how and where the error crept
 John> in. I'll do some digging.
God Bless diff -- fixed in CVS. Make sure you have CVS revision of
legend.py 1.35 or later.
JDH
From: John H. <jdh...@ac...> - 2005年02月04日 03:23:51
>>>>> "Fernando" == Fernando Perez <Fer...@co...> writes:
 Fernando> Hi all, I was just trying to make some plots with
 Fernando> legends in them, by following the damped exponential
 Fernando> example from pages 17-18 in the PDF user's guide. My
 Fernando> results are strange looking: the legend box size is
 Fernando> completely wrong, and the on-screen version has the
 Fernando> markers outside the box. The generated png does put the
 Fernando> markers in the right place, though. I'm using the TkAgg
 Fernando> backend, all in ipython-pylab. I've put up two pngs on
 Fernando> the net for reference:
Hey Fernando,
The good news is that matplotlib legends really do not look that big
and stupid -- this is a CVS bug (0.71 works), eg
http://matplotlib.sourceforge.net/screenshots.html#legend_demo
The bad news is I don't know how and where the error crept in. I'll
do some digging.
Thanks for letting me know!
JDH
From: Fernando P. <Fer...@co...> - 2005年02月03日 19:45:09
Hi all,
I was just trying to make some plots with legends in them, by following the 
damped exponential example from pages 17-18 in the PDF user's guide. My 
results are strange looking: the legend box size is completely wrong, and the 
on-screen version has the markers outside the box. The generated png does put 
the markers in the right place, though. I'm using the TkAgg backend, all in 
ipython-pylab. I've put up two pngs on the net for reference:
- Generated png from a savefig() call:
http://amath.colorado.edu/faculty/fperez/tmp/legend_bug.png
- Screenshot of my actual figure window
http://amath.colorado.edu/faculty/fperez/tmp/legend_bug_on_screen.png
Note how on the screenshot, the little lupmed markers end up outside the 
legend box.
I'm using mpl CVS from yesterday afternoon.
Any help would be much appreciated.
Regards,
f
From: Abraham S. <ab...@cn...> - 2005年02月02日 21:33:41
Attachments: config.py
A long time ago there was discussion about creating a plug-in system for 
pylib, and some code was written. Part of the difficulty was that the 
config file had to be radically altered. There was some discussion on 
how to do this, but no code actually go written in the end (which I had 
promised I would do). Finally having some free time again, I thought I 
would give it another shot. It should be fairly easy to move the plugin 
structure written once an appropriate config mechanism is in place.
Thus, on the suggestion of John, I started to write *just* a config 
module to replace the current one. The idea is mirror the current code, 
so '.matplotlibrc' files can still be used, but at the same time to also 
allow configuration files that are python code. This will allow all 
future extensions to easily be written in python, and allow easy 
backwards compatibility.
Attached is a quick and dirty first attempt. With very few lines of code 
it should be easy to import an old rc file. Let me know what you think.. 
It currently only has the config item 'tick.x', but if it looks 
worthwhile I can transfer the rest of the config items in, and write a 
function for reading in .matplotlibrc files.
Abe
From: Fernando P. <Fer...@co...> - 2005年02月02日 19:30:40
Fernando Perez wrote:
> John Hunter wrote:
>>But using non-equal width and height for the axes seems like a logical
>>error that defeats the stated purpose of matshow. Of course, in real
>>life this might be a hack to defeat unequal dpix and dpiy on your
>>monitor, but it would come back to bite you when you saved to PS,
>>which has the same dpi in both directions.
> 
> 
> Well, the problem is really the following: we need at least 0.15 on the left 
> to leave enough room for the row ticks. Those can grow reasonably wide, given 
> that a 1000 row array forces 4 character labels. OTOH, the labels at the top 
> are all a single character tall, so they don't occupy quite as much space. I 
> was trying to balance these constraints, by moving the image to the right just 
> enough, while trying to avoid a too wide band atop the figure. But your 
> aspect ratio comment is valid, so perhaps the height should be reduced to 
> 0.75. You are correct that matshow should, when at all possible, guarantee an 
> exact aspect ratio. This is especially important for generating array 
> displays in EPS for papers.
> 
> But it's important to leave at least 0.15 on the left, otherwise for tall 
> arrays the labels are lost against the wall.
To close this off, here's a set of numbers
 ax = fig.add_axes([0.15, 0.09, 0.775, 0.775])
which:
 - respect x/y scaling constraints
 - allow up to 4 character labels (arrays with >1000 rows) to display
 - center the image reasonably without unnatural space when possible.
These are the numbers I'm keeping for now in my tree.
And now I'll shut up on this one. It would still be possible to improve the 
layout for the extremely tall/wide cases, but that would require a bunch of 
special-casing code and fine testing. At this point, even I am willing to say 
'good enough'. And now I'll take my meds :)
Cheers,
f
From: Fernando P. <Fer...@co...> - 2005年02月02日 19:16:43
John Hunter wrote:
>>>>>>"Fernando" == Fernando Perez <Fer...@co...> writes:
> 
> 
> Fernando> OK, the perfectionist freak in me wants:
> 
> Fernando> ax = fig.add_axes([0.15, 0.075, 0.75, 0.8])
> 
> But using non-equal width and height for the axes seems like a logical
> error that defeats the stated purpose of matshow. Of course, in real
> life this might be a hack to defeat unequal dpix and dpiy on your
> monitor, but it would come back to bite you when you saved to PS,
> which has the same dpi in both directions.
Well, the problem is really the following: we need at least 0.15 on the left 
to leave enough room for the row ticks. Those can grow reasonably wide, given 
that a 1000 row array forces 4 character labels. OTOH, the labels at the top 
are all a single character tall, so they don't occupy quite as much space. I 
was trying to balance these constraints, by moving the image to the right just 
enough, while trying to avoid a too wide band atop the figure. But your 
aspect ratio comment is valid, so perhaps the height should be reduced to 
0.75. You are correct that matshow should, when at all possible, guarantee an 
exact aspect ratio. This is especially important for generating array 
displays in EPS for papers.
But it's important to leave at least 0.15 on the left, otherwise for tall 
arrays the labels are lost against the wall.
Side note: I just ran image_demo3, and the dreaded white band appears atop 
lena's head with imshow(). At some point I may look into applying these same 
tricks to imshow, so it does the right thing when aspect=='preserve'. But 
later, we have too much on our plate already (and I haven't even started with 
the real stuff I want for matplotlib :)
> Fernando> I tested this, and these values avoid problems with
> Fernando> labels running into walls or too much whitespace for
> Fernando> extreme aspect ratios. For more square ones, the change
> Fernando> is barely noticeable. You'd make me infinitely happy if
> Fernando> you indulged this little nit :)
> 
> Hmm, you solve my problem on ipython-users and I'll solve yours. :-)
I know, and I feel terrible that yours is a bit trickier than mine.
> Actually, I looked a bit at it yesterday and could replicate it. I
> haven't figured out where the root evil is. Is it known to be safe to
> run two separate tk processes in python? Eg, I'm not 100% convinced
> its a matplotlib bug, but may be 
No worries, at least we have a workaround. I just wanted to know it was on 
your radar, that's all. I won't pester you about it again.
Cheers,
f
From: John H. <jdh...@ac...> - 2005年02月02日 19:03:49
>>>>> "Fernando" == Fernando Perez <Fer...@co...> writes:
 Fernando> OK, the perfectionist freak in me wants:
 Fernando> ax = fig.add_axes([0.15, 0.075, 0.75, 0.8])
But using non-equal width and height for the axes seems like a logical
error that defeats the stated purpose of matshow. Of course, in real
life this might be a hack to defeat unequal dpix and dpiy on your
monitor, but it would come back to bite you when you saved to PS,
which has the same dpi in both directions.
 Fernando> I tested this, and these values avoid problems with
 Fernando> labels running into walls or too much whitespace for
 Fernando> extreme aspect ratios. For more square ones, the change
 Fernando> is barely noticeable. You'd make me infinitely happy if
 Fernando> you indulged this little nit :)
Hmm, you solve my problem on ipython-users and I'll solve yours. :-)
Actually, I looked a bit at it yesterday and could replicate it. I
haven't figured out where the root evil is. Is it known to be safe to
run two separate tk processes in python? Eg, I'm not 100% convinced
its a matplotlib bug, but may be 
JDH

Showing results of 143

<< < 1 .. 3 4 5 6 > >> (Page 5 of 6)
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 によって変換されたページ (->オリジナル) /