You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何设置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)

关键细节解释

  1. RGBA颜色的使用:
    Matplotlib支持用(r, g, b, alpha)的元组定义颜色,其中r/g/b取值范围是0-1(对应0-255的颜色值),alpha取值0-1(0完全透明,1完全不透明)。这里(1,0,0,0.5)代表半透明红色,这个透明度只会作用于填充色。
  2. 避免重复创建figure:
    你之前的代码先后调用plt.figure()和plt.subplots(),会生成两个独立的figure,导致出现一张空白图,所以我将这部分合并为一次plt.subplots()调用。
  3. 边框的alpha默认值:
    单独设置edgecolor='black'时,边框的透明度默认是1(完全不透明),无需额外设置,刚好实现「填充透明、边框不透明」的需求。

内容的提问来源于stack exchange,提问作者Matthi9000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 13:52:35