diff --git a/plotnine/geoms/geom_boxplot.py b/plotnine/geoms/geom_boxplot.py index 0bb252acc8..244cefa1ff 100644 --- a/plotnine/geoms/geom_boxplot.py +++ b/plotnine/geoms/geom_boxplot.py @@ -134,7 +134,7 @@ def flat(*args): 'x': flat(data['x'], data['x']), 'y': flat(data['upper'], data['lower']), 'yend': flat(data['ymax'], data['ymin']), - 'alpha': 1 + 'alpha': flat(data['alpha'], data['alpha']) }) whiskers['xend'] = whiskers['x'] copy_missing_columns(whiskers, data[common_columns]) @@ -199,7 +199,9 @@ def draw_legend(data, da, lyr): facecolor = to_rgba(data['fill'], data['alpha']) if facecolor is None: facecolor = 'none' - + edgecolor = to_rgba(data['color'], data['alpha']) + if edgecolor is None: + edgecolor = 'none' kwargs = dict( linestyle=data['linetype'], linewidth=data['size']) @@ -208,7 +210,7 @@ def draw_legend(data, da, lyr): width=da.width*.75, height=da.height*.5, facecolor=facecolor, - edgecolor=data['color'], + edgecolor=edgecolor, capstyle='projecting', antialiased=False, **kwargs) @@ -216,6 +218,7 @@ def draw_legend(data, da, lyr): kwargs['solid_capstyle'] = 'butt' kwargs['color'] = data['color'] + kwargs['alpha'] = data['alpha'] kwargs['linewidth'] *= SIZE_FACTOR # middle strike through diff --git a/plotnine/geoms/geom_crossbar.py b/plotnine/geoms/geom_crossbar.py index defcf8c6d8..4f4cf30d89 100644 --- a/plotnine/geoms/geom_crossbar.py +++ b/plotnine/geoms/geom_crossbar.py @@ -73,7 +73,7 @@ def flat(*args): 'yend': y, 'group': group}) copy_missing_columns(middle, data) - middle['alpha'] = 1 + middle['alpha'] = data['alpha'] middle['size'] *= params['fatten'] has_notch = ynotchlower is not None and ynotchupper is not None diff --git a/plotnine/geoms/geom_polygon.py b/plotnine/geoms/geom_polygon.py index 92c7be0ba2..4b4f5b16fd 100644 --- a/plotnine/geoms/geom_polygon.py +++ b/plotnine/geoms/geom_polygon.py @@ -59,7 +59,8 @@ def draw_group(data, panel_params, coord, ax, **params): verts[i] = tuple(zip(df['x'], df['y'])) fill = to_rgba(df['fill'].iloc[0], df['alpha'].iloc[0]) facecolor[i] = 'none' if fill is None else fill - edgecolor[i] = df['color'].iloc[0] or 'none' + color = to_rgba(df['color'].iloc[0], df['alpha'].iloc[0]) + edgecolor[i] = 'none' if color is None else color linestyle[i] = df['linetype'].iloc[0] linewidth[i] = df['size'].iloc[0] @@ -96,6 +97,9 @@ def draw_legend(data, da, lyr): da.width/4, da.height/4]) if data['color'] is None: linewidth = 0 + edgecolor = None + else: + edgecolor = to_rgba(data['color'], data['alpha']) facecolor = to_rgba(data['fill'], data['alpha']) if facecolor is None: @@ -107,7 +111,7 @@ def draw_legend(data, da, lyr): linewidth=linewidth, linestyle=data['linetype'], facecolor=facecolor, - edgecolor=data['color'], + edgecolor=edgecolor, capstyle='projecting') da.add_artist(rect) return da diff --git a/plotnine/geoms/geom_rect.py b/plotnine/geoms/geom_rect.py index e09c23cb61..48e928be03 100644 --- a/plotnine/geoms/geom_rect.py +++ b/plotnine/geoms/geom_rect.py @@ -53,11 +53,11 @@ def draw_group(data, panel_params, coord, ax, **params): verts[i] = [(l, b), (l, t), (r, t), (r, b)] fill = to_rgba(data['fill'], data['alpha']) - color = data['color'] # prevent unnecessary borders - if all(color.isnull()): + if all(data['color'].isnull()): color = 'none' + color = to_rgba(data['color'], data['alpha']) col = PolyCollection( verts, diff --git a/plotnine/geoms/geom_ribbon.py b/plotnine/geoms/geom_ribbon.py index f501fabe92..63f3331ff6 100644 --- a/plotnine/geoms/geom_ribbon.py +++ b/plotnine/geoms/geom_ribbon.py @@ -45,13 +45,13 @@ def draw_group(data, panel_params, coord, ax, **params): def draw_unit(data, panel_params, coord, ax, **params): data['size'] *= SIZE_FACTOR fill = to_rgba(data['fill'], data['alpha']) - color = data['color'] - if fill is None: fill = 'none' - if all(color.isnull()): + if all(data['color'].isnull()): color = 'none' + else: + color = to_rgba(data['color'], data['alpha']) if isinstance(coord, coord_flip): fill_between = ax.fill_betweenx diff --git a/plotnine/tests/baseline_images/test_annotate/multiple_annotation_geoms.png b/plotnine/tests/baseline_images/test_annotate/multiple_annotation_geoms.png index 2afe92aebb..0622e07fff 100644 Binary files a/plotnine/tests/baseline_images/test_annotate/multiple_annotation_geoms.png and b/plotnine/tests/baseline_images/test_annotate/multiple_annotation_geoms.png differ diff --git a/plotnine/tests/baseline_images/test_geom_bar/bar_alpha.png b/plotnine/tests/baseline_images/test_geom_bar/bar_alpha.png new file mode 100644 index 0000000000..d8b4ea9d9c Binary files /dev/null and b/plotnine/tests/baseline_images/test_geom_bar/bar_alpha.png differ diff --git a/plotnine/tests/baseline_images/test_geom_boxplot/params.png b/plotnine/tests/baseline_images/test_geom_boxplot/params.png index 7eb409dd65..95a5dcc1ff 100644 Binary files a/plotnine/tests/baseline_images/test_geom_boxplot/params.png and b/plotnine/tests/baseline_images/test_geom_boxplot/params.png differ diff --git a/plotnine/tests/baseline_images/test_geom_crossbar/aesthetics.png b/plotnine/tests/baseline_images/test_geom_crossbar/aesthetics.png index cb4e29b084..362c2bc938 100644 Binary files a/plotnine/tests/baseline_images/test_geom_crossbar/aesthetics.png and b/plotnine/tests/baseline_images/test_geom_crossbar/aesthetics.png differ diff --git a/plotnine/tests/baseline_images/test_geom_density/gaussian-trimmed.png b/plotnine/tests/baseline_images/test_geom_density/gaussian-trimmed.png index 4d6fb90a0e..00b7b4210a 100644 Binary files a/plotnine/tests/baseline_images/test_geom_density/gaussian-trimmed.png and b/plotnine/tests/baseline_images/test_geom_density/gaussian-trimmed.png differ diff --git a/plotnine/tests/baseline_images/test_geom_density/gaussian.png b/plotnine/tests/baseline_images/test_geom_density/gaussian.png index 2b0dd53a1c..751916c098 100644 Binary files a/plotnine/tests/baseline_images/test_geom_density/gaussian.png and b/plotnine/tests/baseline_images/test_geom_density/gaussian.png differ diff --git a/plotnine/tests/baseline_images/test_geom_density/triangular.png b/plotnine/tests/baseline_images/test_geom_density/triangular.png index 8e640f49b7..9710edbf80 100644 Binary files a/plotnine/tests/baseline_images/test_geom_density/triangular.png and b/plotnine/tests/baseline_images/test_geom_density/triangular.png differ diff --git a/plotnine/tests/test_geom_bar.py b/plotnine/tests/test_geom_bar.py new file mode 100644 index 0000000000..d67241639a --- /dev/null +++ b/plotnine/tests/test_geom_bar.py @@ -0,0 +1,18 @@ +import pandas as pd + +from plotnine import ggplot, aes, geom_bar + + +def test_bar_alpha(): + df = pd.DataFrame( + { + "x": ["a%i" % i for i in range(10)], + "y": range(1, 11), + "alpha": [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1], + } + ) + p = ggplot(df, aes("x")) + geom_bar( + aes(y="y", alpha="alpha"), + stat="identity", color="blue", position="dodge" + ) + assert p == "bar_alpha" diff --git a/plotnine/tests/test_geom_boxplot.py b/plotnine/tests/test_geom_boxplot.py index 443afe3b50..62fb46c281 100644 --- a/plotnine/tests/test_geom_boxplot.py +++ b/plotnine/tests/test_geom_boxplot.py @@ -33,7 +33,7 @@ def test_aesthetics_coordflip(self): def test_params(): p = (ggplot(df, aes('x')) + - geom_boxplot(df[:m], aes(y='y'), size=2, notch=True) + + geom_boxplot(df[:m], aes(y='y'), size=2, notch=True, alpha=0.3) + geom_boxplot(df[m:2*m], aes(y='y'), size=2, notch=True, notchwidth=0.8) + # outliers