MATLAB | 绘图复刻(八) | 堆叠柱状图+哑铃图
本次复刻的是Nature Communications中Friedman, S.T., Muñoz, M.M. A latitudinal gradient of deep-sea invasions for marine fishes. Nat Commun 14, 773 (2023). https://doi.org/10.1038/s41467-023-36501-4的Fig1图像:
复刻效果:
文章可在如下网站下载pdf文件:
https://www.nature.com/articles/s41467-023-36501-4
同时作者提供了相关绘图的R语言代码,但其绘制代码甚至比MATLAB绘制复杂:
https://github.com/stfriedman/Depth-transitions-paper
仓库并没有提供绘图数据,在datadryad网站提供了原始数据,可以进行下载:
https://datadryad.org/stash/dataset/doi:10.5061/dryad.fc71cp4
这里我们为了方便就随便构造一点数据。
0 数据构造
用以下代码随机生成了一些数据:
rng(1)
% random data
Name={'Serranidae','Zoarcidae','Myctophidae','Sebastidae','Liparidae','Carangidae','Scombridae','Psychrolutidae',...'Notothenioid','Macrouridae','Soleidae','Pleuronectidae','Paralichthyidae','Sternoptychidae','Ophidiidae',...'Lutjanidae','Sparidae','Moridae','Monacanthidae','Agonidae','Triglidae','Platycephalidae','Ophichthidae',...'Antennariidae','Holocentridae','Bothidae','Chaerodontidae','Clupeidae','Tetraodontidae','Nemipteridae',...'Muraenidae','Mullidae','Lethrinidae','Balistidae','Stomiidae','Exocoetidae','Acanthuridae','Sciaenidae',...'Syngnathidae','Pomacanthidae','Haemulidae','Blenniidae','Apogonidae','Pomacentridae','Cobiidae','Labridae'}.';
N=size(Name,1);
RatioData=rand(N,3);
RatioData=RatioData./sum(RatioData,2);
%
Shallow=RatioData(:,1);
Deep=RatioData(:,2);
Intermediate=RatioData(:,3);
%
Median=rand(N,1).*40;
High=Median+rand(N,1).*20;
Low=Median-rand(N,1).*20;
Low(Low<0)=0;
%
Exact=rand(N,1).*50-25+Median;
Exact(Exact<0)=0;
%
T=table(Name,Shallow,Deep,Intermediate,Median,Low,High,Exact)
writetable(T,'ta_results_revisions_data.csv')
运行结果会存在ta_results_revisions_data.csv文件夹内,数据大概长这样:
% 46×8 table
%
% Name Shallow Deep Intermediate Median Low High Exact
% _________________ __________ ________ ____________ ______ ______ ______ _______
%
% {'Serranidae' } 0.23487 0.51173 0.2534 34.542 25.344 39.748 19.47
% {'Zoarcidae' } 0.45237 0.18439 0.36324 29.885 18.958 45.98 26.22
% {'Myctophidae' } 0.00016433 0.41345 0.58638 22.25 6.2775 26.118 14.417
% {'Sebastidae' } 0.45166 0.19425 0.35409 5.4582 0 18.247 20.34
% {'Liparidae' } 0.13722 0.018108 0.84467 2.3967 0 12.89 21.397
%
% : : : : : : : :
%
% {'Blenniidae' } 0.43205 0.55718 0.010768 14.803 8.4557 33.606 0.21309
% {'Apogonidae' } 0.16076 0.3803 0.45894 25.189 12.75 36.829 12.59
% {'Pomacentridae'} 0.48011 0.37817 0.14172 8.407 0 25.984 25.991
% {'Cobiidae' } 0.1007 0.11194 0.78736 30.11 10.634 47.005 25.903
% {'Labridae' } 0.25089 0.53185 0.21726 2.6615 0 20.769 8.4957
1 数据导入
就readtable,没啥技术含量:
% 数据导入
Data=readtable('ta_results_revisions_data.csv');
[N,~]=size(Data);
2 图窗及坐标区域创建
% figure窗口及axes坐标区域创建
fig=figure('Units','normalized','Position',[.1,.05,.55,.85],'Color',[1,1,1]);
% -------------------------------------------------------------------------
% 左侧柱状图axes
ax1=axes(fig);
ax1.NextPlot='add';
ax1.Position=[.12,.1,.3,.88];
ax1.XLim=[-.01,1];
ax1.YLim=[.5,N+.5];
plot(ax1,[-.01,-.01],[.5,N+.5],'Color',[1,1,1],'LineWidth',2)
ax1.YTick=1:N;
ax1.TickLength=[1e-5,14-5];
ax1.YTickLabel=Data.Name;
ax1.YDir='reverse';
ax1.XColor='none';
ax1.FontName='Times New Roman';
ax1.FontSize=11;
% -------------------------------------------------------------------------
ax2=axes(fig);
ax2.NextPlot='add';
ax2.Position=[.44,.1,.54,.88];
ax2.FontName='Times New Roman';
ax2.YColor='none';
ax2.XLim=[-5,80];
ax2.YLim=[.5,N+.5];
ax2.XTick=[0,20,40,60];
ax2.LineWidth=.8;
ax2.TickDir='out';
ax2.FontSize=11;
ax2.XLabel.String='Number of Transitions';
ax2.XLabel.FontSize=16;
3 堆叠柱状图绘制并改颜色
非常简单,主要需要添加stacked
属性:
% 左侧堆叠柱状图绘制
barhHdl=barh(ax1,[Data.Shallow,Data.Intermediate,Data.Deep],'stacked');
% 修改配色
barhHdl(1).EdgeColor='none';
barhHdl(2).EdgeColor='none';
barhHdl(3).EdgeColor='none';
barhHdl(1).FaceColor=[176,224,230]./255;
barhHdl(2).FaceColor=[44,142,181]./255;
barhHdl(3).FaceColor=[22,70,91]./255;
顺便画个图例:
% 绘制图例
lgd1Hdl=legend(ax1,barhHdl,{'Shallow','Intermediate','Deep'});
lgd1Hdl.NumColumns=2;
lgd1Hdl.ItemTokenSize=[18,18];
lgd1Hdl.Position=[.17,.02,.2,.07];
lgd1Hdl.FontSize=13;
4 绘制灰线及圆角矩形
这里绘制线条其实只画了一条,只是每隔两个点之间加个NaN把线断开了:
% 绘制灰色线条
XX=repmat(ax2.XLim,[N,1])*[1,0,nan;0,1,nan];
YY=repmat((1:N)',[1,3]);XX=XX';YY=YY';
plot(ax2,XX(:),YY(:),'LineWidth',.8,'Color',[229,229,229]./255)
% 绘制圆角矩形
for i=1:N
rectangle(ax2,'Position',[Data.Low(i),i-.4,Data.High(i)-Data.Low(i),.8],...'EdgeColor','none','FaceColor',[229,229,229]./255,'Curvature',1)
end
5 绘制中位数圆点
% 绘制中值点与实际值连线
NXX=[Data.Median,Data.Exact]*[1,0,nan;0,1,nan];NXX=NXX';
plot(ax2,NXX(:),YY(:),'LineWidth',.8,'Color',[102,102,102]./255,'LineWidth',1.5)
% 绘制中值处圆点
scatter(ax2,Data.Median,1:N,120,'filled','o','MarkerFaceColor',[1,1,1],...'MarkerEdgeColor',[102,102,102]./255,'LineWidth',1.5)
6 绘制确切值圆点及图例
根据是否在范围内赋予不同的颜色:
% 绘制实际值圆点
scAHdl=scatter(ax2,Data.Exact(Data.Exact>Data.High),find(Data.Exact>Data.High),...120,'filled','o','MarkerFaceColor',[0,160,138]./255,'MarkerEdgeColor',[0,160,138]./255,'LineWidth',1.5);
scWHdl=scatter(ax2,Data.Exact(Data.Exact<=Data.High&Data.Exact>=Data.Low),find(Data.Exact<=Data.High&Data.Exact>=Data.Low),...120,'filled','o','MarkerFaceColor',[102,102,102]./255,'MarkerEdgeColor',[102,102,102]./255,'LineWidth',1.5);
scBHdl=scatter(ax2,Data.Exact(Data.Exact<Data.Low),find(Data.Exact<Data.Low),...120,'filled','o','MarkerFaceColor',[241,175,1]./255,'MarkerEdgeColor',[241,175,1]./255,'LineWidth',1.5);
% 绘制图例
lgd2Hdl=legend(ax2,[scAHdl,scWHdl,scBHdl],{'Above expectation','Within expectation','Below expectation'});
lgd2Hdl.Location='southeast';
lgd2Hdl.FontSize=13;
lgd2Hdl.TextColor=[.4,.4,.4];
完整代码
% stackedBarhBarDumbbellBemo
% @author : slandarer
% gzh : slandarer随笔% 数据导入
Data=readtable('ta_results_revisions_data.csv');
[N,~]=size(Data);
%% ========================================================================
% figure窗口及axes坐标区域创建
fig=figure('Units','normalized','Position',[.1,.05,.55,.85],'Color',[1,1,1]);
% -------------------------------------------------------------------------
% 左侧柱状图axes
ax1=axes(fig);
ax1.NextPlot='add';
ax1.Position=[.12,.1,.3,.88];
ax1.XLim=[-.01,1];
ax1.YLim=[.5,N+.5];
plot(ax1,[-.01,-.01],[.5,N+.5],'Color',[1,1,1],'LineWidth',2)
ax1.YTick=1:N;
ax1.TickLength=[1e-5,14-5];
ax1.YTickLabel=Data.Name;
ax1.YDir='reverse';
ax1.XColor='none';
ax1.FontName='Times New Roman';
ax1.FontSize=11;
% -------------------------------------------------------------------------
ax2=axes(fig);
ax2.NextPlot='add';
ax2.Position=[.44,.1,.54,.88];
ax2.FontName='Times New Roman';
ax2.YColor='none';
ax2.XLim=[-5,80];
ax2.YLim=[.5,N+.5];
ax2.XTick=[0,20,40,60];
ax2.LineWidth=.8;
ax2.TickDir='out';
ax2.FontSize=11;
ax2.XLabel.String='Number of Transitions';
ax2.XLabel.FontSize=16;
%% ========================================================================
% 左侧堆叠柱状图绘制
barhHdl=barh(ax1,[Data.Shallow,Data.Intermediate,Data.Deep],'stacked');
% 修改配色
barhHdl(1).EdgeColor='none';
barhHdl(2).EdgeColor='none';
barhHdl(3).EdgeColor='none';
barhHdl(1).FaceColor=[176,224,230]./255;
barhHdl(2).FaceColor=[44,142,181]./255;
barhHdl(3).FaceColor=[22,70,91]./255;
% 绘制图例
lgd1Hdl=legend(ax1,barhHdl,{'Shallow','Intermediate','Deep'});
lgd1Hdl.NumColumns=2;
lgd1Hdl.ItemTokenSize=[18,18];
lgd1Hdl.Position=[.17,.02,.2,.07];
lgd1Hdl.FontSize=13;
%% ========================================================================
% 右侧哑铃图绘制
% 绘制灰色线条
XX=repmat(ax2.XLim,[N,1])*[1,0,nan;0,1,nan];
YY=repmat((1:N)',[1,3]);XX=XX';YY=YY';
plot(ax2,XX(:),YY(:),'LineWidth',.8,'Color',[229,229,229]./255)
% 绘制圆角矩形
for i=1:N
rectangle(ax2,'Position',[Data.Low(i),i-.4,Data.High(i)-Data.Low(i),.8],...'EdgeColor','none','FaceColor',[229,229,229]./255,'Curvature',1)
end
% 绘制中值点与实际值连线
NXX=[Data.Median,Data.Exact]*[1,0,nan;0,1,nan];NXX=NXX';
plot(ax2,NXX(:),YY(:),'LineWidth',.8,'Color',[102,102,102]./255,'LineWidth',1.5)
% 绘制中值处圆点
scatter(ax2,Data.Median,1:N,120,'filled','o','MarkerFaceColor',[1,1,1],...'MarkerEdgeColor',[102,102,102]./255,'LineWidth',1.5)
% 绘制实际值圆点
scAHdl=scatter(ax2,Data.Exact(Data.Exact>Data.High),find(Data.Exact>Data.High),...120,'filled','o','MarkerFaceColor',[0,160,138]./255,'MarkerEdgeColor',[0,160,138]./255,'LineWidth',1.5);
scWHdl=scatter(ax2,Data.Exact(Data.Exact<=Data.High&Data.Exact>=Data.Low),find(Data.Exact<=Data.High&Data.Exact>=Data.Low),...120,'filled','o','MarkerFaceColor',[102,102,102]./255,'MarkerEdgeColor',[102,102,102]./255,'LineWidth',1.5);
scBHdl=scatter(ax2,Data.Exact(Data.Exact<Data.Low),find(Data.Exact<Data.Low),...120,'filled','o','MarkerFaceColor',[241,175,1]./255,'MarkerEdgeColor',[241,175,1]./255,'LineWidth',1.5);
% 绘制图例
lgd2Hdl=legend(ax2,[scAHdl,scWHdl,scBHdl],{'Above expectation','Within expectation','Below expectation'});
lgd2Hdl.Location='southeast';
lgd2Hdl.FontSize=13;
lgd2Hdl.TextColor=[.4,.4,.4];
随便改个颜色:
完
以上已经是完整代码,若是懒得复制可从以下gitee仓库下载文件:
https://gitee.com/slandarer/PLTreprint
相关文章:

MATLAB | 绘图复刻(八) | 堆叠柱状图+哑铃图
本次复刻的是Nature Communications中Friedman, S.T., Muoz, M.M. A latitudinal gradient of deep-sea invasions for marine fishes. Nat Commun 14, 773 (2023). https://doi.org/10.1038/s41467-023-36501-4的Fig1图像: 复刻效果: 文章可在如下网站下…...

Scala之集合(2)
目录 集合基本函数: (1)获取集合长度 (2)获取集合大小 (3)循环遍历 (4)迭代器 (5)生成字符串 (6)是否包含 衍生集合…...

【图像分割】视觉大模型SEEM(Segment Everything Everywhere All at Once)原理解读
文章目录 摘要(效果)二、前言三、相关工作四、method4.1 多用途4.2 组合性4.3 交互式。4.4 语义感知 五、实验 论文地址:https://arxiv.org/abs/2304.06718 测试代码:https://github.com/UX-Decoder/Segment-Everything-Everywher…...
Linux: command: ibstat; infiniband
文章目录 如何在Linux上安装infiniband相关的软件。ibstat相关资料 如何在Linux上安装infiniband相关的软件。 https://access.redhat.com/solutions/301643 https://docs.oracle.com/cd/E19436-01/820-3522-10/ch3-linux.html yum groupinstall “Infiniband Support” Pack…...

UML简介与类图详解
1 UML简介 1.1 UML是什么 UML,全称为Unified Model Language,即统一建模语言,是由一整套图表组成的,为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言。UML 代表了一组最佳工程实践,这些实践已被证明在…...
【每日一题】1994.好子集的数目
1994.好子集的数目 题目描述解决方案:状态压缩动态规划代码:Python 题目来源:LeetCode 原文链接:https://mp.weixin.qq.com/s/myI7_ZwJM7kizrwUtWgAZQ 难度级别:困难 题目描述 给你一个整数数组 nums。如果 nums 的一…...

坚持伙伴优先,共创数据存储新生态
4 月 26 日,2023 阿里云合作伙伴大会上,阿里巴巴集团董事会主席兼 CEO、阿里云智能集团 CEO 张勇表示,阿里云的核心定位是一家云计算产品公司,生态是阿里云的根基。让被集成说到做到的核心,是要坚定走向“产品被集成”…...

树形结构的三级分类如何实现?
概述: 本三级联动分类服务端使用的是: Springboot MyBatis-plus,前端使用的是:VueElementUI,树形控件使用的是el-tree。本三级联动分类可以把任一子项拖拽到其它目录,可以添加、编辑、删除分类。 效果图:…...

SSM整合完整流程
🏠个人主页:shark-Gao 🧑个人简介:大家好,我是shark-Gao,一个想要与大家共同进步的男人😉😉 🎉目前状况:23届毕业生,目前在某公司实习…...

虹科方案 | 助力高性能视频存储解决方案-2
上篇文章《虹科方案 | 助力高性能视频存储解决方案-1》我们分享了虹科&ATTO 和 Avid 共同创建协作解决方案,助力高性能视频存储,今天我们再深入介绍一下我们的案例详情。 一、行业挑战 从高端广播设施到小型独立工作室的媒体后期制作环境都需要允许多…...

java版深圳 工程管理系统软件 自主研发,工程行业适用 软件源码
Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显示…...

云原生Istio架构和组件介绍
目录 1 Istio 架构2 Istio组件介绍2.1 Pilot2.2 Mixer2.3 Citadel2.4 Galley2.5 Sidecar-injector2.6 Proxy(Envoy)2.7 Ingressgateway2.8 其他组件 1 Istio 架构 Istio的架构,分为控制平面和数据面平两部分。 - 数据平面:由一组智能代理([En…...

吹爆,全网第一个手把手教你从零开始搭建Spring Cloud Alibaba的笔记
Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与 Spring Cloud 体系的融合。 Springcloud 和 Srpingcloud Alibaba 区别? SpringCloud: 部分组件停止维护和更新,给开发带来不便;SpringCl…...

企业短信遭疯狂盗用,可能是没配置验证码
手机短信作为一种快捷的通讯方式被广泛应用。不仅在个人日常生活中,企业也习惯使用手机短信来进行验证和提醒,以保证业务的正常进行。随着数字化的发展,手机短信也成为了不法分子滥用的目标之一,给个人和企业带来不同经济损失。 个…...

【UE】直升机沿样条线移动
效果 步骤 1. 将虚幻商城中的免费资产导入工程 下载完毕后可以看到如下文件 2. 新建一个Actor蓝图类,命名为“Track”,这个蓝图就是用来画样条线的 打开“Track”,添加样条组件 3. 打开“BP_West_Heli_AH64D” 在事件图表中先新建一个时间轴…...
GaussDB_200_6.5.1部署安装
目录 安装前准备 安装依赖 修改/etc/hosts 上传解压介质 预安装 拷贝安装包 预安装配置 编辑preinstall.ini配置文件 编辑host0配置文件 执行预安装命令 安装FusionInsight_Manager 修改install安装配置文件 执行安装命令 web操作安装数据库 GaussDB200测试 配…...

软件工具 | Python调用运筹优化求解器(一):以CVRPVRPTW为例
目录 1. 引言2. 求解器介绍3. 基础语言3.1 创建模型3.2 添加变量3.3 添加目标函数3.4 添加约束3.5 设置参数3.6 求解 4. 数学模型4.1 [CVRP数学模型](https://mp.weixin.qq.com/s/DYh-5WkrYxk1gCKo8ZjvAw)4.2 [VRPTW数学模型](https://mp.weixin.qq.com/s/tF-ayzjpZfuZvelvItue…...
如何在JAVA中实现网络编程?
在Java中实现网络编程通常需要使用Java提供的网络编程库——Java Networking API。Java Networking API支持常见的TCP和UDP协议,包括Socket、ServerSocket、DatagramSocket等类,通过这些类,我们可以创建、连接、监听和传输数据。 下面是在Ja…...

【redis】redis的缓存过期淘汰策略
【redis】redis的缓存过期淘汰策略 文章目录 【redis】redis的缓存过期淘汰策略前言一、面试题二、redis内存满了怎么办?1、redis默认内存是多少?在哪查看?如何修改?在conf配置文件中可以查看 修改,内存默认是0redis的默认内存有…...

ASP.NET动态Web开发技术第8章
第8章ASP.NET数据访问 一.预习笔记 1.SqlDataSource控件 SqlDataSource数据源控件支持连接SQL关系数据库,它使用SQL命令来检索和修改数据。通常将SqlDataSource数据源控件与数据绑定控件一起使用。 属性1:ID:当前数据源控件的唯一标识符 …...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...