pandas 的 DataFrame.boxplot 可以直接对 DataFrame 画箱线图,底层仍依赖 matplotlib。它自身负责列选择、分组、字体、旋转、网格、图形尺寸、布局和返回类型,其他关键字会通过 **kwds 传给 matplotlib.pyplot.boxplot。原文记录了一次 Jupyter 画图时右上角出现灰色小框的问题,最终通过调整图像尺寸解决。下面把参数和排查过程整理成可复用的写法。
一、DataFrame.boxplot 的基础参数
调用签名如下:- DataFrame.boxplot(column=None,
- by=None,
- ax=None,
- fontsize=None,
- rot=0,
- grid=True,
- figsize=None,
- layout=None,
- return_type=None,
- **kwds)
复制代码 参数含义:
column:str 或 str 列表,可选列名、名称列表或向量,可以是 pandas.DataFrame.groupby() 的有效输入。
by:str 或 array-like,可选,用于按 DataFrame 中的列分组,箱线图会按每列的值绘制。
ax:matplotlib.axes.Axes 对象,可选,指定 boxplot 使用的 matplotlib 轴。
fontsize:float 或 str,用于标签字体大小,也可以使用“大”这类字符串标记。
rot:int 或 float,默认 0,表示标签相对屏幕坐标系的旋转角度。
grid:布尔值,默认 True,设为 True 显示网格。
figsize:以英寸为单位的元组(宽度,高度),用于设置 matplotlib 创建的图形大小。
layout:元组(行,列),例如 (3,5) 会从左上角开始使用 3 列和 5 行显示子图。
return_type:{'axes','dict','both'} 或 None,默认 'axes'。'axes' 返回绘制 boxplot 的 matplotlib 轴;'dict' 返回一个字典,其值是 boxplot 的 matplotlib 行;'both' 返回带有轴和 dict 的 namedtuple。按 by 分组时,return_type 会返回一系列映射列。若 return_type 为 None,layout 会返回具有相同形状的 NumPy 轴阵列。
**kwds:传递给 matplotlib.pyplot.boxplot() 的其他绘图关键字参数。
二、额外可用的箱线图参数
除了 DataFrame.boxplot 自身列出的参数,原文还对比发现可以直接使用底层箱线图参数,例如:- DataFrame.boxplot(sym='.',
- vert=True,
- whis=1.5,
- patch_artist=True,
- meanline=False,
- showmeans=True,
- showcaps=True,
- notch=False,
- return_type='dict')
复制代码 这些参数的含义如下:
sym:异常点形状。
vert:是否垂直,False 为横向箱线图,True 为竖向箱线图。
whis:默认 1.5,也可以设置区间,例如 [5,95],表示强制上下边缘为数据 95% 和 5% 的位置。
patch_artist:上下四分位框内是否填充,True 表示填充。
meanline:是否用线的形式表示均值,默认用点表示。
showmeans:是否显示均值,默认不显示。
shoubox(即 showbox):是否显示边缘线,箱线图顶端和末端的两条线默认显示。
showfliers:是否显示异常值。
notch:中间箱体是否缺口。
return_type:返回类型。
positions:指定箱线图的位置。
widths:指定箱线图的宽度,默认为 0.5。
三、右上角灰色小框问题
原文在 Jupyter 中绘制箱线图时使用如下代码:- plt.figure(figsize=(11.5, 6.5))
- cop_df.boxplot(showmeans=True, fontsize=8, notch=True, sym='.', grid=False)
复制代码 现象是图中右上角出现一个灰色小框,原文没有说明这个灰色小框的具体成因。随后作者调整图像大小,代码如下:- plt.figure(figsize=(9.5, 6.5))
- df.boxplot(showmeans=True, fontsize=7, notch=True, sym='.', grid=False)
复制代码 这段解决代码中的参数含义为:showmeans=True 显示平均值,默认为三角形;fontsize=7 设置坐标轴字体大小;notch=True 设置箱体中位线处收回;sym='.' 把异常点形状设置为小圆点;grid=False 去掉图中的网格。需要注意的是,原文的解决代码同时把 figsize 从 (11.5,6.5) 调成 (9.5,6.5),并把 fontsize 从 8 调成 7,因此这是参数组合调整,不是对单一参数的严格对照实验。复现问题时可以优先检查 figsize 和 fontsize,再结合 showmeans、notch、sym、grid 等参数逐步调整。
四、调用时如何理解返回类型
如果后续还要对图形对象做处理,return_type 很关键。需要拿到 matplotlib 轴时用 'axes';需要拿到箱线图各行对象时用 'dict';同时需要轴和字典时用 'both'。按 by 分组时,返回结构会随 return_type 变化。若传入 layout 且 return_type 为 None,则会返回同形状的 NumPy 轴阵列。这也是 DataFrame.boxplot 与直接调用 matplotlib.pyplot.boxplot 时容易混淆的地方:前者是 DataFrame 的封装方法,后者是底层绘图函数,**kwds 正是两者之间的透传入口。
总结:DataFrame.boxplot 的参数可以分成两类,一类控制 DataFrame 列、分组、字体、旋转、网格、figsize、layout 和返回类型,另一类透传给 matplotlib.pyplot.boxplot,包括 sym、vert、whis、patch_artist、meanline、showmeans、showcaps、showfliers、notch、positions、widths 等。原文遇到右上角灰色小框时,通过把 figsize 改为 (9.5,6.5)、fontsize 改为 7 的组合方式解决;实际调试时建议保留完整参数,逐一调整验证。 |