使用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
相关产品推荐
相关产品推荐

