MATLAB | 绘图复刻(十七) | 半小提琴图

news2024/11/13 10:09:09

嘿,真的是好久不见,最近有点过于忙了,今天更一个好久之前粉丝问的半小提琴图的绘制方法,要复刻这张图:

绘制效果如下:

还是挺好看的,下面直接进入正题:

教程部分

0 数据准备

这里随机生成了两组数据DataL和DataR,分别是半小提琴图左侧小提琴的数据和右侧小提琴的数据,同时需要设置好各个位置标签变量名,类名,显著性结果等文本信息。

Name = {'AAA', 'BBB', 'CCC'};
ClassName = {'Ambient','WarNing'};
Condition = {'ns','*','**'};

% 随机生成数据
rng(2)
offset = repmat(rand(1, 3), [100,1]).*2;
DataL = rand(100, 3) + offset;
DataR = rand(100, 3) + offset;

1 其他参数

% 配色
CList = [153,153,253; 255,153,154]./255;
% 此参数用于调整小提琴图宽度
width = .36;

2 坐标区域修饰

生成一个空的坐标区域,并设置字体,X轴标签等信息:

% 坐标区域修饰
ax = gca; 
ax.NextPlot = 'add';
ax.Box = 'on';
ax.XGrid = 'on';
ax.YGrid = 'on';
ax.XTick = 1:length(Name);
ax.XTickLabel = Name;
ax.FontName = 'Times New Roman';
ax.FontSize = 15;
ax.XTickLabelRotation = 30;
ax.XLim = [0, length(Name)] + .5;

3 绘制小提琴图

使用ksdensity函数计算核密度,使用quantile函数计算分位数,使用median计算中位数,并循环绘图:

for i = 1:length(Name)
    % 绘制核密度曲线
    [fL, yiL] = ksdensity(DataL(:, i));
    [fR, yiR] = ksdensity(DataR(:, i));
    fill(ax, (i - fL.*width), yiL, CList(1,:), 'EdgeColor','none', 'FaceAlpha',.5)
    fill(ax, (i + fR.*width), yiR, CList(2,:), 'EdgeColor','none', 'FaceAlpha',.5)
    % 绘制四分位数线
    qt25L = quantile(DataL(:, i), 0.25); qt75L = quantile(DataL(:, i), 0.75);
    plot(ax, [-1, 1, nan, -1, 1, nan, 0, 0].*.05 + i - .08, [qt75L, qt75L, nan, qt25L, qt25L, nan, qt75L, qt25L], 'LineWidth',1, 'Color','k')
    qt25R = quantile(DataR(:, i), 0.25); qt75R = quantile(DataR(:, i), 0.75);
    plot(ax, [-1, 1, nan, -1, 1, nan, 0, 0].*.05 + i + .08, [qt75R, qt75R, nan, qt25R, qt25R, nan, qt75R, qt25R], 'LineWidth',1, 'Color','k')
    % 绘制中位数点
    medL = median(DataL(:, i));
    scatter(i - .08, medL, 20, 'filled', 'CData',[0,0,0]);
    medR = median(DataR(:, i));
    scatter(i + .08, medR, 20, 'filled', 'CData',[0,0,0]);
    % 绘制显著性标签
    text(ax, i, max([yiL(:);yiR(:)]), Condition{i},...
        'FontSize',16, 'FontName','Times New Roman',...
        'HorizontalAlignment','center', 'VerticalAlignment','baseline')
end

4 绘制图例

在坐标区域外再画两个填充矩形用来当作图例的句柄:

% 绘制图例
fillHdl(1) = fill(ax, [-1,-2,-1], [0,0,1], CList(1,:), 'EdgeColor','none', 'FaceAlpha',.5);
fillHdl(2) = fill(ax, [-1,-2,-1], [0,0,1], CList(2,:), 'EdgeColor','none', 'FaceAlpha',.5);
lgdHdl = legend(fillHdl, ClassName, 'Location','best', 'Box','off');
lgdHdl.ItemTokenSize=[20,20];


完整代码

% half violin plot 

Name = {'AAA', 'BBB', 'CCC'};
ClassName = {'Ambient','WarNing'};
Condition = {'ns','*','**'};

% 随机生成数据
rng(2)
offset = repmat(rand(1, 3), [100,1]).*2;
DataL = rand(100, 3) + offset;
DataR = rand(100, 3) + offset;


% 配色
CList = [153,153,253; 255,153,154]./255;
% CList = [0,64,115; 254,103,110]./255;
% 此参数用于调整小提琴图宽度
width = .36;

