python 绘制箱型图一些技巧

这篇具有很好参考价值的文章主要介绍了python 绘制箱型图一些技巧。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

本篇是之前有一个需求,需要用python来画箱型图,但要求很多,所以我也不断再版,今天突然想起来这个东西可以总结一下,正好马上得思考下一步做啥了,有足够的空闲时间,所以准备把一些基础概念再好好复习一遍。

箱型图原理

关于原理,这里推荐两篇本站写得比较好的:

Matplotlib - 箱线图、箱型图 boxplot () 所有用法详解

Python 箱型图的绘制并提取特征值

我这里也是根据这两篇作为参考,箱型图的介绍如第二篇中画的那张原理图一样:

怎样用python画箱线图,python,matplotlib,开发语言

而如果用python来绘制箱型图,具体的源码字段为:

# Autogenerated by boilerplate.py.  Do not edit as changes will be lost.
@_copy_docstring_and_deprecators(Axes.boxplot)
def boxplot(
        x, notch=None, sym=None, vert=None, whis=None,
        positions=None, widths=None, 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_ticks=True, autorange=False,
        zorder=None, capwidths=None, *, data=None):
    return gca().boxplot(
        x, notch=notch, sym=sym, vert=vert, whis=whis,
        positions=positions, widths=widths, patch_artist=patch_artist,
        bootstrap=bootstrap, usermedians=usermedians,
        conf_intervals=conf_intervals, meanline=meanline,
        showmeans=showmeans, showcaps=showcaps, showbox=showbox,
        showfliers=showfliers, boxprops=boxprops, labels=labels,
        flierprops=flierprops, medianprops=medianprops,
        meanprops=meanprops, capprops=capprops,
        whiskerprops=whiskerprops, manage_ticks=manage_ticks,
        autorange=autorange, zorder=zorder, capwidths=capwidths,
        **({"data": data} if data is not None else {}))

