0

I need to plot a great bunch of different objects (~10^5 filled ellipses and similar shapes). What I do is add them one at a time using the command plt.gcf().gca().add_artist(e) and then use plt.show() at the end. This requires more memory than what I have.

Is there a way to plot them one at a time (that is, without adding them as I did above), and thus reduce the amount of memory I consume? I would be fine even with a solution that significantly increases the amount of time required for the plotting.

2
  • What if you just save the figure at the end instead of rendering it with mpl? Commented May 20, 2016 at 13:14
  • matplotlib.collections Classes for the efficient drawing of large collections of objects that share most properties [...] — emphasis is mine Commented May 20, 2016 at 13:56

1 Answer 1

1

To draw a large quantity of similar objects you have to use one of the different matplotlib.collections classes — alas, their usage is a bit arcane, at least when it is my understanding that is involved...

Anyway, starting from the docs and this official example I was able to put together the following code

$ cat ellipses.py
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import EllipseCollection

N = 10**5

# centres of ellipses —  uniform distribution, -5<=x<5, -3<=y<3
xy = np.random.random((N,2))*np.array((5*2,3*2))-np.array((5,3))

# width, height of ellipses
w, h = np.random.random(N)/10, np.random.random(N)/10

# rotation angles, anticlockwise
a = np.random.random(N)*180-90

# we need an axes object for the correct scaling of the ellipses
fig, ax = plt.subplots()

# create the collection
ec = EllipseCollection(w, h, a,
                    units='x',
                    offsets=xy,
                    transOffset=ax.transData)

ax.add_collection(ec)
ax.autoscale(tight=True)

plt.savefig('el10^5.png')

I timed it on my almost low-end notebook

$ time python -c 'import numpy; import matplotlib.pyplot as p; f, a = p.subplots()'

real    0m0.697s
user    0m0.620s
sys     0m0.072s
$ time python ellipses.py 

real    0m5.704s
user    0m5.616s
sys     0m0.080s
$

As you can see, when you discount the staging required for every plot, it takes about 5 seconds — and what is the result?

el10^5.png

I think that the details about eccentricity and angle are lost in such a dense representation, but I don't know the specifics of your task and won't comment further.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.