% 坐标区域修饰
ax = gca; 
ax.NextPlot = 'add';
ax.Box = 'on';
ax.XGrid = 'on';
ax.YGrid = 'on';
ax.XTick = 1:length(Name);
ax.XTickLabel = Name;
ax.FontName = 'Times New Roman';
ax.FontSize = 15;
ax.XTickLabelRotation = 30;
ax.XLim = [0, length(Name)] + .5;


for i = 1:length(Name)
    % 绘制核密度曲线
    [fL, yiL] = ksdensity(DataL(:, i));
    [fR, yiR] = ksdensity(DataR(:, i));
    fill(ax, (i - fL.*width), yiL, CList(1,:), 'EdgeColor','none', 'FaceAlpha',.5)
    fill(ax, (i + fR.*width), yiR, CList(2,:), 'EdgeColor','none', 'FaceAlpha',.5)
    % 绘制四分位数线
    qt25L = quantile(DataL(:, i), 0.25); qt75L = quantile(DataL(:, i), 0.75);
    plot(ax, [-1, 1, nan, -1, 1, nan, 0, 0].*.05 + i - .08, [qt75L, qt75L, nan, qt25L, qt25L, nan, qt75L, qt25L], 'LineWidth',1, 'Color','k')
    qt25R = quantile(DataR(:, i), 0.25); qt75R = quantile(DataR(:, i), 0.75);
    plot(ax, [-1, 1, nan, -1, 1, nan, 0, 0].*.05 + i + .08, [qt75R, qt75R, nan, qt25R, qt25R, nan, qt75R, qt25R], 'LineWidth',1, 'Color','k')
    % 绘制中位数点
    medL = median(DataL(:, i));
    scatter(i - .08, medL, 20, 'filled', 'CData',[0,0,0]);
    medR = median(DataR(:, i));
    scatter(i + .08, medR, 20, 'filled', 'CData',[0,0,0]);
    % 绘制显著性标签
    text(ax, i, max([yiL(:);yiR(:)]), Condition{i},...
        'FontSize',16, 'FontName','Times New Roman',...
        'HorizontalAlignment','center', 'VerticalAlignment','baseline')
end

% 绘制图例
fillHdl(1) = fill(ax, [-1,-2,-1], [0,0,1], CList(1,:), 'EdgeColor','none', 'FaceAlpha',.5);
fillHdl(2) = fill(ax, [-1,-2,-1], [0,0,1], CList(2,:), 'EdgeColor','none', 'FaceAlpha',.5);
lgdHdl = legend(fillHdl, ClassName, 'Location','best', 'Box','off');
lgdHdl.ItemTokenSize=[20,20];

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis学习Day3——项目工程开发

扩展阅读推荐: 黑马程序员Redis入门到实战教程_哔哩哔哩_bilibili 一、项目介绍及其初始化 学习Redis的过程,我们还将遇到各种实际问题,例如缓存击穿、雪崩、热Key等问题,只有在实际的项目实践中解决这些问题,才能更好…

DPDI基础版安装部署说明

DispatchPDI下载 DPDI online部署包下载地址: Windows: http://files.pizzalord.site/api/public/dl/7Tnq6ScE/release/dpdi-community-win.zip Linux: http://files.pizzalord.site/api/public/dl/otCt9WuI/release/dpdi-community-linux.zip DPDI部署 DPDI应…

python构建深度学习模型开发数据采集利器,为模型提供充足图像数据

经常需要接触到各种各样的图像数据,为模型开发准备素材,在实际的项目中,一部分数据来源于真实的项目场景,但是这部分数据大都比较少,且获取的难度比较大,往往都是项目到了实施阶段的时候才有机会拿到数据&a…

基于SpringBoot的医院挂号预约管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的医院挂号预约管理…

【有啥问啥】探索扫地机器人中的 SLAM 算法:原理、实现与未来展望

