fast scatters

I added a fast polygon drawing collection class and backend renderer

For large scatter plots (50000 points), the performance is 5 times
faster across all backends and 10 times faster for the *Agg backends.
Also, scatter works with many symbols: diamonds, sqaures, oriented
triangles, circles and more. Currently these are all regular polygons
but I can add more later when I finish general polygon collections and
line collections.

The scatter command returns a collection instance rather than a list
of patches as before. If you are setting properties on the return
values of scatter plots, you *may* need to change some code to use
methods appropriate for collections, though the user API is largely
compatible. See matplotlib.collections.

Also the size argument is now in points^2 (the area of the symbol in
points) and is not in data coords as before. This fixes a few
problems: symbols are not skewed by unequally shaped axes, scatter
works with log coords w/o distoring the symbol, and it is matlab

The function scatter_classic is the old scatter function and will work

Let me know how this works with your scatter code, particularly if it
breaks it!


I must be doing something stupid, but I can't get the simplest
loglog to work. For example:

x = arange(10.) + 2
y = x**2

array([ 4., 9., 16., 25., 36., 49., 64., 81., 100.,


Traceback (most recent call last):
    xt = self.transx.positions(x)
  File "C:\Python23\Lib\site-packages\matplotlib\", line 621,
in po
    return scale*(self.func(x)-minin) + self._boundout.min()
  File "C:\Python23\Lib\site-packages\matplotlib\", line 520,
in lo
    raise ValueError('Cannot take log of non-positive data')
ValueError: Cannot take log of non-positive data


(v0.53.1 on windows 2000)

after doing a clf(), it works. I thought I had started with
a clean session. Hmmm. I also notice that if I do something like
loglog(arange(10.), arange(10.)) I get an error as I should,
and then try againg with my first example, it still fails with
the same error message. Somehow it the first error causes it
to continue to fail unless clf() is performed.


I keep forgetting that unless the clf() is done, that
all the previous data elements are still present.
And thus the error will repeat. (Waiting for that
feature to allow autoclearing in interactive mode I guess)