Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit cf6f1af

Browse filesBrowse files
authored
Merge pull request #13449 from anntzer/boxplot-defaults
Let boxplot() defer rcParams application to bxp()
2 parents aa360dc + 2b8aee2 commit cf6f1af
Copy full SHA for cf6f1af

File tree

Expand file treeCollapse file tree

3 files changed

+114
-316
lines changed
Filter options
Expand file treeCollapse file tree

3 files changed

+114
-316
lines changed
+8Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
`~Axes.bxp` now respects :rc:`boxplot.boxprops.linewidth` even when *patch_artist* is set
2+
`````````````````````````````````````````````````````````````````````````````````````````
3+
4+
Previously, when the *patch_artist* parameter was set, `~Axes.bxp` would ignore
5+
:rc:`boxplot.boxprops.linewidth`. This was an oversight -- in particular,
6+
`~Axes.boxplot` did not ignore it.
7+
8+
This oversight is now fixed.

‎lib/matplotlib/axes/_axes.py

Copy file name to clipboardExpand all lines: lib/matplotlib/axes/_axes.py
+40-104Lines changed: 40 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -3637,33 +3637,23 @@ def boxplot(self, x, notch=None, sym=None, vert=None, whis=None,
36373637
if showfliers is None:
36383638
showfliers = rcParams['boxplot.showfliers']
36393639

3640-
def _update_dict(dictionary, rc_name, properties):
3641-
""" Loads properties in the dictionary from rc file if not already
3642-
in the dictionary"""
3643-
rc_str = 'boxplot.{0}.{1}'
3644-
if dictionary is None:
3645-
dictionary = dict()
3646-
for prop_dict in properties:
3647-
dictionary.setdefault(prop_dict,
3648-
rcParams[rc_str.format(rc_name, prop_dict)])
3649-
return dictionary
3650-
3651-
# Common property dicts loading from rc.
3652-
flier_props = ['color', 'marker', 'markerfacecolor', 'markeredgecolor',
3653-
'markersize', 'linestyle', 'linewidth']
3654-
default_props = ['color', 'linewidth', 'linestyle']
3655-
3656-
boxprops = _update_dict(boxprops, 'boxprops', default_props)
3657-
whiskerprops = _update_dict(whiskerprops, 'whiskerprops',
3658-
default_props)
3659-
capprops = _update_dict(capprops, 'capprops', default_props)
3660-
medianprops = _update_dict(medianprops, 'medianprops', default_props)
3661-
meanprops = _update_dict(meanprops, 'meanprops', default_props)
3662-
flierprops = _update_dict(flierprops, 'flierprops', flier_props)
3640+
if boxprops is None:
3641+
boxprops = {}
3642+
if whiskerprops is None:
3643+
whiskerprops = {}
3644+
if capprops is None:
3645+
capprops = {}
3646+
if medianprops is None:
3647+
medianprops = {}
3648+
if meanprops is None:
3649+
meanprops = {}
3650+
if flierprops is None:
3651+
flierprops = {}
36633652

36643653
if patch_artist:
3665-
boxprops['linestyle'] = 'solid'
3666-
boxprops['edgecolor'] = boxprops.pop('color')
3654+
boxprops['linestyle'] = 'solid' # Not consistent with bxp.
3655+
if 'color' in boxprops:
3656+
boxprops['edgecolor'] = boxprops.pop('color')
36673657

36683658
# if non-default sym value, put it into the flier dictionary
36693659
# the logic for providing the default symbol ('b+') now lives
@@ -3898,92 +3888,38 @@ def bxp(self, bxpstats, positions=None, widths=None, vert=True,
38983888
zorder = mlines.Line2D.zorder
38993889

39003890
zdelta = 0.1
3891+
3892+
def with_rcdefaults(subkey, explicit, zdelta=0):
3893+
d = {k.split('.')[-1]: v for k, v in rcParams.items()
3894+
if k.startswith(f'boxplot.{subkey}')}
3895+
d['zorder'] = zorder + zdelta
3896+
if explicit is not None:
3897+
d.update(explicit)
3898+
return d
3899+
39013900
# box properties
39023901
if patch_artist:
39033902
final_boxprops = dict(
39043903
linestyle=rcParams['boxplot.boxprops.linestyle'],
3904+
linewidth=rcParams['boxplot.boxprops.linewidth'],
39053905
edgecolor=rcParams['boxplot.boxprops.color'],
3906-
facecolor=rcParams['patch.facecolor'],
3907-
linewidth=rcParams['boxplot.boxprops.linewidth']
3906+
facecolor=('white' if rcParams['_internal.classic_mode'] else
3907+
rcParams['patch.facecolor']),
3908+
zorder=zorder,
39083909
)
3909-
if rcParams['_internal.classic_mode']:
3910-
final_boxprops['facecolor'] = 'white'
3910+
if boxprops is not None:
3911+
final_boxprops.update(boxprops)
39113912
else:
3912-
final_boxprops = dict(
3913-
linestyle=rcParams['boxplot.boxprops.linestyle'],
3914-
color=rcParams['boxplot.boxprops.color'],
3915-
)
3916-
3917-
final_boxprops['zorder'] = zorder
3918-
if boxprops is not None:
3919-
final_boxprops.update(boxprops)
3920-
3921-
# other (cap, whisker) properties
3922-
final_whiskerprops = dict(
3923-
linestyle=rcParams['boxplot.whiskerprops.linestyle'],
3924-
linewidth=rcParams['boxplot.whiskerprops.linewidth'],
3925-
color=rcParams['boxplot.whiskerprops.color'],
3926-
)
3927-
3928-
final_capprops = dict(
3929-
linestyle=rcParams['boxplot.capprops.linestyle'],
3930-
linewidth=rcParams['boxplot.capprops.linewidth'],
3931-
color=rcParams['boxplot.capprops.color'],
3932-
)
3933-
3934-
final_capprops['zorder'] = zorder
3935-
if capprops is not None:
3936-
final_capprops.update(capprops)
3937-
3938-
final_whiskerprops['zorder'] = zorder
3939-
if whiskerprops is not None:
3940-
final_whiskerprops.update(whiskerprops)
3941-
3942-
# set up the default flier properties
3943-
final_flierprops = dict(
3944-
linestyle=rcParams['boxplot.flierprops.linestyle'],
3945-
linewidth=rcParams['boxplot.flierprops.linewidth'],
3946-
color=rcParams['boxplot.flierprops.color'],
3947-
marker=rcParams['boxplot.flierprops.marker'],
3948-
markerfacecolor=rcParams['boxplot.flierprops.markerfacecolor'],
3949-
markeredgecolor=rcParams['boxplot.flierprops.markeredgecolor'],
3950-
markeredgewidth=rcParams['boxplot.flierprops.markeredgewidth'],
3951-
markersize=rcParams['boxplot.flierprops.markersize'],
3952-
)
3953-
3954-
final_flierprops['zorder'] = zorder
3955-
# flier (outlier) properties
3956-
if flierprops is not None:
3957-
final_flierprops.update(flierprops)
3958-
3959-
# median line properties
3960-
final_medianprops = dict(
3961-
linestyle=rcParams['boxplot.medianprops.linestyle'],
3962-
linewidth=rcParams['boxplot.medianprops.linewidth'],
3963-
color=rcParams['boxplot.medianprops.color'],
3964-
)
3965-
final_medianprops['zorder'] = zorder + zdelta
3966-
if medianprops is not None:
3967-
final_medianprops.update(medianprops)
3968-
3969-
# mean (line or point) properties
3970-
if meanline:
3971-
final_meanprops = dict(
3972-
linestyle=rcParams['boxplot.meanprops.linestyle'],
3973-
linewidth=rcParams['boxplot.meanprops.linewidth'],
3974-
color=rcParams['boxplot.meanprops.color'],
3975-
)
3976-
else:
3977-
final_meanprops = dict(
3978-
linestyle='',
3979-
marker=rcParams['boxplot.meanprops.marker'],
3980-
markerfacecolor=rcParams['boxplot.meanprops.markerfacecolor'],
3981-
markeredgecolor=rcParams['boxplot.meanprops.markeredgecolor'],
3982-
markersize=rcParams['boxplot.meanprops.markersize'],
3983-
)
3984-
final_meanprops['zorder'] = zorder + zdelta
3985-
if meanprops is not None:
3986-
final_meanprops.update(meanprops)
3913+
final_boxprops = with_rcdefaults('boxprops', boxprops)
3914+
final_whiskerprops = with_rcdefaults('whiskerprops', whiskerprops)
3915+
final_capprops = with_rcdefaults('capprops', capprops)
3916+
final_flierprops = with_rcdefaults('flierprops', flierprops)
3917+
final_medianprops = with_rcdefaults('medianprops', medianprops, zdelta)
3918+
final_meanprops = with_rcdefaults('meanprops', meanprops, zdelta)
3919+
removed_prop = 'marker' if meanline else 'linestyle'
3920+
# Only remove the property if it's not set explicitly as a parameter.
3921+
if meanprops is None or removed_prop not in meanprops:
3922+
final_meanprops[removed_prop] = ''
39873923

39883924
def to_vc(xs, ys):
39893925
# convert arguments to verts and codes, append (0, 0) (ignored).

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.