多子文件夹箱线图绘制报错:文件无法识别问题求助
解决你的箱线图绘制问题
先看你遇到的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
相关产品推荐
相关产品推荐

