概述
在上一篇文章中,介绍了如何使用Excel自带图表插入带分组的并排箱形图,可以快速地使用鼠标实现。但有些地方要求更严格,或者对细节要求更丰富,就可以使用seaborn的boxplot,它和boxenplot都是matplotlib.pyplot.boxplot的优化版,出图更方便更美观,下面就以seaborn.boxplot为例进行说明。
箱线图能够展示、探索三种结构的数据,或者是其他结构的数据能转换成下列三种的:
- 单一维度数据,且该维度是数值型变量
- 两个维度的数据,其中一个维度是数值型变量,另一个维度是分类型变量
- 三个维度的数据,其中一个维度是数值型变量,另外两个维度是分类型变量
下面就举例说明:
对一维数据画箱线图
只要这个维度的数据是数值型变量即可:
对二维数据画箱线图
y轴展示的维度需要是数值型变量,x轴展示的维度需要是分类型变量:
ax = sns.boxplot(x='class', y='alpha(%)', data=ppfx_md, color='r')
plt.show()
对三维数据画箱线图
y轴展示的维度需要是数值型变量,x轴展示的维度需要是其中一个分类型变量,图例(hue)展示另一个维度的分类型变量:
def adjust_box_widths(g, fac):
"""
Adjust the withs of a seaborn-generated boxplot.
"""
# iterating through Axes instances
for ax in g.axes:
# iterating through axes artists:
for c in ax.get_children():
# searching for PathPatches
if isinstance(c, PathPatch):
# getting current width of box:
p = c.get_path()
verts = p.vertices
verts_sub = verts[:-1]
xmin = np.min(verts_sub[:, 0])
xmax = np.max(verts_sub[:, 0])
xmid = 0.5 * (xmin + xmax)
xhalf = 0.5 * (xmax - xmin)
# setting new width of box
xmin_new = xmid - fac * xhalf
xmax_new = xmid + fac * xhalf
verts_sub[verts_sub[:, 0] == xmin, 0] = xmin_new
verts_sub[verts_sub[:, 0] == xmax, 0] = xmax_new
# setting new width of median line
for l in ax.lines:
if np.all(l.get_xdata() == [xmin, xmax]):
l.set_xdata([xmin_new, xmax_new])
df_box = ppfx_md[ppfx_md['class'] != 'Fruit'][['alpha(%)', 'AA(%)', 'ppfx(%)', 'class']]
df_box = df_box.melt(id_vars='class')
bp = sns.boxplot(data=df_box, x='variable', y='value', hue='class', hue_order=['Aquatic', 'Vegetable'],
order=['ppfx(%)', 'alpha(%)', 'AA(%)'], fliersize=4.5,
# palette=palettable.tableau.TrafficLight_9.mpl_colors,
flierprops = {'marker': 'o', # 异常值形状
# 'markerfacecolor': 'red', # 形状填充色
},
whiskerprops={'linestyle':'--', 'color':'black'}, # 设置上下须属性
showmeans=True, # 箱图显示均值,
meanprops={'marker': 'D'}, # 设置均值属性
)
plt.xticks([0, 1, 2], ['$\\beta$', '$\\alpha$', 'AA']) # 按位置顺序0,1,2给x轴的变量命名
plt.ylim(0, multiplier)
ax = plt.gca() # 获得坐标轴的句柄
ax.yaxis.set_major_locator(plt.MultipleLocator(multiplier / 10)) # 以每(multiplier / 10)间隔显示
bp.set(xlabel=None)
bp.set(ylabel=None)
adjust_box_widths(fig, 0.8)
f = plt.gcf() # 获取当前图像
fmt = ['svg', 'png', 'pdf']
for _ in range(len(fmt)):
f.savefig(f'D:\Work info\WestUnion\data\processed\\{organ}\\boxplot.{fmt[_]}')
plt.show()
f.clear() # 先画图plt.show,再释放内存
其中函数adjust_box_widths是调整子箱的间距和宽度,因为seaborn.boxplot暂时没有调整子箱间距的参数。