Revision: 8935
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=8935&view=rev
Author: pivanov314
Date: 2011-01-24 09:41:49 +0000 (Mon, 24 Jan 2011)
Log Message:
-----------
new broken axis example
Added Paths:
-----------
trunk/matplotlib/examples/pylab_examples/broken_axis.py
Added: trunk/matplotlib/examples/pylab_examples/broken_axis.py
===================================================================
--- trunk/matplotlib/examples/pylab_examples/broken_axis.py (rev 0)
+++ trunk/matplotlib/examples/pylab_examples/broken_axis.py 2011-01-24 09:41:49 UTC (rev 8935)
@@ -0,0 +1,61 @@
+"""
+Broken axis example, where the y-axis will have a portion cut out.
+"""
+import matplotlib.pylab as plt
+import numpy as np
+
+
+# 30 points between 0 0.2] originally made using np.random.rand(30)*.2
+pts = np.array([ 0.015, 0.166, 0.133, 0.159, 0.041, 0.024, 0.195,
+ 0.039, 0.161, 0.018, 0.143, 0.056, 0.125, 0.096, 0.094, 0.051,
+ 0.043, 0.021, 0.138, 0.075, 0.109, 0.195, 0.05 , 0.074, 0.079,
+ 0.155, 0.02 , 0.01 , 0.061, 0.008])
+
+# Now let's make two outlier points which are far away from everything.
+pts[[3,14]] += .8
+
+# If we were to simply plot pts, we'd lose most of the interesting
+# details due to the outliers. So let's 'break' or 'cut-out' the y-axis
+# into two portions - use the top (ax) for the outliers, and the bottom
+# (ax2) for the details of the majority of our data
+f,(ax,ax2) = plt.subplots(2,1,sharex=True)
+
+# plot the same data on both axes
+ax.plot(pts)
+ax2.plot(pts)
+
+# zoom-in / limit the view to different portions of the data
+ax.set_ylim(.78,1.) # outliers only
+ax2.set_ylim(0,.22) # most of the data
+
+# hide the spines between ax and ax2
+ax.spines['bottom'].set_visible(False)
+ax2.spines['top'].set_visible(False)
+ax.xaxis.tick_top()
+ax.tick_params(labeltop='off') # don't put tick labels at the top
+ax2.xaxis.tick_bottom()
+
+# This looks pretty good, and was fairly painless, but you can get that
+# cut-out diagonal lines look with just a bit more work. The important
+# thing to know here is that in axes coordinates, which are always
+# between 0-1, spine endpoints are at these locations (0,0), (0,1),
+# (1,0), and (1,1). Thus, we just need to put the diagonals in the
+# appropriate corners of each of our axes, and so long as we use the
+# right transform and disable clipping.
+
+d = .015 # how big to make the diagonal lines in axes coordinates
+# arguments to pass plot, just so we don't keep repeating them
+kwargs = dict(transform=ax.transAxes, color='k', clip_on=False)
+ax.plot((-d,+d),(-d,+d), **kwargs) # top-left diagonal
+ax.plot((1-d,1+d),(-d,+d), **kwargs) # top-right diagonal
+
+kwargs.update(transform=ax2.transAxes) # switch to the bottom axes
+ax2.plot((-d,+d),(1-d,1+d), **kwargs) # bottom-left diagonal
+ax2.plot((1-d,1+d),(1-d,1+d), **kwargs) # bottom-right diagonal
+
+# What's cool about this is that now if we vary the distance between
+# ax and ax2 via f.subplots_adjust(hspace=...) or plt.subplot_tool(),
+# the diagonal lines will move accordingly, and stay right at the tips
+# of the spines they are 'breaking'
+
+plt.show()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|