绘制多个box箱型图

1.首先生成随机数据

import random 
# 创建一个153629行,13列的数据,
random_data = np.random.randn(153629, 13)
#创建数据标签,后续将根据数据标签绘制不同的箱型图
label = [0,1,2,3]
labels = np.asarray(random.choices(label,k =153629))
label_reshape = labels[:,np.newaxis]
将数据与标签在第二维度上进行拼接
data = np.hstack((random_data,label_reshape))
#data.shape
#为数据添加列标签,并转换为dataframe格式
data_list = ['red','gre','blu','x','y','mean','Variance','Homogeneity','Contrast','Dissimilarity','Entropy','Second','Correlation','label']
img_feature = pd.DataFrame(data,columns=data_list)
img_feature.head(5)

np.hstack 是 NumPy(Numerical Python 的简称)中的一个函数,用于水平堆叠数组(即沿第二个轴,也就是列方向堆叠)。如果传入的数组不是一维的,那么 np.hstack 会将它们沿着第二个轴(索引为1的轴)堆叠起来。

2. 数据对齐

这一步本来是为方便将数据按照不同的数据类型与标签进行分类(例如:分别提取出四类标签分别对应means数据,并将其合并为一个新的DF-Datafreame数据)

min_length = min([img_feature[img_feature['label']==0].shape[0],img_feature[img_feature['label']==1].shape[0],img_feature[img_feature['label']==2].shape[0],img_feature[img_feature['label']==3].shape[0]])
print(min_length)

根据min_length的数量,利用位置索引从不同标签数据中随机采样min_lengh个样本数据
利用bool索引对

# 从每个类别数据随机选取
label_0_len = img_feature[img_feature['label']==0].shape[0]
# 获取每个标签类型的长度
label_1_len = img_feature[img_feature['label']==1].shape[0]

label_2_len = img_feature[img_feature['label']==2].shape[0]

label_3_len = img_feature[img_feature['label']==3].shape[0]

# 标签0
print("0标签:")
label0_bool_index = create_bool(label_0_len,min_length)
print("标签0数量",len(label0_bool_index))
print("标签0有效索引数量",len(np.where(label0_bool_index)[0]))
# 标签1
print("1标签:")
label1_bool_index = create_bool(label_1_len,min_length)
print("标签1数量",len(label1_bool_index))
print("标签1有效果索引数量",sum(np.asarray(label1_bool_index)))
# 标签2
print("2标签:")
label2_bool_index = create_bool(label_2_len,min_length)
print("标签2数量",len(label2_bool_index))
print("标签2有效果索引数量",sum(label2_bool_index))
# 标签3
print("3标签:")
label3_bool_index = create_bool(label_3_len,min_length)
print("标签3数量",len(label3_bool_index))
print("标签3有效果索引数量",sum(label3_bool_index))
label_index = {"label0":label0_bool_index,"label1":label1_bool_index,"label2":label2_bool_index,"label3":label3_bool_index}

根据输入数据、数据类型、标签索引,构建一个不同标签对某一数据类型对比数据框

#数据统计
def diff_label_static(img_feature,feature_flag,label_bool_index):
    # 获取对应特征标签
    label_0data = img_feature[img_feature['label']==0]
    # 将布尔数据转换为位置索引数据
    label_0slice_data = label_0data.iloc[np.where(label_bool_index["label0"])[0]]
    # 获取对应特征标签
    label_1data = img_feature[img_feature['label']==1]
    # 将布尔数据转换为位置索引数据
    label_1slice_data = label_1data.iloc[np.where(label_bool_index['label1'])[0]]
    # 获取对应特征标签
    label_2data = img_feature[img_feature['label']==2]
    # 将布尔数据转换为位置索引数据
    label_2slice_data = label_2data.iloc[np.where(label_bool_index['label2'])[0]]
    # 获取对应特征标签
    label_3data = img_feature[img_feature['label']==3]
    # 将布尔数据转换为位置索引数据
    label_3slice_data = label_3data.iloc[np.where(label_bool_index['label3'])[0]]
    temp = np.stack([np.asarray(label_0slice_data[feature_flag]),np.asarray(label_1slice_data[feature_flag]),np.asarray(label_2slice_data[feature_flag]),np.asarray(label_3slice_data[feature_flag])],axis=1)
    label_list = ['label0','label1','label2','label3']
    mean_static = pd.DataFrame(temp,columns=label_list)
    return mean_static

