在python中用seaborn.boxplot画图,以及带子分组的并排箱线图

概述

上一篇文章中,介绍了如何使用Excel自带图表插入带分组的并排箱形图,可以快速地使用鼠标实现。但有些地方要求更严格,或者对细节要求更丰富,就可以使用seaborn的boxplot,它和boxenplot都是matplotlib.pyplot.boxplot的优化版,出图更方便更美观,下面就以seaborn.boxplot为例进行说明。

箱线图能够展示、探索三种结构的数据,或者是其他结构的数据能转换成下列三种的:

  1. 单一维度数据,且该维度是数值型变量
  2. 两个维度的数据,其中一个维度是数值型变量,另一个维度是分类型变量
  3. 三个维度的数据,其中一个维度是数值型变量,另外两个维度是分类型变量

下面就举例说明:

对一维数据画箱线图

只要这个维度的数据是数值型变量即可:
在这里插入图片描述

对二维数据画箱线图

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暂时没有调整子箱间距的参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山高月小 水落石出

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值