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

多子文件夹箱线图绘制报错:文件无法识别问题求助

解决你的箱线图绘制问题

先看你遇到的No such file or directory错误,直接原因是代码里的拼写错误:你把os.path.join写成了fos.path.join,Python找不到这个模块,自然没法正确拼接文件路径,导致找不到目标文件。

除了这个拼写错误,你的代码还有几个潜在问题,我帮你一起修正:

1. 修复拼写错误

把fos.path.join改成os.path.join,这是最紧急的问题。

2. 补充缺失的依赖导入

代码里用到了np.array,但没有导入numpy,需要在开头加上:

import numpy as np

3. 调整数据收集逻辑(实现多组箱线图)

如果你想为每个子文件夹单独绘制一组箱线图,而不是把所有文件的数据混在一起,需要把percentage改成二维列表,每个子文件夹对应一个子列表。现在你的代码是把所有文件的比例都放到同一个列表里,最后只会画出一组箱线图。

4. 修正箱线图绘制的位置和标签

现在plt.boxplot放在循环外面,label=directory只会取最后一个子文件夹的名字;如果要画多组,需要把每组数据传入并对应正确的标签。

修正后的完整代码

import os
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="darkgrid")
%matplotlib qt

root = r'/home/hossein/Desktop/Out/INTERSECTION/BETA 15'
# 改成二维列表,每个子文件夹对应一组数据
folder_percentages = []
folder_names = []

my_list = os.listdir(root)
# 过滤出子文件夹
my_list = [file for file in my_list if os.path.isdir(os.path.join(root, file))]

for directory in my_list:
    dir_path = os.path.join(root, directory)
    CASES = [file for file in os.listdir(dir_path) if file.startswith('config')]
    if len(CASES) == 0:
        continue
    CASES.sort()
    # 存储当前文件夹所有文件的比例
    current_percentages = []
    for filename in CASES:
        file_path = os.path.join(dir_path, filename)
        with open(file_path, "r") as file:
            lines = file.readlines()
            x = [float(line.split()[0]) for line in lines]
            y = [float(line.split()[1]) for line in lines]
            y_array = np.array(y)
            h = np.min(y_array) * 0.9
            t = np.max(y_array) * 0.9
            # 用numpy的布尔索引更高效地筛选异常值
            outliers = y_array[(y_array < h) | (y_array > t)]
            percent = len(outliers) / len(y_array)
            current_percentages.append(percent)
    # 当前文件夹有数据才加入列表
    if current_percentages:
        folder_percentages.append(current_percentages)
        folder_names.append(directory)

# 绘制多组箱线图
green_diamond = dict(markerfacecolor='g', marker='D')
plt.boxplot(folder_percentages, flierprops=green_diamond, whis=1.5, labels=folder_names)
plt.xlabel('子文件夹')
plt.ylabel('异常比例')
plt.title('各子文件夹数据异常比例箱线图')
plt.show()

额外说明

  • 我把whis=0.001改成了whis=1.5,这是箱线图的默认设置,用来定义须的长度(基于四分位距的倍数),0.001的话几乎看不到须,如果你有特殊需求可以改回去。
  • 用numpy的布尔索引替换了原来的循环,代码更简洁高效。
  • 现在每个子文件夹的异常比例会作为一组数据,在箱线图里单独显示,标签对应子文件夹名字。

内容的提问来源于stack exchange,提问作者Mir.Emad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 21:52:55