探索扫地机器人中的 SLAM 算法:原理、实现与未来展望 随着智能家居的普及,扫地机器人逐渐成为日常生活中的常见家电。其自主导航能力使得它能够在复杂的家庭环境中高效完成清洁任务,而这背后的核心技术之一就是 SLAM(Simultaneou…

CCS12.2 以及以上版本如何使用C2000ware 4.03版本,发现直接导入工程不能正确识别地址变量?

C2000ware 5.02 地址变量为:COM_TI_C2000WARE_INSTALL_DIR,CCS12.2以上版本能够直接匹配识别! 但是C2000ware4.03版本地址变量为:COM_TI_C2000WARE_SOFTWARE_PACKAGE_INSTALL_DIR,这个不能直接识别到头文件的地址&…

appium server gui详细按照步骤

1.安装appium server desktop Appium安装提供两种方式:桌面版和命令行版。其中桌面版又分为 Appium GuI 和 Appium Desktop 。作为初学者,用桌面版,对初学者比较友好。 官网下载地址:Releases appium/appium-desktop GitHubTags appium/…

基于FPGA与RK3588的多通道低延时3G-SDI视频信号

目录 简介 主要用途: 项目简介: 详细过程: BT1120视频时序转CEA861 视频像素编码格式转换 低延时处理 MIPI接口处理 视频处理模块 ​​​​​​​ 简介 主要解决 RK3588支持多种视频格式输入,但是没有支持多路SDI接口的…

【JUC】14-LongAddr源码分析

1. LongAddr底层实现过程 2. Striped64中变量或方法的定义 base:类似于AtomicLong中全局的value值。在没有竞争情况下数据直接累加到base上,或者cells扩容时,也需要将数据写入到base上。collide:表示扩容意向,false一…

反转链表 II

题目 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#xff1a;…

Java中的ArrayList类

继承实现关系 Arraylist就是一个可以动态扩容的容器&#xff0c;属于集合类的一种&#xff0c;要追根溯源的话它是间接实现了Collection接口&#xff0c;下面我画一下它的结构图 类定义 ArrayList类继承自抽象类AbstractList&#xff0c;同时实现了List和Collection接口&…

服务器数据恢复—通过拼接数据库碎片的方式恢复SQL Server数据库数据

服务器数据恢复环境&#xff1a; 一台服务器中有一组由4块STAT硬盘通过RAID卡组建的RAID10阵列&#xff0c;上层是XenServer虚拟化平台&#xff0c;虚拟机安装Windows Server操作系统&#xff0c;作为Web服务器使用。 服务器故障&#xff1a; 因机房异常断电导致服务器中一台V…

元学习之应用案例

现在在做元学习的时候&#xff0c;我们最常拿来测 试元学习技术的任务叫做少样本图像分类&#xff0c;简单来讲就是每一个任务都只有几张图片&#xff0c;每一 个类别只有几张图片。比如我们使用图1的案例为例说明。现在分类的任务是分为三个 类别&#xff0c;每个类别都只有两…

贪心-用最少的箭射球

一支弓箭可以沿着 x 轴从不同点完全垂直地射出。在坐标 x 处射出一支箭&#xff0c;若有一个气球的直径的开始和结束坐标为 xstart&#xff0c;xend&#xff0c; 且满足 xstart ≤ x ≤ xend&#xff0c;则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后…

MySQL从C盘迁移到D盘

文章目录 前言一、停止MySQL服务打开服务&#xff08;方式一&#xff09;打开服务&#xff08;方式二&#xff09;停止MySQL服务 二、找到C盘中的文件文件夹1文件夹2文件夹3 三、修改文件内容1.对应文件夹12.对应文件夹3 四、 修改注册表中文件路径1.打开注册表2. 修改注册表中…

微积分-积分应用5.5(函数的平均值)

很容易计算有限多个数字 y 1 , y 2 , … , y n y_1, y_2, \dots, y_n y1​,y2​,…,yn​ 的平均值&#xff1a; y ave y 1 y 2 ⋯ y n n y_{\text{ave}} \frac{y_1 y_2 \cdots y_n}{n} yave​ny1​y2​⋯yn​​ 但是&#xff0c;如果可以进行无限多次的温度读取&…

Java 入门指南:Java 并发编程 —— 同步工具类 CountDownLatch(倒计时门闩)

文章目录 同步工具类CountDownLatch常用方法使用步骤适用场景使用示例 同步工具类 JUC&#xff08;Java.util.concurrent&#xff09;是 Java 提供的用于并发编程的工具类库&#xff0c;其中包含了一些通信工具类&#xff0c;用于在多个线程之间进行协调和通信&#xff0c;特别…

【kafka】kafka如何保证数据的可靠性,kafka如何保证数据不丢失

1. Kafka架构&#xff1a; Producer - Broker - Consumer 回到问题上来&#xff0c;Kafka如何保证数据不丢失&#xff0c;我们先看看Kafka如何保证Producer端数据不丢失&#xff1a; 通过ack机制 最小副本数设置 生产者重试机制 2. Kafka Producer消息发送ACK机制&#xff1…

量化交易backtrader实践(一)_数据获取篇(2)_tushare与akshare

上一节回顾 在上一节中&#xff0c;从股票的基本功能和主要数据进行小结&#xff0c;明确了进行backtrader回测所需要的数据&#xff0c;并且学习了backtrader的数据来源以及PandasData的格式要求&#xff0c;已经做到假设拿到.txt或.csv文件后&#xff0c;能把里面的股票基本…

【代码随想录】字符串

本博文为《代码随想录》学习笔记&#xff0c;原文链接&#xff1a;代码随想录 344.反转字符串 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的…