Matplotlib 绘图 (二)

Matplotlib 绘制箱线图

(一) Matplotlib 绘制柱状图
(二) Matplotlib 绘制箱线图


参考文献:
1.https://www.cnblogs.com/shanger/p/13041426.html
2.https://blog.csdn.net/weixin_44613728/article/details/115190556


一、 plt.boxplot() 参数详解

Python 绘制箱线图主要用 matplotlib 库里 pyplot 模块里的 boxplot() 函数。

plt.boxplot(x,    # 指定要绘制箱线图的数据;
            notch=None,    # 是否是凹口的形式展现箱线图,默认非凹口;
            sym=None,    # 指定异常点的形状,默认为+号显示;
            vert=None,    # 是否需要将箱线图垂直摆放,默认垂直摆放;
            whis=None,    # 指定上下须与上下四分位的距离,默认为1.5倍的四分位差;
            positions=None,    # 指定箱线图的位置,默认为[0,1,2…];
            widths=None,    # 指定箱线图的宽度,默认为0.5;
            patch_artist=None,    # 是否填充箱体的颜色;
            bootstrap=None,    #
            usermedians=None,    #
            conf_intervals=None,    #
            meanline=None,    # 是否用线的形式表示均值,默认用点来表示;
            showmeans=None,    # 是否显示均值,默认不显示;
            showcaps=None,    # 是否显示箱线图顶端和末端的两条线,默认显示;
            showbox=None,    # 是否显示箱线图的箱体,默认显示;
            showfliers=None,    # 是否显示异常值,默认显示;
            boxprops=None,    # 设置箱体的属性,如边框色,填充色等;
            labels=None,    # 为箱线图添加标签,类似于图例的作用;
            flierprops=None,    # 设置异常值的属性,如异常点的形状、大小、填充色等;
            medianprops=None,    # 设置中位数的属性,如线的类型、粗细等;
            meanprops=None,    # 设置均值的属性,如点的大小、颜色等;
            capprops=None,    # 设置箱线图顶端和末端线条的属性,如颜色、粗细等;
            whiskerprops=None,    # 设置须的属性,如颜色、粗细、线的类型等
            manage_xticks=True,    #
            autorange=False,    #
            zorder=None,    #
            hold=None,    #
            data=None)    #
 

二、 示例

1. 绘制多个分组箱线图

plt.boxplot(x,…)中的 x 是[ [1, 2, 3], [1,2,3,4,5], [8,9] ]格式的,即3个箱线图各自的分组数据。
参数 positions=(1,1.4,1.8,2.8,3.2,3.6,4.6,5,5.4):将同一组的三个箱间隔设置为0.4,不同组间隔设为1,widths=0.3:每个箱宽度为0.3

#...准备数据等代码略...
bias = []
    for j in range(0,3):
        for t in range(0,3):
            bias.append(list(Bias[t][j]))
 #...代码略...
 fig = plt.figure()
 ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
 ax.set_ylabel('偏差Bias')
 ax.set_xlabel('物候提取算法')

 #(0.2,0.2,0.2) 分别为该颜色的RGB值,(均为0~1的数据)
 color_list = [(0.2, 0.2, 0.2), (0.2*2, 0.2*2, 0.2*2), (0.2*4, 0.2*4, 0.2*4), (0.2, 0.2, 0.2), (0.2*2, 0.2*2, 0.2*2), (0.2*4, 0.2*4, 0.2*4), (0.2, 0.2, 0.2), (0.2*2, 0.2*2, 0.2*2), (0.2*4, 0.2*4, 0.2*4)]

 bp = plt.boxplot(bias,patch_artist=True,widths=0.3,positions=(1,1.4,1.8,2.8,3.2,3.6,4.6,5,5.4),showmeans=True)

# 将9个箱分别上色
for patch, color in zip(bp['boxes'], color_list):
        patch.set_facecolor(color)
