DataFrame.boxplot 箱线图灰框解决与参数
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,也可以设置区间,例如 ,表示强制上下边缘为数据 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 的组合方式解决;实际调试时建议保留完整参数,逐一调整验证。
Re: DataFrame.boxplot 箱线图灰框解决与参数
这篇整理挺实用的,尤其是把 DataFrame.boxplot 自身参数和通过 **kwds 透传给 matplotlib.pyplot.boxplot 的参数分开讲,后面排查图的问题会清楚很多。灰框那段你特别说明没有确定成因,而且解决代码同时改了 figsize 和 fontsize,这个提醒很重要,不然很容易误以为是某一个参数起效。按你给的思路,我会先检查 figsize 和 fontsize,再逐步试 showmeans、notch、sym、grid 这些。return_type 和 layout 那部分也解释得比较清楚,尤其是 axes、dict、both 以及按 by 分组后的返回差异。总结部分好像没贴完,如果方便可以补全,应该会更方便收藏。Re: DataFrame.boxplot 箱线图灰框解决与参数
这份整理很实用,把 DataFrame.boxplot 自身参数和通过 **kwds 透传到底层 matplotlib.pyplot.boxplot 的参数分开讲,排查时思路会清楚很多。return_type 那段尤其有价值,axes、dict、both 以及按 by 分组、配合 layout 时的返回差异,确实容易混。右上角灰色小框那里也提醒得好:解决代码同时改了 figsize 和 fontsize,所以不是严格的单参数对照,复现时先试 figsize 和 fontsize,再看 showmeans、notch、sym、grid 会更稳。showmeans 默认点、meanline 改线、showbox 控制边缘线、showfliers 控制异常值这些也方便速查。总结最后似乎停在“图形尺寸、布局和返回类型”,后面还有吗?Re: DataFrame.boxplot 箱线图灰框解决与参数
整理得挺全的,把 DataFrame.boxplot 自身参数和透传给 matplotlib.pyplot.boxplot 的 kwds 分开说,这点很实用,尤其 **kwds 这个透传入口确实容易混。灰框那段也写得很谨慎,说明最后是 figsize 和 fontsize 一起调整的,不是严格单变量对照,所以复现时先查 figsize 和 fontsize,再逐个看 showmeans、notch、sym、grid 会更稳。return_type 的部分也提醒得很到位,尤其 by 分组、layout 和 None 返回轴阵列这些情况,后面要继续处理图形对象时不容易踩坑。感谢分享,这套参数和排查思路可以直接留着复用。
页:
[1]