@@ -8100,15 +8100,17 @@ def violin(self, vpstats, positions=None, vert=True, widths=0.5,
8100
8100
- ``cquantiles``: A `~.collections.LineCollection` instance created
8101
8101
to identify the quantiles values of each of the violin's
8102
8102
distribution.
8103
-
8104
8103
"""
8105
8104
8106
8105
# Statistical quantities to be plotted on the violins
8107
8106
means = []
8108
8107
mins = []
8109
8108
maxes = []
8110
8109
medians = []
8111
- quantiles = np .asarray ([])
8110
+ quantiles = []
8111
+
8112
+ ppmins = [] # left end of quantiles lines
8113
+ ppmaxs = [] # right end of quantiles lines
8112
8114
8113
8115
# Collections to be returned
8114
8116
artists = {}
@@ -8133,80 +8135,53 @@ def violin(self, vpstats, positions=None, vert=True, widths=0.5,
8133
8135
pmins = - 0.25 * np .array (widths ) + positions
8134
8136
pmaxes = 0.25 * np .array (widths ) + positions
8135
8137
8138
+ # Colors.
8139
+ if rcParams ['_internal.classic_mode' ]:
8140
+ fillcolor = 'y'
8141
+ linecolor = 'r'
8142
+ else :
8143
+ fillcolor = linecolor = self ._get_lines .get_next_color ()
8144
+
8136
8145
# Check whether we are rendering vertically or horizontally
8137
8146
if vert :
8138
8147
fill = self .fill_betweenx
8139
- perp_lines = self .hlines
8140
- par_lines = self .vlines
8148
+ perp_lines = functools . partial ( self .hlines , colors = linecolor )
8149
+ par_lines = functools . partial ( self .vlines , colors = linecolor )
8141
8150
else :
8142
8151
fill = self .fill_between
8143
- perp_lines = self .vlines
8144
- par_lines = self .hlines
8145
-
8146
- if rcParams ['_internal.classic_mode' ]:
8147
- fillcolor = 'y'
8148
- edgecolor = 'r'
8149
- else :
8150
- fillcolor = edgecolor = self ._get_lines .get_next_color ()
8152
+ perp_lines = functools .partial (self .vlines , colors = linecolor )
8153
+ par_lines = functools .partial (self .hlines , colors = linecolor )
8151
8154
8152
8155
# Render violins
8153
8156
bodies = []
8154
- for stats , pos , width in zip (vpstats , positions , widths ):
8155
- # The 0.5 factor reflects the fact that we plot from v-p to
8156
- # v+p
8157
+ for stats , pos , width , cmin , cmax in zip (
8158
+ vpstats , positions , widths , pmins , pmaxes ):
8159
+ # The 0.5 factor reflects the fact that we plot from v-p to v+p.
8157
8160
vals = np .array (stats ['vals' ])
8158
8161
vals = 0.5 * width * vals / vals .max ()
8159
- bodies += [fill (stats ['coords' ],
8160
- - vals + pos ,
8161
- vals + pos ,
8162
- facecolor = fillcolor ,
8163
- alpha = 0.3 )]
8162
+ bodies += [fill (stats ['coords' ], - vals + pos , vals + pos ,
8163
+ facecolor = fillcolor , alpha = 0.3 )]
8164
8164
means .append (stats ['mean' ])
8165
8165
mins .append (stats ['min' ])
8166
8166
maxes .append (stats ['max' ])
8167
8167
medians .append (stats ['median' ])
8168
8168
q = stats .get ('quantiles' )
8169
8169
if q is not None :
8170
- # If exist key quantiles, assume it's a list of floats
8171
- quantiles = np .concatenate ((quantiles , q ))
8170
+ quantiles .extend (q ) # q is assumed to be a list of floats.
8171
+ ppmins .extend ([cmin ] * len (q ))
8172
+ ppmaxs .extend ([cmax ] * len (q ))
8172
8173
artists ['bodies' ] = bodies
8173
8174
8174
- # Render means
8175
- if showmeans :
8176
- artists ['cmeans' ] = perp_lines (means , pmins , pmaxes ,
8177
- colors = edgecolor )
8178
-
8179
- # Render extrema
8180
- if showextrema :
8181
- artists ['cmaxes' ] = perp_lines (maxes , pmins , pmaxes ,
8182
- colors = edgecolor )
8183
- artists ['cmins' ] = perp_lines (mins , pmins , pmaxes ,
8184
- colors = edgecolor )
8185
- artists ['cbars' ] = par_lines (positions , mins , maxes ,
8186
- colors = edgecolor )
8187
-
8188
- # Render medians
8189
- if showmedians :
8190
- artists ['cmedians' ] = perp_lines (medians ,
8191
- pmins ,
8192
- pmaxes ,
8193
- colors = edgecolor )
8194
-
8195
- # Render quantile values
8196
- if quantiles .size > 0 :
8197
- # Recalculate ranges for statistics lines for quantiles.
8198
- # ppmins are the left end of quantiles lines
8199
- ppmins = np .asarray ([])
8200
- # pmaxes are the right end of quantiles lines
8201
- ppmaxs = np .asarray ([])
8202
- for stats , cmin , cmax in zip (vpstats , pmins , pmaxes ):
8203
- q = stats .get ('quantiles' )
8204
- if q is not None :
8205
- ppmins = np .concatenate ((ppmins , [cmin ] * np .size (q )))
8206
- ppmaxs = np .concatenate ((ppmaxs , [cmax ] * np .size (q )))
8207
- # Start rendering
8208
- artists ['cquantiles' ] = perp_lines (quantiles , ppmins , ppmaxs ,
8209
- colors = edgecolor )
8175
+ if showmeans : # Render means
8176
+ artists ['cmeans' ] = perp_lines (means , pmins , pmaxes )
8177
+ if showextrema : # Render extrema
8178
+ artists ['cmaxes' ] = perp_lines (maxes , pmins , pmaxes )
8179
+ artists ['cmins' ] = perp_lines (mins , pmins , pmaxes )
8180
+ artists ['cbars' ] = par_lines (positions , mins , maxes )
8181
+ if showmedians : # Render medians
8182
+ artists ['cmedians' ] = perp_lines (medians , pmins , pmaxes )
8183
+ if quantiles : # Render quantiles
8184
+ artists ['cquantiles' ] = perp_lines (quantiles , ppmins , ppmaxs )
8210
8185
8211
8186
return artists
8212
8187
0 commit comments