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

使用Python的pandas与matplotlib无法从CSV文件生成完整箱线图

解决pandas箱线图因极值导致显示不完整的问题

问题背景

你尝试用pandas和matplotlib从CSV生成箱线图,但生成的图形显示不完整——仅能看到VN和NOK两个类别的箱线,其余类别几乎被挤压到无法辨认。

你的CSV数据

id,type_EN,nb_EN
1,VP,15
2,VN,600
3,FP,78
4,FN,17
5,NOK,974

你的原始代码

# import the required library
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

# load the dataset
df = pd.read_csv("boxplot.csv")

# print the boxplot
df.boxplot(by ="type_EN", column =["nb_EN"], grid = False)

问题原因

核心问题是数据中VN(600)和NOK(974)的数值远大于其他三个类别,导致y轴范围被这两个极值拉得过大,小数值类别的箱线被挤压到几乎看不见。

解决方案

方案1:使用对数刻度展示

对数刻度可以同时兼顾大数值和小数值的细节,让所有类别的箱线都清晰可见:

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

df = pd.read_csv("boxplot.csv")
ax = df.boxplot(by="type_EN", column=["nb_EN"], grid=False)
ax.set_yscale('log')  # 启用y轴对数刻度
plt.title('箱线图(对数刻度)')
plt.suptitle('')  # 移除pandas自动生成的顶部标题
plt.show()

方案2:拆分图表分别展示

将小数值类别和大数值类别分开绘制两个子图,避免互相干扰:

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

df = pd.read_csv("boxplot.csv")

# 按数值大小拆分数据集
small_group = df[df['nb_EN'] < 100]
large_group = df[df['nb_EN'] >= 100]

# 创建并排子图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

# 绘制小数值类别箱线图
small_group.boxplot(by="type_EN", column=["nb_EN"], grid=False, ax=ax1)
ax1.set_title('小数值类别箱线图')
ax1.set_ylim(0, 100)
ax1.set_suptitle('')

# 绘制大数值类别箱线图
large_group.boxplot(by="type_EN", column=["nb_EN"], grid=False, ax=ax2)
ax2.set_title('大数值类别箱线图')
ax2.set_suptitle('')

plt.tight_layout()
plt.show()

方案3:调整y轴范围聚焦小数值(可选)

如果只需要关注小数值类别的细节,可以手动设置y轴范围,但会隐藏大值的展示:

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

df = pd.read_csv("boxplot.csv")
ax = df.boxplot(by="type_EN", column=["nb_EN"], grid=False)
ax.set_ylim(0, 100)  # 限定y轴范围在0-100
plt.suptitle('')
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:01:06