如何设置Matplotlib箱线图箱体填充色透明度且边框不透明?
解决Matplotlib箱线图箱体填充色透明但边框不透明的问题
你碰到的问题很典型——当给箱线图的箱体Patch设置alpha参数时,这个透明度会作用于整个Patch(填充色+边框),所以才会出现边框也变透明的情况。要实现「填充色半透明、边框完全不透明」的效果,我们可以直接用RGBA颜色值来定义填充色,把透明度整合到颜色里,而不是单独设置alpha属性。
修改后的完整代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib matplotlib.interactive(True) df = pd.DataFrame({ "A": [18,28,29,32,35,36,37,37,39,40,42,42,46,48,54,56,57,61,61,62,63,65], "B": [9,13,17,15,23,21,24,28,26,30,29,30,38,42,40,48,40,51,54,50,51,57], "C": [1,98,65,47,58,95,24,5,63,7,41,5,6,84,56,96,33,25,61,94,68,83] }) columns = ['A', 'B'] df_data = df.loc[:, columns] def boxplot(y_lims, y_lime): # 合并重复的figure创建,避免生成空白图 fig, ax = plt.subplots(figsize=((12.0 / 2.54), (7.42 / 2.54)), facecolor=None, edgecolor='black') boxprops = dict(linestyle='-', linewidth=0.6) bp = df_data.boxplot( ax=ax, grid=False, showfliers=False, boxprops=boxprops, showmeans=True, return_type='dict', patch_artist=True ) # 关键修改:用RGBA元组指定半透明红色填充,边框单独设置为不透明黑色 [patch.set(facecolor=(1, 0, 0, 0.5)) for patch in bp['boxes']] # RGBA=(红,绿,蓝,透明度) [patch.set_edgecolor('black') for patch in bp['boxes']] # 边框默认alpha=1,完全不透明 # 其他元素的设置保持不变 [item.set_color('black') for item in bp['whiskers']] [item.set_color('black') for item in bp['caps']] [item.set_marker('.') for item in bp['means']] [item.set_markerfacecolor('black') for item in bp['means']] [item.set_markeredgecolor('black') for item in bp['means']] [item.set_color('black') for item in bp['medians']] ax.set_ylim(y_lims, y_lime) plt.show() if __name__ == '__main__': Boxplot_a = boxplot(None, None)
关键细节解释
- RGBA颜色的使用:
Matplotlib支持用(r, g, b, alpha)的元组定义颜色,其中r/g/b取值范围是0-1(对应0-255的颜色值),alpha取值0-1(0完全透明,1完全不透明)。这里(1,0,0,0.5)代表半透明红色,这个透明度只会作用于填充色。 - 避免重复创建figure:
你之前的代码先后调用plt.figure()和plt.subplots(),会生成两个独立的figure,导致出现一张空白图,所以我将这部分合并为一次plt.subplots()调用。 - 边框的alpha默认值:
单独设置edgecolor='black'时,边框的透明度默认是1(完全不透明),无需额外设置,刚好实现「填充透明、边框不透明」的需求。
内容的提问来源于stack exchange,提问作者Matthi9000
相关产品推荐
相关产品推荐

