• 【python】使用datafrom.plot直接画箱图


    在这里插入图片描述
    图来源: wiki-boxplot

    使用dataframe直接画箱图

    比如,有如下一组数据,直接使用dataframe.plot画图 【官网了解更多】:

    import pandas as pd
    import matplotlib.pyplot as plt
    
    df = pd.read_csv(yourfile, sep='\t', header=0, index_col=0)
    df.head()
    df.plot(kind='box')
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    boxplot

    ① 调整绘制箱图参数

    df.plot(kind='box',  # 选择画图类型
            title='box title',   # 图名称
            showmeans=True,  # 显示均值
            meanline=True,  # 均值线,True:使用虚线,False使用红色小三角
            showfliers=True,  # 是否显示异常值 
            rot=60, # 坐标值倾斜程度
            figsize=(15,5),  # 画图的大小
            )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    使用kind参数选择画图类型:
    plot-kind
    显示均值时,设置显示线型meanline=True
    在这里插入图片描述
    设置meanline=False:均值显示为小三角
    在这里插入图片描述

    ② 设置坐标轴

    y轴设置:(x轴同理)

    plt.ylabel('y label')  # 设置y轴名称
    plt.ylim([-2, 10])   # 设置y轴范围
    
    • 1
    • 2

    在这里插入图片描述

    plt.yticks([-2,3,5])  # 只显示指定坐标值
    
    • 1

    在这里插入图片描述

    ③ 图中添加文本或直线

    plt.text(3, 5, 'text',  # 在坐标(3,5)处添加文本"text"
             fontsize=15,  # 设置字体大小
             color='red',  # 设置为红色
             alpha=0.5,  # 显示透明度
             )
    # 也可以将文本写在图之外:(设置相应坐标即可)
    plt.text(5, 2, 'new text',  # 在坐标(3,5)处添加文本"text"
             fontsize=15,  # 设置字体大小
             color='red',  # 设置为红色
             alpha=0.5,  # 显示透明度
             )
    plt.plot((2.5,2.5), (0,5),   # 直线横坐标x是从2.5->2.5, 纵坐标y是从0-5
             color='orange',   # 设置为橙色
             alpha=0.5,   # 设置透明度
             linewidth=1,  # 设置线条粗细
            )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    ④ 更多参数

    对特定图,有特定的模块与对应的参数,比如箱图boxplot箱图参数。所以也可以将这些参数作为dataframe.plot的参数使用。
    在这里插入图片描述
    在这里插入图片描述
    》上图截图来源:https://zhuanlan.zhihu.com/p/38199913

    ⑤ 散点图+箱图

    展示两个数据对应的箱图组合,示例:
    在这里插入图片描述

    import matplotlib.pyplot as plt
    import random
    
    
    def random_lst(a, b, n):
        lst = []
        for i in range(n):
            lst.append(random.uniform(a, b))
        return lst
    
    
    def data_plt(df1, df2, idx_lst):
    	fig, axs = plt.subplots(nrows=4, ncols=5, figsize=(12, 10), sharex=True) # , sharey=True)
    	
    	for i in range(len(idx_lst)):
    	    cx = i // 5  # 每行5个图
    	    rx = i % 5
    	    # print(cx, rx)
    	    idx_name = idx_lst[i]
    	    axs[cx, rx].scatter(random_lst(0.75, 1.25, len(df1[idx_name])) + random_lst(1.75, 2.25, len(df2[idx_name])),
    	                        list(df1[idx_name]) + list(df2[idx_name]), s=5, c='C7', alpha=0.4)
    	    axs[cx, rx].boxplot([df1[idx_name], df2[idx_name]], 
    	                        labels=['A', 'B'], showmeans=True, meanline=False, showfliers=True, widths=0.5)
    	    axs[cx, rx].set_title(idx_name, fontsize=10)
    	    axs[cx, rx].grid(axis="y")
    	
    	    plt.xlim(0, 3)
    	    plt.xticks([1, 2], ['A', 'B'])
    	plt.show()
    
    idx_lst = ...  # list, 两个dataframe要选择的列
    dataf1 = ...  # dataframe, data1
    dataf2 = ...  # dataframe, data2
    data_plt(dataf1, dataf2, idx_lst)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    使用seaborn绘制箱图+散点图:

    import seaborn as sns
    
    # 创建示例数据
    data1 = [1, 2, 3, 4, 5]
    data2 = [2, 4, 6, 8, 10]
    
    # 合并两组数据
    combined_data = [data1, data2]
    
    # 绘制箱线图
    sns.boxplot(data=combined_data)
    
    # 添加散点图
    for i, data in enumerate(combined_data):
        sns.stripplot(x=[i]*len(data), y=data, color='red', alpha=0.4)
    
    # 显示图形
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    有多个子图:

    import seaborn as sns
    import matplotlib.pyplot as plt
    
    # 创建示例数据
    data1 = [1, 2, 3, 4, 5]
    data2 = [2, 4, 6, 8, 10]
    data3 = [3, 6, 9, 12, 15]
    data4 = [4, 8, 12, 16, 20]
    data5 = [5, 10, 15, 20, 25]
    data6 = [6, 12, 18, 24, 30]
    data7 = [7, 14, 21, 28, 35]
    data8 = [8, 16, 24, 32, 40]
    
    # 设置图形大小和布局
    fig, axs = plt.subplots(2, 2, figsize=(10, 8))
    
    # 绘制子图1
    sns.boxplot(data=[data1, data2], width=0.4, ax=axs[0, 0]).set_title('Group 1')
    sns.stripplot(data=[data1, data2], color='red', alpha=0.4, size=4, ax=axs[0, 0])
    
    # 绘制子图2
    sns.boxplot(data=[data3, data4], width=0.4, ax=axs[0, 1]).set_title('Group 2')
    sns.stripplot(data=[data3, data4], color='red', alpha=0.4, size=4, ax=axs[0, 1])
    
    # 绘制子图3
    sns.boxplot(data=[data5, data6], width=0.4, ax=axs[1, 0]).set_title('Group 3')
    sns.stripplot(data=[data5, data6], color='red', alpha=0.4, size=4, ax=axs[1, 0])
    
    # 绘制子图4
    sns.boxplot(data=[data7, data8], width=0.4, ax=axs[1, 1]).set_title('Group 4')
    sns.stripplot(data=[data7, data8], color='red', alpha=0.4, size=4, ax=axs[1, 1])
    
    # 调整子图之间的间距
    plt.tight_layout()
    
    # 显示图形
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    在这里插入图片描述

        
    def boxplt(df0, df1, label0=0, label1=1, nrows=4, hsize=7, ymax=None):
        names = df0.columns
        fig, axs = plt.subplots(nrows=nrows, ncols=5, figsize=(9, hsize))  # , sharex=True) # , sharey=True)
        for i, idx_name in enumerate(names):
            cx = i // 5
            rx = i % 5
            
            # 添加散点图
            sns.stripplot(data=[list(df0[idx_name]), list(df1[idx_name])], ax=axs[cx, rx], 
                          palette='dark:black', 
                          alpha=0.4,  # 点颜色透明度
                          size=2,  # 点大小
                          jitter=0.2,  # 点分散程度(小数值,越大越分散)
                          )
            
            # 添加箱图
            sns.boxplot(data=[list(df0[idx_name]), list(df1[idx_name])], ax=axs[cx, rx],
                        showmeans=True,  #箱图显示均值
                        width=0.5,  #设置箱子之间距离,为1时,每个箱子之间距离为0
                        showfliers=False,  #异常值关闭显示(有散点图显示,避免重复)
                       )
            # box_uni = axs[cx, rx].boxplot([df0[idx_name], df1[idx_name]], 
            #                                 labels=[label0, label1], showmeans=True, meanline=False, showfliers=True, 
            #                                 # notch=True, patch_artist=True,
            #                              )
            
            axs[cx, rx].set_title(idx_name, fontsize=8)
            axs[cx, rx].grid(axis="y")
            if ymax is not None:
                axs[cx, rx].set_ylim(0, ymax) # (0, 0.1) # (0, 0.5)
        plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    附:python画图示例官网:matplotlib https://matplotlib.org/stable/gallery/index.html


    数据的处理

    • 取log
    df2 = np.log2(df+0.0001)  # 将数值取log
    
    • 1

    在这里插入图片描述

    • zscore:
    from scipy import stats
    df.shape[0]  # 行数
    df.shape[1]  # 列数
    zs_arr = stats.zscore(df, axis=1, ddof=0)  # 注意输出的是数组型(array)
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

  • 相关阅读:
    Bobo Python 学习笔记
    【C语言】auto 关键字
    爱上开源之golang入门至实战第四章-映射(Map)
    全网最牛自动化测试框架系列之pytest(9)-标记用例(指定执行、跳过用例、预期失败)
    掌握这个技巧,一键实现把文字转语音,用过都说好
    Motion Plan之搜索算法笔记
    C++与JS实现WebSocket通信(C++服务端JS客户端)
    服务器数据恢复- Ext4文件系统分区挂载报错的数据恢复案例
    acwing第77场周赛 前两题
    【java深入学习第2章】Spring Boot 结合 Screw:高效生成数据库设计文档之道
  • 原文地址:https://blog.csdn.net/sinat_32872729/article/details/126778274