绘制不同标签数据的box箱型图,需要向将数据按第一维度进行拼接(这一步应该可以优化一下)

def diff_label_static_plot(img_feature,feature_flag,label_bool_index):
    # 对函数进行修改
    # 首先获取某一标签类型数据,相应的根据标签长度,创建对应的标签序列
    label_0data = img_feature[img_feature['label']==0]
    label_0slice_data = label_0data.iloc[np.where(label_bool_index["label0"])[0]]
    # 新的0标签序列
    new_label0 = np.ones(len(label_0slice_data))*0
    # 获取对应特征标签
    label_1data = img_feature[img_feature['label']==1]
    # 将布尔数据转换为位置索引数据
    label_1slice_data = label_1data.iloc[np.where(label_bool_index['label1'])[0]]
    # 新的1标签序列
    new_label1 = np.ones(len(label_0slice_data))*1
    # 获取对应特征标签
    label_2data = img_feature[img_feature['label']==2]
    # 将布尔数据转换为位置索引数据
    label_2slice_data = label_2data.iloc[np.where(label_bool_index['label2'])[0]]
    # 新的1标签序列
    new_label2 = np.ones(len(label_2slice_data))*2
    # 获取对应特征标签
    label_3data = img_feature[img_feature['label']==3]
    # 将布尔数据转换为位置索引数据
    label_3slice_data = label_3data.iloc[np.where(label_bool_index['label3'])[0]]
    # 新的3标签序列
    new_label3 = np.ones(len(label_3slice_data))*3
    # print(np.asarray(label_0slice_data[feature_flag]).shape)
    temp_data = np.hstack([np.asarray(label_0slice_data[feature_flag]),np.asarray(label_1slice_data[feature_flag]),np.asarray(label_2slice_data[feature_flag]),np.asarray(label_3slice_data[feature_flag])])
    # print(temp_data.shape)
    label_list = ['data','label']
    temp_label = np.hstack([new_label0,new_label1,new_label2,new_label3])
    # print(temp_label.shape)
    data = np.stack([temp_data,temp_label],axis=1)
    mean_static = pd.DataFrame(data,columns=label_list)
    return mean_static

3.绘制箱型图

# 不同标签的特征统计量函数绘制图片
import matplotlib.pyplot as plt
data_flag = ['red','gre','blu','mean','Variance','Homogeneity','Contrast','Dissimilarity','Entropy','Second','Correlation','label']
labels = ['Label1', 'Label2', 'Label3', 'Label4']  # 这里是新的刻度标签列表
def draw_subboxplot(img_feature,data_flag,label_bool_index,nrows_ncols=[3,4]):
    fig, axs = plt.subplots(nrows=nrows_ncols[0], ncols=nrows_ncols[1], figsize=(12, 12), sharey=False)
    # fig, axs = plt.subplots(...): 这部分代码创建一个图形(fig)和一组子图(axs)。fig 是整个图形的引用,而 axs 是一个 NumPy 数组,包含了所有的子图对象。
    idx = 0
    for i in range(nrows_ncols[0]):
        for j in range(nrows_ncols[1]):
            
            # 获取某一标签类型数据,相应的根据标签长度,创建对应的标签序列
            df = diff_label_static_plot(img_feature,data_flag[idx],label_bool_index)
            df_static = diff_label_static(img_feature,data_flag[idx],label_bool_index)
            data = np.asarray(df_static.describe())
            min_static = min(data[3,:])
            max_static = max(data[7,:])
            # print("最大值",max_static)
            df.plot.box(ax=axs[i, j],by="label",xlabel = 'class', rot=45,return_type='axes')
            # print([i, j])
            print("数据类型索引序号:",idx)
            print("数据类型",data_flag[idx])
            axs[i, j].set_xticklabels(labels) 
            axs[i, j].set_title(data_flag[idx])
            # 这一步处理,是由于原有数据中存在较大差异例如0~2550~1的数据分布,因此在处理坐标轴范围与刻度时需要按情况分开处理
            if max_static>10:
                # min_static,max_static = int(min_static),int(max_static)
                # print(np.round(np.linspace(min_static,max_static,num=4),1))
                axs[i, j].set_ylim(min_static,max_static)
                axs[i, j].set_yticks(np.round(np.linspace(min_static,max_static,num=4),0))
                axs[i, j].set_yticklabels(np.round(np.linspace(min_static,max_static,num=4),0))
            else:
                min_static,max_static = round(min_static,2),round(max_static,2)
                axs[i, j].set_ylim(min_static,max_static)
                axs[i, j].set_yticks(np.round(np.linspace(min_static,max_static,num=4),2))
                axs[i, j].set_yticklabels(np.round(np.linspace(min_static,max_static,num=4),1))
            # 自适应调整,使坐标轴与标签可以正常显示
            plt.tight_layout()
            idx +=1
    plt.show()
 
