Movatterモバイル変換


[0]ホーム

URL:


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

Sign up
Appearance settings

Commit27adcbd

Browse files
authored
Merge pull requestmatplotlib#30636 from timhoffm/fix-violin-artist-alpha
FIX: Keep legacy alpha behavior for violinplot without facecolor
2 parentsf783a69 +f70a4a2 commit27adcbd

File tree

2 files changed

+45
-4
lines changed

2 files changed

+45
-4
lines changed

‎lib/matplotlib/axes/_axes.py‎

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8967,6 +8967,14 @@ def violin(self, vpstats, positions=None, vert=None,
89678967
89688968
.. versionadded:: 3.11
89698969
8970+
For backward compatibility, if *facecolor* is not given, the body
8971+
will get an Artist-level transparency `alpha <.Artist.set_alpha>`
8972+
of 0.3, which will persist if you afterwards change the facecolor,
8973+
e.g. via ``result['bodies'][0].set_facecolor('red')``.
8974+
If *facecolor* is given, there is no Artist-level transparency.
8975+
To set transparency for *facecolor* or *edgecolor* use
8976+
``(color, alpha)`` tuples.
8977+
89708978
linecolor : :mpltype:`color` or list of :mpltype:`color`, optional
89718979
If provided, will set the line color(s) of the violins (the
89728980
horizontal and vertical spines and body edges).
@@ -9074,13 +9082,14 @@ def cycle_color(color, alpha=None):
90749082

90759083
iffacecolorisnotNone:
90769084
facecolor=cycle_color(facecolor)
9085+
body_artist_alpha=None
90779086
else:
9078-
default_facealpha=0.3
9087+
body_artist_alpha=0.3
90799088
# Use default colors if user doesn't provide them
90809089
ifmpl.rcParams['_internal.classic_mode']:
9081-
facecolor=cycle_color('y',alpha=default_facealpha)
9090+
facecolor=cycle_color('y')
90829091
else:
9083-
facecolor=cycle_color(next_color,alpha=default_facealpha)
9092+
facecolor=cycle_color(next_color)
90849093

90859094
ifmpl.rcParams['_internal.classic_mode']:
90869095
# Classic mode uses patch.force_edgecolor=True, so we need to
@@ -9129,7 +9138,8 @@ def cycle_color(color, alpha=None):
91299138
bodies+= [fill(stats['coords'],
91309139
-vals+posifsidein ['both','low']elsepos,
91319140
vals+posifsidein ['both','high']elsepos,
9132-
facecolor=facecolor,edgecolor=body_edgecolor)]
9141+
facecolor=facecolor,edgecolor=body_edgecolor,
9142+
alpha=body_artist_alpha)]
91339143
means.append(stats['mean'])
91349144
mins.append(stats['min'])
91359145
maxes.append(stats['max'])

‎lib/matplotlib/tests/test_axes.py‎

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4181,6 +4181,10 @@ def color_violins(parts, facecolor=None, linecolor=None):
41814181
iffacecolorisnotNone:
41824182
forpcinparts['bodies']:
41834183
pc.set_facecolor(facecolor)
4184+
# disable alpha Artist property to counter the legacy behavior
4185+
# that applies an alpha of 0.3 to the bodies if no facecolor
4186+
# was set
4187+
pc.set_alpha(None)
41844188
iflinecolorisnotNone:
41854189
forpartnamein ('cbars','cmins','cmaxes','cmeans','cmedians'):
41864190
ifpartnameinparts:
@@ -4238,6 +4242,33 @@ def assert_colors_equal(colors1, colors2):
42384242
assert_colors_equal(colors_test,mcolors.to_rgba_array(linecolors))
42394243

42404244

4245+
deftest_violinplot_alpha():
4246+
matplotlib.style.use('default')
4247+
data= [(np.random.normal(0,1,100))]
4248+
4249+
fig,ax=plt.subplots()
4250+
parts=ax.violinplot(data,positions=[1])
4251+
4252+
# Case 1: If facecolor is unspecified, it's the first color from the color cycle
4253+
# with Artist-level alpha=0.3
4254+
facecolor= ('y'ifmpl.rcParams['_internal.classic_mode']
4255+
elseplt.rcParams['axes.prop_cycle'].by_key()['color'][0])
4256+
assertmcolors.same_color(parts['bodies'][0].get_facecolor(), (facecolor,0.3))
4257+
assertparts['bodies'][0].get_alpha()==0.3
4258+
# setting a new facecolor maintains the alpha
4259+
parts['bodies'][0].set_facecolor('red')
4260+
assertmcolors.same_color(parts['bodies'][0].get_facecolor(), ('red',0.3))
4261+
4262+
# Case 2: If facecolor is explicitly given, it's alpha does not become an
4263+
# Artist property
4264+
parts=ax.violinplot(data,positions=[1],facecolor=('blue',0.3))
4265+
assertmcolors.same_color(parts['bodies'][0].get_facecolor(), ('blue',0.3))
4266+
assertparts['bodies'][0].get_alpha()isNone
4267+
# so setting a new color does not maintain the alpha
4268+
parts['bodies'][0].set_facecolor('red')
4269+
assertmcolors.same_color(parts['bodies'][0].get_facecolor(),'red')
4270+
4271+
42414272
@check_figures_equal()
42424273
deftest_violinplot_single_list_quantiles(fig_test,fig_ref):
42434274
# Ensures quantile list for 1D can be passed in as single list

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp