@@ -6725,6 +6725,88 @@ def matshow(self, Z, **kwargs):
6725
6725
integer = True ))
6726
6726
return im
6727
6727
6728
+
6729
+ def violinplot (self , x , positions = None , width = 0.5 ):
6730
+ """
6731
+ Make a violin plot.
6732
+
6733
+ Call signature::
6734
+
6735
+ violinplot(x, positions=None)
6736
+
6737
+ Make a violin plot for each column of *x* or each
6738
+ vector in sequence *x*. Each filled area extends to represent the
6739
+ entire data range, with three lines at the mean, the minimum, and
6740
+ the maximum.
6741
+
6742
+ Parameters
6743
+ ----------
6744
+
6745
+ x : Array or a sequence of vectors.
6746
+ The input data.
6747
+
6748
+ positions : array-like, default = [1, 2, ..., n]
6749
+ Sets the positions of the violins. The ticks and limits are
6750
+ automatically set to match the positions.
6751
+
6752
+ width : array-like, default = 0.5
6753
+ Either a scalar or a vector that sets the maximal width of
6754
+ each violin. The default is 0.5, which uses about half of the
6755
+ available horizontal space.
6756
+
6757
+ Returns
6758
+ -------
6759
+
6760
+ A dictionary mapping each component of the violinplot to a list of the
6761
+ corresponding collection instances created. The dictionary has
6762
+ the following keys:
6763
+
6764
+ - bodies: A list of the
6765
+ :class:`matplotlib.collections.PolyCollection` instances
6766
+ containing the filled area of each violin.
6767
+ - means: A list of the :class:`matplotlib.lines.Line2D` instances
6768
+ created to identify the mean values for each of the violins.
6769
+ - caps: A list of the :class:`matplotlib.lines.Line2D` instances
6770
+ created to identify the extremal values of each violin's
6771
+ data set.
6772
+
6773
+ """
6774
+
6775
+ bodies = []
6776
+ means = []
6777
+ caps = []
6778
+
6779
+ if positions == None :
6780
+ positions = range (1 , len (x ) + 1 )
6781
+ elif len (positions ) != len (x ):
6782
+ raise ValueError (datashape_message .format ("positions" ))
6783
+
6784
+ # TODO: Use kde estimation function on x
6785
+ # These numbers are contrived
6786
+ coords = np .arange (0.0 , np .pi , np .pi / 100. )
6787
+ datasets = map (lambda i : np .sin (coords ) ** i , range (1 ,len (x ) + 1 ))
6788
+
6789
+ for d ,x in zip (datasets ,positions ):
6790
+ # Since each data point p is plotted from x-p to x+p,
6791
+ # we need to scale it by an additional 0.5 factor so that we get
6792
+ # correct width in the end.
6793
+ d = 0.5 * widths * d / d .max ()
6794
+ m = d .min () # This should actually be the min for the dataset
6795
+ M = d .max () # likewise
6796
+ # bodies += [self.fill_betweenx(np.arange(m,M,(M-m)/100.),
6797
+ bodies += [self .fill_betweenx (coords ,
6798
+ - d + x ,
6799
+ d + x ,
6800
+ facecolor = 'y' ,
6801
+ alpha = 0.3 )]
6802
+
6803
+ return {
6804
+ 'bodies' : bodies ,
6805
+ 'means' : means ,
6806
+ 'caps' : caps
6807
+ }
6808
+
6809
+
6728
6810
def tricontour (self , * args , ** kwargs ):
6729
6811
return mtri .tricontour (self , * args , ** kwargs )
6730
6812
tricontour .__doc__ = mtri .TriContourSet .tricontour_doc
0 commit comments