draw_subboxplot(img_feature,data_flag,label_index,nrows_ncols=[3,4])

需要注意的是 plt.subplots(nrows=nrows_ncols[0], ncols=nrows_ncols[1], figsize=(12, 12), sharey=False)中sharey=False是共享Y轴坐标系,如果需要为每个子图设置不同的坐标轴与坐标系范围,需要将其设置为False


可视化显示

在这里插入图片描述
参考文档:
pandas
matlibplot

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/500905.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

U盘文件突然消失:原因分析与恢复策略

U盘遭遇“幽灵”之手,文件不翼而飞 你是否曾遭遇过这样的诡异情况:前一天还好好存放在U盘里的文件,第二天却突然消失得无影无踪?这简直就像是一场无声的灾难,令人措手不及。U盘作为我们日常工作和生活中不可或缺的数据…

Gitea 的详细介绍

什么是 Gitea? Gitea 是一个开源、轻量级的自托管 Git 服务,它允许用户搭建类似于 GitHub 或 GitLab 的代码托管平台。由于采用 Go 语言开发,Gitea 具有高效的性能和跨平台特性,适合个人开发者或小团队使用。 Gitea 的特点 轻量…

java数据结构与算法刷题-----LeetCode34. 在排序数组中查找元素的第一个和最后一个位置

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 二分查找 二分查找 解题思路:时间复杂度O( l o g 2 …

读所罗门的密码笔记05_新的力量平衡

1. 技术发展 1.1. 美国和中国俨然成为人工智能研究、开发和部署方面无可争议的领导者 1.2. 人类从未彻底阻止某种技术的发展,虽然不同国家在不同时间对克隆、化学武器和核武器等技术采取了暂停或禁止措施,但我们仍在继续推进最前…

mysql之MyBatis核心工作原理

MyBatis核心工作原理 一、源码环境 1.手动编译源码 工欲善其事必先利其器。为了方便我们在看源码的过程中能够方便的添加注释,我们可以自己来从官网下载源码编译生成对应的Jar包,然后上传到本地maven仓库,再引用这个Jar。大家可以自行去官…

第十四届蓝桥杯第十题:蜗牛分享

问题描述 输入格式 输出格式 输出共一行,一个浮点数表示答案(四舍五入保留两位小数)。 样例输入 3 1 10 11 1 1 2 1样例输出 4.20样例说明 蜗牛路线:(0,0)→(1,0)→(1,1)→(10,1)→(10,0)→(11,0)(0,0)→(1,0)→(1,1)→(10,1…

vsqt更改ui,cpp报错(唯二)解决方法,及ui界面布局在cpp文件的运用基本流程

qt的ui布局界面如下 点cpp文件->编译 此时就会自动生成ui_xxx.h 这里是ui文件里面就有类名:Ui_文件名字 下面就有一个类继承于这个类 你所使用的这个ui指针,就这么来的 ***报错解决方法有两种:***第一种:如果改了ui&#x…

Qt+OpenGL入门教程(三)——绘制三角形

通过前两篇文章的学习,我想大家应该有了基本的理解,我们接下来实操一下。 创建Qt OpenGL窗口 QOpenGLWidget QGLWidget是传统QtOpenGL模块的一部分,与其他QGL类一样,应该在新的应用程序中避免使用。相反,从Qt5.4开始…

(五)ROS2学习--创建调用其它包接口的一个发布者

这里写自定义目录标题 一、背景二、构建步骤1. 构建项目包2. 创建消息接口3. 修改“package.xml”4. 修改"src/smart_car/CMakeLists.txt"5. 创建发布者程序 三、编译及验证1. 编译2. 验证 一、背景 主机:Ubuntu20.04 介绍:基于上一篇&#x…

超卖问题的 4 种解决方案来了,太硬核了

大家好,我是路人,最近刚推出的《Java 高并发 & 微服务 & 性能调优实战案例 100 讲》,此课程目前已发布上线,正在连载中,文末有观看方法。 所有案例均源于个人工作实战,均提供原理讲解 & 亲手敲…

手写SpringBoot(三)之自动配置

系列文章目录 手写SpringBoot(一)之简易版SpringBoot 手写SpringBoot(二)之动态切换Servlet容器 手写SpringBoot(三)之自动配置 手写SpringBoot(四)之bean动态加载 手写SpringBoot…

重构销售话术和知识库,容联云找到了大模型的“钉子”

科技云报道原创。 从ChatGPT诞生起,大模型在营销、客服等场景的落地就被予以众望。然而在经历了一年多的“百模大战”洗礼之后,人们发现无论是算力成本还是内容生成的安全合规问题,都让大模型很难直接应用于机器与人对话的实际业务中。 这其…

linux基础命令篇:Linux基础命令讲解——文件浏览(cat、less、head、tail和grep)

Linux基础命令讲解——文件浏览(cat、less、head、tail和grep) 本文详细介绍Linux中的cat、less、head、tail和grep命令,这些命令在日常工作中非常实用,以下是关于这些命令的详细介绍: 1. cat命令:用于查看…

光伏发电量预测(Python代码,CNN结合LSTM,TensorFlow框架)

1.数据集(开始位置),数据集免费下载链接:https://download.csdn.net/download/qq_40840797/89051099 数据集一共8列,第一列是时间,特征列一共有6列:"WindSpeed" - 风速 "Sunshi…

利用HIVE的窗口函数进行SQL查询中出现的问题记录

student_info部分数据 score_info部分数据 course_info 1、问题复现 --完整SQL selectsti.stu_id,sti.stu_name,concat_ws(",",collect_set(ci.course_name)) over(partition by sti.stu_id) fromstudent_info sti left joinscore_info sci onsti.stu_idsci.stu_id l…

kubernetes(K8S)学习(六):K8S之Dashboard图形界面

K8S之Dashboard图形界面 一、Dashboard简介二、k8s安装Dashboard(1)下载Dashboard镜像(可选)(2)根据yaml文件创建资源(3)查看资源(4)生成登录需要的token(5)使用火狐 / 搜狗浏览器访问(个人用的搜狗) 一、Dashboard简介 官网&…

基于哈希槽的docker三主三从redis集群配置

目录 一、三主三从redis集群配置 1、关闭防火墙启动docker后台服务 2、新建6个docker容器redis实例 3、进入容器redis-node-1为6台机器构建集群关系 3.1进入容器 3.2构建主从关系 4、查看集群状态 4.1链接进入6381作为切入点 二、主从容错切换迁移按例 1、数据读写存储…

【蓝桥杯选拔赛真题50】C++简易炸弹超人 第十四届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解析

目录 C简易炸弹超人 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C简易炸弹超人 第十四届蓝桥杯青少年创意编程大赛C选拔赛真题 一、题目要求 1、编程实现 有一块矩形游戏场地&#x…

【动态规划】1223. 掷骰子模拟

作者推荐 视频算法专题 LeetCode1223. 掷骰子模拟 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数。 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始编号&#xff09…

FreeRTOS学习 -- 12、内存管理

1、内存管理简介 (1)创建任务、队列、信号量等对象时,两种内存创建方法: 动态内存创建:自动地从FreeRTOS管理的内存堆中申请创建对象所需的内存,并且在对象删除后,可将这块内存释放回FreeRTOS管…