Revision: 6909
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=6909&view=rev
Author: ryanmay
Date: 2009-02-12 21:20:09 +0000 (Thu, 12 Feb 2009)
Log Message:
-----------
Make viewlims demo more interesting by using events to regenerate a fractal.
Modified Paths:
--------------
branches/v0_98_5_maint/examples/event_handling/viewlims.py
Modified: branches/v0_98_5_maint/examples/event_handling/viewlims.py
===================================================================
--- branches/v0_98_5_maint/examples/event_handling/viewlims.py 2009-02-12
20:59:53 UTC (rev 6908)
+++ branches/v0_98_5_maint/examples/event_handling/viewlims.py 2009-02-12
21:20:09 UTC (rev 6909)
@@ -12,16 +12,58 @@
self.set_bounds(*ax.viewLim.bounds)
ax.figure.canvas.draw_idle()
-x = np.linspace(-3., 3., 20)
-y = np.linspace(-3., 3., 20).reshape(-1,1)
-Z = (1- x/2 + x**5 + y**3)*np.exp(-x**2-y**2)
+# A class that will regenerate a fractal set as we zoom in, so that you
+# can actually see the increasing detail. A box in the left panel will show
+# the area to which we are zoomed.
+class MandlebrotDisplay(object):
+ def __init__(self, h=500, w=500, niter=50, radius=2., power=2):
+ self.height = h
+ self.width = w
+ self.niter = niter
+ self.radius = radius
+ self.power = power
+ def __call__(self, xstart, xend, ystart, yend):
+ self.x = np.linspace(xstart, xend, self.width)
+ self.y = np.linspace(ystart, yend, self.height).reshape(-1,1)
+ c = self.x + 1.0j * self.y
+ threshold_time = np.zeros((self.height, self.width))
+ z = np.zeros(threshold_time.shape, dtype=np.complex)
+ mask = np.ones(threshold_time.shape, dtype=np.bool)
+ for i in xrange(self.niter):
+ z[mask] = z[mask]**self.power + c[mask]
+ mask = (np.abs(z) < self.radius)
+ threshold_time += mask
+ return threshold_time
+
+ def ax_update(self, ax):
+ ax.set_autoscale_on(False) # Otherwise, infinite loop
+
+ #Get the number of points from the number of pixels in the window
+ dims = ax.axesFrame.get_window_extent().bounds
+ self.width = int(dims[2] + 0.5)
+ self.height = int(dims[2] + 0.5)
+
+ #Get the range for the new area
+ xstart,ystart,xdelta,ydelta = ax.viewLim.bounds
+ xend = xstart + xdelta
+ yend = ystart + ydelta
+
+ # Update the image object with our new data and extent
+ im = ax.images[-1]
+ im.set_data(self.__call__(xstart, xend, ystart, yend))
+ im.set_extent((xstart, xend, ystart, yend))
+ ax.figure.canvas.draw_idle()
+
+md = MandlebrotDisplay()
+Z = md(-2., 0.5, -1.25, 1.25)
+
fig = plt.figure()
ax1 = fig.add_subplot(1, 2, 1)
-ax1.pcolor(x, y, Z)
+ax1.imshow(Z, origin='lower', extent=(md.x.min(), md.x.max(), md.y.min(),
md.y.max()))
ax2 = fig.add_subplot(1, 2, 2)
-ax2.pcolor(x, y, Z)
+ax2.imshow(Z, origin='lower', extent=(md.x.min(), md.x.max(), md.y.min(),
md.y.max()))
rect = UpdatingRect([0, 0], 0, 0, facecolor='None', edgecolor='black')
rect.set_bounds(*ax2.viewLim.bounds)
@@ -31,4 +73,7 @@
ax2.callbacks.connect('xlim_changed', rect)
ax2.callbacks.connect('ylim_changed', rect)
+ax2.callbacks.connect('xlim_changed', md.ax_update)
+ax2.callbacks.connect('ylim_changed', md.ax_update)
+
plt.show()
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins