From: Friedrich Romstedt <friedrichromstedt@gm...>  20101004 20:10:04

> """ > First attempt at a histogram strip chart (made up name). > ifmain block taken from [1] except that I've replaced uniform distributions > with normal distributions. > [1] http://matplotlib.sourceforge.net/examples/pylab_examples/boxplot_demo3.html > """ > import numpy as np > import matplotlib.pyplot as plt > from matplotlib import collections > > NORM_TYPES = dict(max=max, sum=sum) > class BinCollection(collections.PatchCollection): > def __init__(self, hist, bin_edges, x=0, width=1, cmap=plt.cm.gray_r, > norm_type='max', **kwargs): > yy = (bin_edges[:1] + bin_edges[1:])/2. > heights = np.diff(bin_edges) > bins = [plt.Rectangle((x, y), width, h) for y, h in zip(yy, heights)] > norm = NORM_TYPES[norm_type] > fc = cmap(np.asarray(hist, dtype=float)/norm(hist)) > super(BinCollection, self).__init__(bins, facecolors=fc, **kwargs) Is this equivalent to writing collections.PatchCollection.__init__() and what are the advantages of super()? I think you can use axes.pcolor() to replace BinCollection. pcolor() just adds a collection similar to what you do now by hand for you. With appropriate arguments it should do the job. You can also look into pcolorfast() and pcolormesh(). > def histstrip(x, positions=None, widths=None, ax=None): > if ax is None: > ax = plt.gca() > if positions is None: > positions = range(1, len(x) + 1) > if widths is None: > widths = np.min(np.diff(positions)) / 2. * np.ones(len(positions)) > for data, x_pos, w in zip(x, positions, widths): > x_pos = w/2. > hist, bin_edges = np.histogram(data) No other arguments to numpy.histogram() allowed? > bins = BinCollection(hist, bin_edges, width=w, x=x_pos) > ax.add_collection(bins, autolim=True) > ax.set_xticks(positions) > ax.autoscale_view() > if __name__ == '__main__': > import matplotlib.pyplot as plt > import numpy as np > np.random.seed(2) > inc = 0.1 > e1 = np.random.normal(0,1, size=(500,)) > e2 = np.random.normal(0,1, size=(500,)) > e3 = np.random.normal(0,1 + inc, size=(500,)) > e4 = np.random.normal(0,1 + 2*inc, size=(500,)) > treatments = [e1,e2,e3,e4] > fig, ax = plt.subplots() > pos = np.array(range(len(treatments)))+1 > histstrip(treatments, ax=ax) > ax.set_xlabel('treatment') > ax.set_ylabel('response') > fig.subplots_adjust(right=0.99,top=0.99) > plt.show() In my opinion this is too special to be added as a general matplotlib plotting feature. Friedrich 