(引用自:https://github.com/matplotlib/matplotlib/blob/v3.7.1/lib/matplotlib/pyplot.py#L2473-L2494)

而根据上述两篇中的解释,更改了一些介绍为:

参数 说明 参数 说明
x 指定要绘制箱线图的数据,可以是一组数据也可以是多组数据; showcaps 是否显示箱线图顶端和末端的两条线,默认显示;
notch 是否以凹口的形式展现箱线图,默认非凹口,即矩形 showbox 是否显示箱线图的箱体,默认显示;
sym 指定异常点的形状,默认为蓝色的+号显示; showfliers 是否显示异常值,默认显示;
vert 是否需要将箱线图垂直摆放,默认垂直摆放,False为水平; boxprops 设置箱体的属性,如边框色,填充色等;
whis 指定上下须与上下四分位的距离,默认为1.5倍的四分位差; labels 为箱线图添加标签,图例
positions 指定箱线图的位置,默认为range(1, N+1),N为箱线图的数量; filerprops 设置异常值的属性,如异常点的形状、大小、填充色等;
widths 指定箱线图的宽度,默认为0.5; medianprops 设置中位数的属性,如线的类型、粗细等;
patch_artist 是否填充箱体的颜色,默认为False; meanprops 设置均值的属性,如点的大小、颜色等;
meanline 是否用线的形式表示均值,默认用点来表示; capprops 设置箱线图顶端和末端线条的属性,如颜色、粗细等;
showmeans 是否显示均值,默认不显示; whiskerprops 设置须的属性,如颜色、粗细、线的类型等;
manage_ticks 是否自适应标签位置,默认为True; autorange 是否自动调整范围,默认为False;

那下面直接进入实战阶段。

箱型图的绘制

这里直接给出一个简版,因为我的点是从无人机视频流中的人提取出来的,所以就省略前面的细节,直接给出一个简版,首先是提取行人平均行动轨迹:

def throw_time(array,start_x,end_x,y):
    indexs = []
    index = 1
    person_throw_time = []
    for i in range(max(array[:,1])):
        if i == 0:
            continue
        each_person_data = array[array[:,1] == i]

        each_person_data = each_person_data[each_person_data[:,2]>start_x]
        each_person_data = each_person_data[each_person_data[:,2]<end_x]
        each_person_data = each_person_data[each_person_data[:,3]>y]
        if each_person_data.shape[0] < 4:
            continue
        each_person_data[:,2] = each_person_data[:,2] + (each_person_data[:,4] / 2)
        each_person_data[:,3] = each_person_data[:,3] + (each_person_data[:,5] / 2)
        person_time = (each_person_data[-1,0] - each_person_data[0,0])*0.04
        print("person time = ",person_time)
        if person_time < 5:
            continue
        person_throw_time.append(person_time)
        indexs.append(index)
        index = index + 1
    return indexs,person_throw_time

indexs1,person_throw_time1 = throw_time(array1,500,1400,400)      
# print(person_throw_time1)
# [10.36, 9.76, 9.48, 9.56, 6.16, 8.36, 8.6, 8.76, 5.6000000000000005, 9.84, 8.0, 9.88, 8.36, 9.16, 8.0, 8.92, 8.32, 9.68, 7.6000000000000005, 8.24, 7.08, 8.8, 8.6, 9.88, 9.64, 9.36, 10.16, 9.56, 7.4, 9.32, 8.48, 9.88, 9.16, 9.48, 9.64, 8.76]
indexs2,person_throw_time2 = throw_time(array2,500,1400,400)
indexs3,person_throw_time3 = throw_time(array3,450,1300,400)
indexs4,person_throw_time4 = throw_time(array4,600,1400,400)

然后就会得到一系列的散点以及它们的索引坐标,这时候再根据这个去画图:

    matplotlib.rc("font", family='Times New Roman')
    plt.ylabel('time(s)', fontsize=18)        
    
    # # 绘图
    ax = plt.subplot()
    ax.boxplot([person_throw_time1, person_throw_time2, person_throw_time3, person_throw_time4], widths=0.4, patch_artist=True,showfliers=False,boxprops={'facecolor': 'skyblue', 'linewidth': 0.8,'edgecolor': 'black'},meanline=True,meanprops={'color': 'red', 'linewidth': 3})
    # 设置轴坐标值刻度的标签
    ax.set_xticklabels(['List 1', 'List 2', 'List 3', 'List 4'], fontsize=14)
    plt.show()

怎样用python画箱线图,python,matplotlib,开发语言

这里我选用的代码创建了一个包含四个框的箱线图,每个框包含来自 [person_throw_time1、person_throw_time2、person_throw_time3、person_throw_time4] 列表之一的数据。方框填充了天蓝色,并在它们周围绘制了黑色边缘,在每个框的平均值处绘制一条红线,以及不显示离群值。

或许大部分人都是做到这就满足需求了,我开始也以为是的,因为上述是基于第一版的一些偏差颜色以及图例错误后的第二版改进,但最终我做到了第6版,并且又重新更改了画图逻辑。

根据原理绘制箱型图

有没有一种情况,需求给出了另一组不知道从哪里得来的数据,希望我产生一个对比图,而它的数据是直接给出了箱型图的5个点,没有做过多的掩饰,我也没有一丝丝防备,就这样出现,直接丢给了我一张Excel表,我。。。然后就整理好了数据,将上述我的[person_throw_time1、person_throw_time2、person_throw_time3、person_throw_time4]转化成dataframe并使用describe找到其对应的5等分点,这里因为真实数据涉及一些安全问题,以简单的数字代替,即:

import pandas as pd

# 假设这是您的四个列表
person_throw_time1 = [1, 2, 3, 4, 5]
person_throw_time2 = [6, 7, 8, 9, 10]
person_throw_time3 = [11, 12, 13, 14, 15]
person_throw_time4 = [16, 17, 18, 19, 20]

# 将四个列表合并成一个dataframe
data = pd.DataFrame({'data1': data1, 'data2': data2, 'data3': data3, 'data4': data4})

# 使用describe方法计算统计信息
statistics = data.describe()

print(statistics)

那么可以得到相对应的数据:

           data1      data2      data3      data4
count   5.000000   5.000000   5.000000   5.000000
mean    3.000000   8.000000  13.000000  18.000000
std     1.581139   1.581139   1.581139   1.581139
min     1.000000   6.000000  11.000000  16.000000
25%     2.000000   7.000000  12.000000  17.000000
50%     3.000000   8.000000  13.000000  18.000000
75%     4.000000   9.000000  14.000000  19.000000
max     5.000000  10.000000  15.000000  20.000000

我这里重新整理了一下,三组实验结果放到一起为(PS:做了一些修改,所以非标准的五分位):

[
    ["List 1", 6.1, 9.15, 9.84, 10.44, 11.16],
    ["2epochs List 1", 7.0, 9.47, 10.05, 10.81, 12.02],
    ["3epochs List 1", 14.16, 18.41, 20.19, 21.08, 25.42],
    ["List 2", 6.54, 8.65, 9.1, 9.39, 10.08],
    ["2epochs List 2", 7.31, 9.1, 9.5, 10.31, 10.86],
    ["3epochs List 2", 10.32, 14.18, 15.42, 18.08, 20.72],
    ["List 3", 6.14, 8.1, 8.44, 9.1, 9.82],
    ["2epochs List 3", 6.22, 8.3, 8.7, 9.2, 10.12],
    ["3epochs List 3", 8.72, 10.61, 12.71, 16.11, 17.91],
    ["List 4", 7.1, 8.75, 8.84, 9.1, 10.96],
    ["2epochs List 4", 7.3, 8.85, 9.04, 9.1, 11.19],
    ["3epochs List 4", 7.6, 8.3, 8.4, 9.0, 12.55]
]

但影响不大,这里针对上面数据重新画图为:

import matplotlib.pyplot as plt
import matplotlib

data = [
    ["List 1", 6.1, 9.15, 9.84, 10.44, 11.16],
    ["2epochs List 1", 7.0, 9.47, 10.05, 10.81, 12.02],
    ["3epochs List 1", 14.16, 18.41, 20.19, 21.08, 25.42],
    ["List 2", 6.54, 8.65, 9.1, 9.39, 10.08],
    ["2epochs List 2", 7.31, 9.1, 9.5, 10.31, 10.86],
    ["3epochs List 2", 10.32, 14.18, 15.42, 18.08, 20.72],
    ["List 3", 6.14, 8.1, 8.44, 9.1, 9.82],
    ["2epochs List 3", 6.22, 8.3, 8.7, 9.2, 10.12],
    ["3epochs List 3", 8.72, 10.61, 12.71, 16.11, 17.91],
    ["List 4", 7.1, 8.75, 8.84, 9.1, 10.96],
    ["2epochs List 4", 7.3, 8.85, 9.04, 9.1, 11.19],
    ["3epochs List 4", 7.6, 8.3, 8.4, 9.0, 12.55]
]

# 提取数据和标签
labels = [row[0] for row in data]
box_data = [row[1:] for row in data]

# 设置字体
matplotlib.rc("font", family='Times New Roman')

# 绘制箱型图
fig, ax = plt.subplots()
ax.boxplot(box_data, widths=0.4, patch_artist=True, showfliers=False,
           boxprops={'facecolor': 'skyblue', 'linewidth': 0.8, 'edgecolor': 'black'},
           meanline=True, meanprops={'color': 'red', 'linewidth': 3})

# 设置轴标签
ax.set_ylabel('time(s)', fontsize=18)
ax.set_xticklabels(labels, rotation=45, fontsize=12)

plt.show()

怎样用python画箱线图,python,matplotlib,开发语言

但画完之后还有个问题,就是有些箱型图的上下界限没有了,不知道是什么原因,所以这里还需要把这个重新调试出来,这里就需要用python画箱型图的另一种格式,即将上面的data转化成字典的格式:

data = [
    ["List 1", 6.1, 9.15, 9.84, 10.44, 11.16],
    ["2epochs List 1", 7.0, 9.47, 10.05, 10.81, 12.02],
    ["3epochs List 1", 14.16, 18.41, 20.19, 21.08, 25.42],
    ["List 2", 6.54, 8.65, 9.1, 9.39, 10.08],
    ["2epochs List 2", 7.31, 9.1, 9.5, 10.31, 10.86],
    ["3epochs List 2", 10.32, 14.18, 15.42, 18.08, 20.72],
    ["List 3", 6.14, 8.1, 8.44, 9.1, 9.82],
    ["2epochs List 3", 6.22, 8.3, 8.7, 9.2, 10.12],
    ["3epochs List 3", 8.72, 10.61, 12.71, 16.11, 17.91],
    ["List 4", 7.1, 8.75, 8.84, 9.1, 10.96],
    ["2epochs List 4", 7.3, 8.85, 9.04, 9.1, 11.19],
    ["3epochs List 4", 7.6, 8.3, 8.4, 9.0, 12.55]
]


def convert_to_dict(data):
    draw_data = []
    for row in data:
        draw_data.append({
            "whislo": row[1],
            "q1": row[2],
            "med": row[3],
            "q3": row[4],
            "whishi": row[5]
        })
    return draw_data

draw_data = convert_to_dict(data)
print(draw_data)
# [{'whislo': 6.1, 'q1': 9.15, 'med': 9.84, 'q3': 10.44, 'whishi': 11.16}, {'whislo': 7.0, 'q1': 9.47, 'med': 10.05, 'q3': 10.81, 'whishi': 12.02}, {'whislo': 14.16, 'q1': 18.41, 'med': 20.19, 'q3': 21.08, 'whishi': 25.42}, {'whislo': 6.54, 'q1': 8.65, 'med': 9.1, 'q3': 9.39, 'whishi': 10.08}, {'whislo': 7.31, 'q1': 9.1, 'med': 9.5, 'q3': 10.31, 'whishi': 10.86}, {'whislo': 10.32, 'q1': 14.18, 'med': 15.42, 'q3': 18.08, 'whishi': 20.72}, {'whislo': 6.14, 'q1': 8.1, 'med': 8.44, 'q3': 9.1, 'whishi': 9.82}, {'whislo': 6.22, 'q1': 8.3, 'med': 8.7, 'q3': 9.2, 'whishi': 10.12}, {'whislo': 8.72, 'q1': 10.61, 'med': 12.71, 'q3': 16.11, 'whishi': 17.91}, {'whislo': 7.1, 'q1': 8.75, 'med': 8.84, 'q3': 9.1, 'whishi': 10.96}, {'whislo': 7.3, 'q1': 8.85, 'med': 9.04, 'q3': 9.1, 'whishi': 11.19}, {'whislo': 7.6, 'q1': 8.3, 'med': 8.4, 'q3': 9.0, 'whishi': 12.55}]

这里拿到列表转化成的字典后,同时对 ax.boxplot() 变成 ax.bxp(),因为boxplot用于绘制单个箱线图,而bxp是多个,每个箱线图都可以由五个统计值(最小值、下四分位数、中位数、上四分位数和最大值)来描述。所以代码为:


import matplotlib.pyplot as plt
import matplotlib




data = [
    ["List 1", 6.1, 9.15, 9.84, 10.44, 11.16],
    ["2epochs List 1", 7.0, 9.47, 10.05, 10.81, 12.02],
    ["3epochs List 1", 14.16, 18.41, 20.19, 21.08, 25.42],
    ["List 2", 6.54, 8.65, 9.1, 9.39, 10.08],
    ["2epochs List 2", 7.31, 9.1, 9.5, 10.31, 10.86],
    ["3epochs List 2", 10.32, 14.18, 15.42, 18.08, 20.72],
    ["List 3", 6.14, 8.1, 8.44, 9.1, 9.82],
    ["2epochs List 3", 6.22, 8.3, 8.7, 9.2, 10.12],
    ["3epochs List 3", 8.72, 10.61, 12.71, 16.11, 17.91],
    ["List 4", 7.1, 8.75, 8.84, 9.1, 10.96],
    ["2epochs List 4", 7.3, 8.85, 9.04, 9.1, 11.19],
    ["3epochs List 4", 7.6, 8.3, 8.4, 9.0, 12.55]
]


def convert_to_dict(data):
    draw_data = []
    for row in data:
        draw_data.append({
            "whislo": row[1],
            "q1": row[2],
            "med": row[3],
            "q3": row[4],
            "whishi": row[5]
        })
    return draw_data

draw_data = convert_to_dict(data)

matplotlib.rc("font", family='Times New Roman')
plt.ylabel('time(s)', fontsize=18)

ax = plt.subplot()
# ax.boxplot([row1_data, row2_data, row3_data, row4_data, row5_data, row6_data, row7_data, row8_data], widths=0.4, patch_artist=True,showfliers=False,boxprops={'facecolor': 'skyblue', 'linewidth': 0.8,'edgecolor': 'black'},meanline=True,meanprops={'color': 'red', 'linewidth': 3})


ax.bxp(draw_data, widths=0.4, patch_artist=True,showfliers=False,boxprops={'facecolor': 'skyblue', 'linewidth': 0.8,'edgecolor': 'black'},meanline=True,meanprops={'color': 'red', 'linewidth': 3})
# boxplot
# ax.bxp(draw_data, showfliers=False)

ax.set_xticklabels(['List 1', '2epochs List 1', '3epochs List 1', 'List 2', '2epochs List 2', '3epochs List 2', 'List 3', '2epochs List 3', '3epochs List 3', 'List 4', '2epochs List 4', '3epochs List 4'], fontsize=14)
plt.show()

怎样用python画箱线图,python,matplotlib,开发语言文章来源地址https://www.toymoban.com/news/detail-773458.html

到了这里,关于python 绘制箱型图一些技巧的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【matplotlib 实战】--箱型图

    箱型图(Box Plot),也称为盒须图或盒式图,1977年由美国著名统计学家约翰·图基(John Tukey)发明。 是一种用作显示一组数据分布情况的统计图,因型状如箱子而得名。 它能显示出一组数据的最大值、最小值、中位数及上下四分位数。 箱子的顶端和底端,分别代表上下四分

    2024年02月08日
    浏览(32)
  • 数据可视化(5)热力图及箱型图

    1.热力图     2.箱型图     3.  

    2024年02月14日
    浏览(30)
  • 【数据分析入门】Seaborn[散点图、条形图、计数图、热力图、箱型图、小提琴图]

       Seaborn 是 基于 matplotlib 开发 的高阶 Python 数据可视图库 ,用于绘制优雅、美观的统计图形。   使用下列别名导入该库:    使用 Seaborn 创建图形的基本步骤 :   1. 准备数据 :我们要 确保绘制的数据集 。   2. 设定画布外观 :在创建图形之前,我们可以 设定画

    2024年02月09日
    浏览(39)
  • python绘制折线图

            俗话说,“字不如表,表不如图”,图表在数据分析中的作用不言而喻。python中有pandas和matplotlib两个库供使用者来绘制图表。下面来绘制“成绩表.xlsx”的折线图。  废话不多说,直接上代码: 对上述重要函数的参数进行详细讲解: plot函数:以plt.plot(x,y2,label=

    2024年02月11日
    浏览(37)
  • 【Python】Matplotlib绘制折线图

    1.Matplotlib画图简单实现 Matplotlib在一个绘制2D图片的库 2.折线图 2.1绘制折线图 接下来逐步对折线图进行修改 2.2设置线的格式 2.3设置折点 2.4.图片的保存和导出 2.5设置刻度 2.6显示中文 matplotlib只显示应为,无法显示中文,需要修改matplotlib的默认字体 通过matplotlib下的font_mange

    2023年04月09日
    浏览(69)
  • python绘制股票k线图

    使用python绘制股票k线图 1. 需要安装的包 tushare matplotlib mpl_finance datetime 使用Anaconda Prompt安装,安装语句’pip install 包的名字’ 2. 获取数据 使用tushare包导入数据 第一个参数’000002‘为股票代码,第二个参数start表示起始时间,第三个参数end表示结束日期。 获取的数据df为Da

    2024年02月06日
    浏览(24)
  • Python:箱线图的理解与绘制

    目录 一、箱线图简介 二、箱线图的绘制 2.1 基于matplotlib库的箱线图绘制 (1)函数主要参数及功能 (2)函数返回值 (3)示例 2.2 基于seaborn库的箱线图绘制 (1)函数主要参数功能及其返回值 (2)示例 附录 Python绘图待扩展阅读 如下图所示,箱线图(箱形图、盒须图)是一

    2024年02月11日
    浏览(26)
  • python绘制k线图均线图

    Date,Close,Volume,Open,High,Low 06/23/2023,$186.68,53117000,$185.55,$187.56,$185.01 06/22/2023,$187.00,51245330,$183.74,$187.045,$183.67 06/21/2023,$183.96,49515700,$184.90,$185.41,$182.5901 06/20/2023,$185.01,49799090,$184.41,$186.10,$184.41 06/16/2023,$184.92,101256200,$186.73,$186.99,$184.27 06/15/2023,$186.01,65433170,$183.96,$186.52,$183.78 06/14/2023,$

    2024年02月20日
    浏览(27)
  • Python绘图:箱线图的理解与绘制

    目录 一、箱线图简介 二、箱线图的绘制 2.1 基于matplotlib库的箱线图绘制 (1)函数主要参数及功能 (2)函数返回值 (3)示例 2.2 基于seaborn库的箱线图绘制 (1)函数主要参数功能及其返回值 (2)示例 附录 Python绘图待扩展阅读 如下图所示,箱线图(箱形图、盒须图)是一

    2024年02月11日
    浏览(25)
  • 绘制多条折线图的python代码实现

    绘制多条折线图的python代码实现 在Python中,我们可以使用matplotlib库来绘制折线图。对于需要同时绘制多条折线图的情况,我们可以通过加入多个线条的方式来达到目的。下面是一个简单的例子,展示了如何在可视化图像中同时绘制多条折线图。 首先,我们需要导入matplotli

    2024年02月08日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包