Fernando Perez wrote:
> 
> Please!  That example with the top labels looks great, and it's a very
> useful way of displaying the numerical key parts of the dataset.
> 
> Cheers,
> 
> f
> 

OK, here is a bloxplot example based on the one previously shown. I just
replaced my environmental data with some random data to make things easier
to run, and accordingly I had to make up some story around the data (testing
bootstrap resampling). Fee free to rework the code as you see fit, but
hopefully this is a helpful example.

http://www.nabble.com/file/p24764036/boxplotExampleForums.png 


--------------------------
boxplotdemo.py
--------------------------
import numpy as np
import matplotlib.pyplot as plt 
from matplotlib.patches import Polygon


#Generate some data from five different probability distributions, each with
#different characteristics. We want to play with how an IID bootstrap
resample
#of the data preserves the distributional properties of the original sample,
and
#a boxplot is one visual tool to make this assessment 
numDists = 5
randomDists = ['Normal(1,1)',' Lognormal(1,1)', 'Exp(1)', 'Gumbel(6,4)', 
               'Triangular(2,9,11)']
N = 500
norm = np.random.normal(1,1, N)
logn = np.random.lognormal(1,1, N)
expo = np.random.exponential(1, N)
gumb = np.random.gumbel(6, 4, N)
tria = np.random.triangular(2, 9, 11, N)

#Generate some random indices that we'll use to resample the original data 
#arrays. For code brevity, just use the same random indices for each array
bootstrapIndices = np.random.random_integers(0, N-1, N)
normBoot = norm[bootstrapIndices]
expoBoot = expo[bootstrapIndices]
gumbBoot = gumb[bootstrapIndices]
lognBoot = logn[bootstrapIndices]
triaBoot = tria[bootstrapIndices]

data = [norm, normBoot,  logn, lognBoot, expo, expoBoot, gumb, gumbBoot,
        tria, triaBoot]

fig = plt.figure(figsize=(10,6))
fig.canvas.set_window_title('A Boxplot Example') 
ax1 = fig.add_subplot(111)
plt.subplots_adjust(left=0.075, right=0.95, top=0.9, bottom=0.25) 

bp = plt.boxplot(data, notch=0, sym='+', vert=1, whis=1.5)
plt.setp(bp['boxes'], color='black')
plt.setp(bp['whiskers'], color='black')
plt.setp(bp['fliers'], color='red', marker='+')

#Add a horizontal grid to the plot, but make it very light in color so we
can 
#use it for reading data values but not be distracting
ax1.yaxis.grid(True, linestyle='-', which='major', color='lightgrey', 
               alpha=0.5)
#Hide these grid behind plot objects
ax1.set_axisbelow(True) 
ax1.set_title('Comparison of IID Bootstrap Resampling Across Five
Distributions')
ax1.set_xlabel('Distribution')   
ax1.set_ylabel('Value')

#Now fill the boxes with desired colors
boxColors = ['darkkhaki','royalblue']
numBoxes = numDists*2
medians = range(numBoxes)
for i in range(numBoxes):
   box = bp['boxes'][i]
   boxX = []
   boxY = []
   for j in range(5):
       boxX.append(box.get_xdata()[j])
       boxY.append(box.get_ydata()[j])
   boxCoords = zip(boxX,boxY)
   #Alternate between Dark Khaki and Royal Blue
   k = i % 2
   boxPolygon = Polygon(boxCoords, facecolor=boxColors[k])
   ax1.add_patch(boxPolygon)
   #Now draw the median lines back over what we just filled in
   med = bp['medians'][i]
   medianX = []
   medianY = []
   for j in range(2):
       medianX.append(med.get_xdata()[j])
       medianY.append(med.get_ydata()[j])
       plt.plot(medianX, medianY, 'k')
       medians[i] = medianY[0]
   #Finally, overplot the sample averages, with horixzontal alignment in the 
   #center of each box
   plt.plot([np.average(med.get_xdata().data)], [np.average(data[i])], 
            color='w', marker='*', markeredgecolor='k')

#Set the axes ranges and axes labels
ax1.set_xlim(0.5, numBoxes+0.5)    
top = 40
bottom = -5
ax1.set_ylim(bottom, top) 
xtickNames = plt.setp(ax1, xticklabels=np.repeat(randomDists, 2))
plt.setp(xtickNames, rotation=45, fontsize=8)

#Due to the Y-axis scale being different across samples, it can be hard to 
#compare differences in medians across the samples. Add upper X-axis tick
labels
#with the sample medians to aid in comparison (just use two decimal places
of
#precision)
pos = np.arange(numBoxes)+1
upperLabels = [str(np.round(s, 2)) for s in medians]
weights = ['bold', 'semibold']
for tick,label in zip(range(numBoxes),ax1.get_xticklabels()):
    k = tick % 2
    ax1.text(pos[tick], top-(top*0.05), upperLabels[tick], 
         horizontalalignment='center', size='x-small', weight=weights[k],
         color=boxColors[k])

#Finally, add a basic legend         
plt.figtext(0.80, 0.08,  str(N) + ' Random Numbers' , 
            backgroundcolor=boxColors[0], color='black', weight='roman', 
            size='x-small')
plt.figtext(0.80, 0.045, 'IID Bootstrap Resample',
backgroundcolor=boxColors[1],
            color='white', weight='roman', size='x-small')
plt.figtext(0.80, 0.015, '*', color='white', backgroundcolor='silver', 
            weight='roman', size='medium') 
plt.figtext(0.815, 0.013, ' Average Value', color='black', weight='roman', 
            size='x-small')

plt.show()


-----
Josh Hemann
Statistical Advisor 
http://www.vni.com/ Visual Numerics 
jhem...@vni.com | P 720.407.4214 | F 720.407.4199 

-- 
View this message in context: 
http://www.nabble.com/Radar---Spider-Chars-tp17876254p24764036.html
Sent from the matplotlib - users mailing list archive at Nabble.com.


------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to