|
|
"""An example of how to use IPython1 for plotting remote parallel data
|
|
|
|
|
|
The two files plotting_frontend.py and plotting_backend.py go together.
|
|
|
|
|
|
To run this example, first start the IPython controller and 4
|
|
|
engines::
|
|
|
|
|
|
ipcluster start -n 4
|
|
|
|
|
|
Then start ipython with matplotlib integration::
|
|
|
|
|
|
ipython --matplotlib
|
|
|
|
|
|
Then a simple "run plotting_frontend.py" in IPython will run the
|
|
|
example. When this is done, all the variables (such as number, downx, etc.)
|
|
|
are available in IPython, so for example you can make additional plots.
|
|
|
"""
|
|
|
from __future__ import print_function
|
|
|
|
|
|
import matplotlib.pyplot as plt
|
|
|
from IPython.parallel import Client
|
|
|
|
|
|
# Connect to the cluster
|
|
|
rc = Client()
|
|
|
view = rc[:]
|
|
|
|
|
|
# Run the simulation on all the engines
|
|
|
view.run('plotting_backend.py')
|
|
|
|
|
|
# Bring back the data. These are all AsyncResult objects
|
|
|
number = view.pull('number')
|
|
|
d_number = view.pull('d_number')
|
|
|
downx = view.gather('downx')
|
|
|
downy = view.gather('downy')
|
|
|
downpx = view.gather('downpx')
|
|
|
downpy = view.gather('downpy')
|
|
|
|
|
|
# but we can still iterate through AsyncResults before they are done
|
|
|
print("number: ", sum(number))
|
|
|
print("downsampled number: ", sum(d_number))
|
|
|
|
|
|
|
|
|
# Make a scatter plot of the gathered data
|
|
|
# These calls to matplotlib could be replaced by calls to pygist or
|
|
|
# another plotting package.
|
|
|
plt.figure(1)
|
|
|
# wait for downx/y
|
|
|
downx = downx.get()
|
|
|
downy = downy.get()
|
|
|
plt.scatter(downx, downy)
|
|
|
plt.xlabel('x')
|
|
|
plt.ylabel('y')
|
|
|
plt.figure(2)
|
|
|
# wait for downpx/y
|
|
|
downpx = downpx.get()
|
|
|
downpy = downpy.get()
|
|
|
plt.scatter(downpx, downpy)
|
|
|
plt.xlabel('px')
|
|
|
plt.ylabel('py')
|
|
|
plt.show()
|
|
|
|