@@ -6725,6 +6725,248 @@ def matshow(self, Z, **kwargs):
6725
6725
integer = True ))
6726
6726
return im
6727
6727
6728
+ def violinplot (self , dataset , positions = None , vert = True , widths = 0.5 ,
6729
+ showmeans = False , showextrema = True , showmedians = False ,
6730
+ points = 100 , bw_method = None ):
6731
+ """
6732
+ Make a violin plot.
6733
+
6734
+ Call signature::
6735
+
6736
+ violinplot(dataset, positions=None, vert=True, widths=0.5,
6737
+ showmeans=False, showextrema=True, showmedians=False,
6738
+ points=100, bw_method=None):
6739
+
6740
+ Make a violin plot for each column of *dataset* or each vector in
6741
+ sequence *dataset*. Each filled area extends to represent the
6742
+ entire data range, with optional lines at the mean, the median,
6743
+ the minimum, and the maximum.
6744
+
6745
+ Parameters
6746
+ ----------
6747
+
6748
+ dataset : Array or a sequence of vectors.
6749
+ The input data.
6750
+
6751
+ positions : array-like, default = [1, 2, ..., n]
6752
+ Sets the positions of the violins. The ticks and limits are
6753
+ automatically set to match the positions.
6754
+
6755
+ vert : bool, default = True.
6756
+ If true, creates a vertical violin plot.
6757
+ Otherwise, creates a horizontal violin plot.
6758
+
6759
+ widths : array-like, default = 0.5
6760
+ Either a scalar or a vector that sets the maximal width of
6761
+ each violin. The default is 0.5, which uses about half of the
6762
+ available horizontal space.
6763
+
6764
+ showmeans : bool, default = False
6765
+ If true, will toggle rendering of the means.
6766
+
6767
+ showextrema : bool, default = True
6768
+ If true, will toggle rendering of the extrema.
6769
+
6770
+ showmedians : bool, default = False
6771
+ If true, will toggle rendering of the medians.
6772
+
6773
+ points : scalar, default = 100
6774
+ Defines the number of points to evaluate each of the gaussian
6775
+ kernel density estimations at.
6776
+
6777
+ bw_method : str, scalar or callable, optional
6778
+ The method used to calculate the estimator bandwidth. This can be
6779
+ 'scott', 'silverman', a scalar constant or a callable. If a
6780
+ scalar, this will be used directly as `kde.factor`. If a
6781
+ callable, it should take a `GaussianKDE` instance as its only
6782
+ parameter and return a scalar. If None (default), 'scott' is used.
6783
+
6784
+ Returns
6785
+ -------
6786
+
6787
+ A dictionary mapping each component of the violinplot to a list of the
6788
+ corresponding collection instances created. The dictionary has
6789
+ the following keys:
6790
+
6791
+ - bodies: A list of the
6792
+ :class:`matplotlib.collections.PolyCollection` instances
6793
+ containing the filled area of each violin.
6794
+ - means: A :class:`matplotlib.collections.LineCollection` instance
6795
+ created to identify the mean values of each of the violin's
6796
+ distribution.
6797
+ - mins: A :class:`matplotlib.collections.LineCollection` instance
6798
+ created to identify the bottom of each violin's distribution.
6799
+ - maxes: A :class:`matplotlib.collections.LineCollection` instance
6800
+ created to identify the top of each violin's distribution.
6801
+ - bars: A :class:`matplotlib.collections.LineCollection` instance
6802
+ created to identify the centers of each violin's distribution.
6803
+ - medians: A :class:`matplotlib.collections.LineCollection`
6804
+ instance created to identify the median values of each of the
6805
+ violin's distribution.
6806
+
6807
+ """
6808
+
6809
+ def _kde_method (X , coords ):
6810
+ kde = mlab .GaussianKDE (X , bw_method )
6811
+ return kde .evaluate (coords )
6812
+
6813
+ vpstats = cbook .violin_stats (dataset , _kde_method , points = points )
6814
+ return self .violin (vpstats , positions = positions , vert = vert ,
6815
+ widths = widths , showmeans = showmeans ,
6816
+ showextrema = showextrema , showmedians = showmedians )
6817
+
6818
+ def violin (self , vpstats , positions = None , vert = True , widths = 0.5 ,
6819
+ showmeans = False , showextrema = True , showmedians = False ):
6820
+ """
6821
+ Drawing function for violin plots.
6822
+
6823
+ Call signature::
6824
+
6825
+ violin(vpstats, positions=None, vert=True, widths=0.5,
6826
+ showmeans=False, showextrema=True, showmedians=False):
6827
+
6828
+ Draw a violin plot for each column of `vpstats`. Each filled area
6829
+ extends to represent the entire data range, with optional lines at the
6830
+ mean, the median, the minimum, and the maximum.
6831
+
6832
+ Parameters
6833
+ ----------
6834
+
6835
+ vpstats : list of dicts
6836
+ A list of dictionaries containing stats for each violin plot.
6837
+ Required keys are:
6838
+ - coords: A list of scalars containing the coordinates that
6839
+ the violin's kernel density estimate were evaluated at.
6840
+ - vals: A list of scalars containing the values of the kernel
6841
+ density estimate at each of the coordinates given in `coords`.
6842
+ - mean: The mean value for this violin's dataset.
6843
+ - median: The median value for this violin's dataset.
6844
+ - min: The minimum value for this violin's dataset.
6845
+ - max: The maximum value for this violin's dataset.
6846
+
6847
+ positions : array-like, default = [1, 2, ..., n]
6848
+ Sets the positions of the violins. The ticks and limits are
6849
+ automatically set to match the positions.
6850
+
6851
+ vert : bool, default = True.
6852
+ If true, plots the violins veritcally.
6853
+ Otherwise, plots the violins horizontally.
6854
+
6855
+ widths : array-like, default = 0.5
6856
+ Either a scalar or a vector that sets the maximal width of
6857
+ each violin. The default is 0.5, which uses about half of the
6858
+ available horizontal space.
6859
+
6860
+ showmeans : bool, default = False
6861
+ If true, will toggle rendering of the means.
6862
+
6863
+ showextrema : bool, default = True
6864
+ If true, will toggle rendering of the extrema.
6865
+
6866
+ showmedians : bool, default = False
6867
+ If true, will toggle rendering of the medians.
6868
+
6869
+ Returns
6870
+ -------
6871
+
6872
+ A dictionary mapping each component of the violinplot to a list of the
6873
+ corresponding collection instances created. The dictionary has
6874
+ the following keys:
6875
+
6876
+ - bodies: A list of the
6877
+ :class:`matplotlib.collections.PolyCollection` instances
6878
+ containing the filled area of each violin.
6879
+ - means: A :class:`matplotlib.collections.LineCollection` instance
6880
+ created to identify the mean values of each of the violin's
6881
+ distribution.
6882
+ - mins: A :class:`matplotlib.collections.LineCollection` instance
6883
+ created to identify the bottom of each violin's distribution.
6884
+ - maxes: A :class:`matplotlib.collections.LineCollection` instance
6885
+ created to identify the top of each violin's distribution.
6886
+ - bars: A :class:`matplotlib.collections.LineCollection` instance
6887
+ created to identify the centers of each violin's distribution.
6888
+ - medians: A :class:`matplotlib.collections.LineCollection`
6889
+ instance created to identify the median values of each of the
6890
+ violin's distribution.
6891
+
6892
+ """
6893
+
6894
+ # Statistical quantities to be plotted on the violins
6895
+ means = []
6896
+ mins = []
6897
+ maxes = []
6898
+ medians = []
6899
+
6900
+ # Collections to be returned
6901
+ artists = {}
6902
+
6903
+ N = len (vpstats )
6904
+ datashape_message = ("List of violinplot statistics and `{0}` "
6905
+ "values must have the same length" )
6906
+
6907
+ # Validate positions
6908
+ if positions is None :
6909
+ positions = range (1 , N + 1 )
6910
+ elif len (positions ) != N :
6911
+ raise ValueError (datashape_message .format ("positions" ))
6912
+
6913
+ # Validate widths
6914
+ if np .isscalar (widths ):
6915
+ widths = [widths ] * N
6916
+ elif len (widths ) != N :
6917
+ raise ValueError (datashape_message .format ("widths" ))
6918
+
6919
+ # Calculate ranges for statistics lines
6920
+ pmins = - 0.25 * np .array (widths ) + positions
6921
+ pmaxes = 0.25 * np .array (widths ) + positions
6922
+
6923
+ # Check whether we are rendering vertically or horizontally
6924
+ if vert :
6925
+ fill = self .fill_betweenx
6926
+ perp_lines = self .hlines
6927
+ par_lines = self .vlines
6928
+ else :
6929
+ fill = self .fill_between
6930
+ perp_lines = self .vlines
6931
+ par_lines = self .hlines
6932
+
6933
+ # Render violins
6934
+ bodies = []
6935
+ for stats , pos , width in zip (vpstats , positions , widths ):
6936
+ # The 0.5 factor reflects the fact that we plot from v-p to
6937
+ # v+p
6938
+ vals = np .array (stats ['vals' ])
6939
+ vals = 0.5 * width * vals / vals .max ()
6940
+ bodies += [fill (stats ['coords' ],
6941
+ - vals + pos ,
6942
+ vals + pos ,
6943
+ facecolor = 'y' ,
6944
+ alpha = 0.3 )]
6945
+ means .append (stats ['mean' ])
6946
+ mins .append (stats ['min' ])
6947
+ maxes .append (stats ['max' ])
6948
+ medians .append (stats ['median' ])
6949
+ artists ['bodies' ] = bodies
6950
+
6951
+ # Render means
6952
+ if showmeans :
6953
+ artists ['cmeans' ] = perp_lines (means , pmins , pmaxes , colors = 'r' )
6954
+
6955
+ # Render extrema
6956
+ if showextrema :
6957
+ artists ['cmaxes' ] = perp_lines (maxes , pmins , pmaxes , colors = 'r' )
6958
+ artists ['cmins' ] = perp_lines (mins , pmins , pmaxes , colors = 'r' )
6959
+ artists ['cbars' ] = par_lines (positions , mins , maxes , colors = 'r' )
6960
+
6961
+ # Render medians
6962
+ if showmedians :
6963
+ artists ['cmedians' ] = perp_lines (medians ,
6964
+ pmins ,
6965
+ pmaxes ,
6966
+ colors = 'r' )
6967
+
6968
+ return artists
6969
+
6728
6970
def tricontour (self , * args , ** kwargs ):
6729
6971
return mtri .tricontour (self , * args , ** kwargs )
6730
6972
tricontour .__doc__ = mtri .TriContourSet .tricontour_doc
0 commit comments