ax.set_ylabel('偏差Bias')
    ax.set_xlabel('物候提取算法')

    # 替换横坐标x的值
    x_position = [1, 2.8, 4.6]
    x_position_fmt = ["AG算法", "SG算法", "DL算法"]
    # 第一个参数为显示位置,第二个参数为显示的值
    plt.xticks([i + 0.8 / 2 for i in x_position], x_position_fmt)

    labels = ["CSIF数据集","GOMESIF数据集","GOSIF数据集"]
    plt.legend(bp['boxes'], labels, loc='best')  # 绘制表示框,右下角绘制
    # plt.savefig(fname="pic.png", figsize=[10, 10])

    #显示网格
    plt.grid(linestyle="--", alpha=0.5)  # 绘制图中虚线 透明度0.3
    plt.show()

运行结果:
在这里插入图片描述

2. 在多个分组箱线图上叠加散点图

参考文献:
1.https://blog.csdn.net/weixin_40787712/article/details/123516154

使用 “zorder=2”这样的确定叠加的图层的先后次序,数字越大,越后。

#...准备数据等代码略...
fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])
# 画2行3列的子图
ax1 = plt.subplot(2, 3, 1)  # 海北站SOS箱线图
# 准备数据
bias = []
for j in range(0, 3):
   for t in range(0, 3):
       bias.append(list(Bias[t][j][0][0:7]))
print(bias,'\n')
PlotBiasGndTiResu(bias, ax1, "lower right")
ax1.set_title('海北站SOS')
ax1.set_ylabel('残差')
# 将箱线图统计的所有点绘制到图上
# spotx是各个箱线图所有点的横坐标
spotx = [[1,1,1,1,1,1,1],[1.4,1.4,1.4,1.4,1.4,1.4,1.4],[1.8,1.8,1.8,1.8,1.8,1.8,1.8],
             [2.8, 2.8, 2.8, 2.8, 2.8, 2.8, 2.8],[3.2, 3.2, 3.2, 3.2, 3.2, 3.2, 3.2],[3.6,3.6,3.6,3.6,3.6,3.6,3.6],
             [4.6,4.6,4.6,4.6,4.6,4.6,4.6],[5,5,5,5,5,5,5],[5.4,5.4,5.4,5.4,5.4,5.4,5.4]]
for j in range(0, 3):
    for t in range(0, 3):
       #点的大小:s=10,画图层的先后:zorder=2,数字越大越后画
       plt.scatter(spotx[j*3+t],bias[j*3+t], c='black', s=10, zorder=2)
plt.show()
#...其它子图代码略....

def PlotBiasGndTiResu(bias, ax, loca):
 # plt.boxplot(x,...)中的 x 是[ [1, 2, 3], [1,2,3,4,5], [8,9] ]格式的,即3个箱线图各自的分组数据。
# 参数 positions=(1,1.4,1.8,2.8,3.2,3.6,4.6,5,5.4):将同一组的三个箱间隔设置为0.4,不同组间隔设为1,widths=0.3:每个箱宽度为0.3
# 多图层叠加时,控制画图层的先后:zorder=1,数字越大越后画
bp = plt.boxplot(bias, patch_artist=True, widths=0.3, 
positions=(1, 1.4, 1.8, 2.8, 3.2, 3.6, 4.6, 5, 5.4),
showmeans=False, medianprops={'lw': 1, 'color': 'black'}, zorder=1,
# 设置异常点属性,如点的形状、填充色和点的大小
flierprops = {'marker':'o','markerfacecolor':'black', 'markersize':3})

color_list = ["orange", "cornflowerblue", "deeppink","orange", "cornflowerblue", "deeppink","orange", "cornflowerblue", "deeppink"]
# 将9个箱分别上色
for patch, color in zip(bp['boxes'], color_list):
    patch.set_facecolor(color)
# 替换横坐标x的值
x_position = [1, 2.8, 4.6]
x_position_fmt = ["AG算法", "SG算法", "DL算法"]
# 第一个参数为显示位置,第二个参数为显示的值
plt.xticks([i + 0.8 / 2 for i in x_position], x_position_fmt)

labels = ["CSIF数据集", "GOMESIF数据集", "GOSIF数据集"]
plt.legend(bp['boxes'], labels, loc=loca)  # 绘制表示框,右下角绘制

# 显示网格
plt.grid(linestyle="--")

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值