MATLAB | 绘图复刻(十九)| 轻松拿捏 Nature Communications 绘图

hello这次真的是好久不见了,前段时间确实太忙,后台都忙到没时间看,对不住大家的热情,这期复刻两个 Nature Communications 绘图,主要都和弦图有关:

原图 1

复刻图 1

原图 2

复刻图 2

这次绘图使用我自己开发的弦图绘制工具和桑基图绘制工具,这些工具的fileexchange 链接:

  • 【弦图】https://www.mathworks.com/matlabcentral/fileexchange/116550-chord-chart
  • 【有向弦图】https://www.mathworks.com/matlabcentral/fileexchange/121043-digraph-chord-chart
  • 【桑基图】https://www.mathworks.com/matlabcentral/fileexchange/128679-sankey-plot

当然本次复刻结果的完整代码和数据也会放到下面这个gitee仓库,建议大家【直接去如下仓库】获取完整代码:

  • https://gitee.com/slandarer/PLTreprint

复刻一 : 有向弦图 + 桑基图

这幅图出自:Ji, M., Zhou, J., Li, Y. et al. Biodiversity of mudflat intertidal viromes along the Chinese coasts. Nat Commun 15, 8611 (2024). https://doi.org/10.1038/s41467-024-52996-x

可以看出复刻出的图的颜色和变量顺序有点出入,原文后面又调整了数据顺序,这里我们就不调整了直接画:首先直接进行数据导入和预处理:

% 数据预处理部分 ====================================
CList = [  1,201,117; 197,169,255;  78,149,241;247,191,142; 252,235, 79; 190,190,190]./255;
Data = readtable('Fig.4d.csv');
% 提取变量名和数值
nameList = Data.Region;
Data = Data(:, 2:end); 
dataMat = Data.Variables;

1 弦图绘制

fileexchange 下载的工具包里面有这个函数详细的用法,本账号搜弦图也能搜到很多基本使用教程这里不再详述,我们创建一个 figure 窗口,之后在左侧生成一个 axes 坐标区,然后几行代码就能绘制图像:

% 弦图绘图部分 ==========================================
figure('Units','normalized','Position',[.02,.05,.7,.85])
ax1 = axes('Parent', gcf, 'Position',[0, .11, .7, .8], 'NextPlot','add');
BCC=biChordChart(dataMat, 'Label',nameList, 'Arrow','on', 'CData',CList, ...'TickMode','Linear', 'LRadius',1.3);
% 刻度的设置要在draw()之前
% 刻度的紧密程度,数值越高刻度线数量越多
BCC.linearTickCompactDegree = 3.2;
% 是否开启次刻度线
BCC.linearMinorTick = 'on';
BCC=BCC.draw(); 
BCC.tickState('on')
BCC.tickLabelState('on')
% 设置字体、刻度线粗细
set(findobj('type', 'line'), 'LineWidth',1.5)
BCC.setFont('FontSize', 18)

再在右侧绘制一个渐变的桑基图即可,大部分设置都写了注释:
之后再通过annotation函数绘制连接两个图的线条。

2 桑基图绘制

% 桑基图绘图部分 =========================================
ax2 = axes('Parent', gcf, 'Position', [.7, .11, .23, .8], 'NextPlot','add');
links(1:5, 1) = nameList(1);
links(1:5, 2) = nameList(2:end);
links(1:5, 3) = num2cell(dataMat(2:end,1));
disp(links)
% 创建桑基图对象
SK=SSankey(links(:,1), links(:,2), links(:,3));
% 设置配色
SK.ColorList = CList;
% 修改链接颜色渲染方式
% 'left'/'right'/'interp'(default)/'map'/'simple'
SK.RenderingMethod='interp'; 
% 设置方块横向宽度和竖向间隔
SK.Sep=.02;
SK.BlockScale = .1;
SK.draw()% 修饰一下
for i=1:6% 设置块线条粗细,设置字体SK.setBlock(i,'EdgeColor',[0,0,0], 'LineWidth',1)SK.setLabel(i,'FontSize',18, 'FontName','default')
end
% 设置最左侧方块的文字旋转90度
SK.setLabel(1,'Rotation',90, 'HorizontalAlignment','center', ...'VerticalAlignment','bottom')
annotation(gcf, 'line', [.59 .68], [.544 0.575], 'LineWidth',1.5, 'LineStyle','--');


复刻二 : 无向弦图

这篇来自:Kong, L., Feng, Y., Zheng, R. et al. Interspecies hydrogen transfer between cyanobacteria and symbiotic bacteria drives nitrogen loss. Nat Commun 16, 5078 (2025). https://doi.org/10.1038/s41467-025-60327-x

这次我们提前将xlsx内的数据进行了排序,还是先读取数据:

% 数据预处理部分 ====================================
Data = readtable('41467_2025_60327_MOESM6_ESM.xlsx');
% 提取变量名和数值
rowName = Data.Taxon_name;
Data = Data(:, 2:end); 
colName = Data.Properties.VariableNames;
Data = Data.Variables;

1 弦图绘制

% 绘图部分 ==========================================
figure('Units','normalized', 'Position',[.02,.05,.8,.85])
CC = chordChart(Data, 'colName',colName, 'rowName', rowName, ...'TickMode','linear' ,'Sep',1/80, 'LRadius', 1.32, 'OSqRatio',75/100);
% 刻度的设置要在draw()之前
% 刻度的紧密程度,数值越高刻度线数量越多
CC.linearTickCompactDegree = 1.7;
% 是否开启次刻度线
CC.linearMinorTick = 'on';
CC = CC.draw();
% 显示刻度和数值
CC.tickState('on')
CC.tickLabelState('on')

2 标签隐藏

可以看出很多标签互相遮挡,我们尝试隐藏:

% 设置字体、刻度线粗细并把 1 号和 5:10 号标签隐藏
set(findobj('type', 'line'), 'LineWidth',1.5)
CC.setFont('FontSize', 18)
set(CC.nameFHdl([1, 5:10]), 'Color', 'none')
set(CC.nameFHdl(7), 'Color', 'k', 'String', 'Others')

3 配色修改

对每个方块和弦进行颜色修改:

% 修改配色 ==========================================
colCList = [204,103, 99; 232,183,183; 252,168,133; 206, 96, 16;  61,114,176;   1,  7,172]./255;
rowCList = [ 32,180,  2;  95,167,255;  85, 77,150;253,224,169; 215,234,209; 177,229,253;255,239,206; 163,184,209; 207,225,226;219,210,234]./255;
% 修改上方方块颜色
for i = 1:length(colName)CC.setSquareT_N(i, 'FaceColor', colCList(i,:))
end
% 修改下方方块颜色和弦配色
for i = 1:length(rowName)CC.setSquareF_N(i, 'FaceColor', rowCList(i,:))for j = 1:length(colName)CC.setChordMN(i,j, 'FaceColor',rowCList(i,:), 'FaceAlpha',.4)end
end

4 绘制图例

因为有些标签被隐藏,为了说明什么是什么,为这些块添加图例:

% 绘制图例 ==========================================
patchHdl = [];
for i = [10:-1:5, 1]patchHdl(end + 1) = fill([10,11,12],[10,13,13], ...rowCList(i,:), 'EdgeColor', 'none');
end
lgdHdl = legend(patchHdl, rowName([10:-1:5, 1]), 'FontSize',14, 'Box','off');
lgdHdl.Position = [.76,.11,.167,.27];
lgdHdl.ItemTokenSize = [18,8];


以上即为完整代码,但是没有数据的话没法运行,数据和完整代码已经放在以下gitee仓库:

  • https://gitee.com/slandarer/PLTreprint

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

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

相关文章

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享

设计模式(代理设计模式)

代理模式解释清楚,所以如果想对一个类进行功能上增强而又不改变原来的代码情况下,那么只需要让这个类代理类就是我们的顺丰,对吧?并行增强就可以了。具体增强什么?在哪方面增强由代理类进行决定。 代码实现就是使用代理对象代理相关的逻辑…

Flask + ECharts+MYSQL全球贸易数字化大屏

核心功能: 全球贸易热力图:展示中国与各国的贸易关系强度 贸易指标卡片:实时显示贸易总额、投资额等关键指标 贸易伙伴排名:展示中国前10大贸易伙伴 贸易类型分布:展示各类商品的贸易占比 全球实时动态:滚动显示全球贸易、投资等实时事件 技术亮点: 使用WebSocket实现实…

wpf Behaviors库实现支持多选操作进行后台绑定数据的ListView

<ListView ItemsSource"{Binding SchemeItems}" SelectionMode"Extended" VerticalAlignment"Stretch" HorizontalAlignment"Stretch"><ListView.ContextMenu><ContextMenu><MenuItem Header"删除" …

50个JAVA常见代码大全:学完这篇从Java小白到架构师

50个JAVA常见代码大全&#xff1a;学完这篇从Java小白到架构师 Java&#xff0c;作为一门流行多年的编程语言&#xff0c;始终占据着软件开发领域的重要位置。无论是初学者还是经验丰富的程序员&#xff0c;掌握Java中常见的代码和概念都是至关重要的。本文将列出50个Java常用…

【Linux手册】冯诺依曼体系结构

目录 前言 五大组件 数据信号 存储器&#xff08;内存&#xff09;有必要吗 常见面试题 前言 冯诺依曼体系结构是当代计算机基本架构&#xff0c;冯诺依曼体系有五大组件&#xff0c;通过这五大组件直观的描述了计算机的工作原理&#xff1b;学习冯诺依曼体系可以让给我们更…

10_聚类

描述 聚类&#xff08;clustering&#xff09;是将数据集划分成组的任务&#xff0c;这些组叫作簇&#xff08;cluster&#xff09;。其目标是划分数据&#xff0c;使得一个簇内的数据点非常相似且不同簇内的数据点非常不同。与分类算法类似&#xff0c;聚类算法为每个数据点分…

【SSM】SpringBoot学习笔记1:SpringBoot快速入门

前言&#xff1a; 文章是系列学习笔记第9篇。基于黑马程序员课程完成&#xff0c;是笔者的学习笔记与心得总结&#xff0c;供自己和他人参考。笔记大部分是对黑马视频的归纳&#xff0c;少部分自己的理解&#xff0c;微量ai解释的内容&#xff08;ai部分会标出&#xff09;。 …

国产高性能pSRAM选型指南:CSS6404LS-LI 64Mb QSPI伪静态存储器

一、芯片基础特性 核心参数 容量 &#xff1a;64Mb&#xff08;8M 8bit&#xff09;电压 &#xff1a;单电源供电 2.7-3.6V &#xff08;兼容3.3V系统&#xff09;接口 &#xff1a;Quad-SPI&#xff08;QPI/SPI&#xff09;同步模式封装 &#xff1a; SOP-8L (150mil) &#…

Cilium动手实验室: 精通之旅---4.Cilium Gateway API - Lab

Cilium动手实验室: 精通之旅---4.Cilium Gateway API - Lab 1. 环境准备2. API 网关--HTTP2.1 部署应用2.2 部署网关2.3 HTTP路径匹配2.4 HTTP头匹配 3. API网关--HTTPS3.1 创建TLS证书和私钥3.2 部署HTTPS网关3.3 HTTPS请求测试 4. API网关--TLS 路由4.1 部署应用4.2 部署网关…

20250605在微星X99主板中配置WIN10和ubuntu22.04.6双系统启动的引导设置

rootrootrootroot-X99-Turbo:~$ sudo apt-get install boot-repair rootrootrootroot-X99-Turbo:~$ sudo add-apt-repository ppa:yannubuntu/boot-repair rootrootrootroot-X99-Turbo:~$ sudo apt-get install boot-repair 20250605在微星X99主板中配置WIN10和ubuntu22.04.6双…

MyBatis之测试添加功能

1. 首先Mybatis为我们提供了一个操作数据库的会话对象叫Sqlsession&#xff0c;所以我们就需要先获取sqlsession对象&#xff1a; //加载核心配置文件 InputStream is Resources.getResourceAsStream("mybatis-config.xml"); //获取sqlSessionFactoryBuilder(是我…

[论文阅读] 人工智能+软件工程 | MemFL:给大模型装上“项目记忆”,让软件故障定位又快又准

【论文解读】MemFL&#xff1a;给大模型装上“项目记忆”&#xff0c;让软件故障定位又快又准 论文信息 arXiv:2506.03585 Improving LLM-Based Fault Localization with External Memory and Project Context Inseok Yeo, Duksan Ryu, Jongmoon Baik Subjects: Software Engi…

Java开发中复用公共SQL的方法

在一次Java后端开发的面试中&#xff0c;面试官问了我一个问题&#xff1a;“你在写代码时会复用公共SQL吗&#xff1f;如果会的话&#xff0c;能详细介绍一下你是如何实现的吗&#xff1f;”这个问题让我眼前一亮&#xff0c;因为在实际项目中&#xff0c;SQL复用确实是一个非…

C#学习26天:内存优化的几种方法

1.减少对象创建 使用场景&#xff1a; 在循环或密集计算中频繁创建对象时。涉及大量短生命周期对象的场景&#xff0c;比如日志记录或字符串拼接。游戏开发中&#xff0c;需要频繁更新对象状态时。 说明&#xff1a; 重用对象可以降低内存分配和垃圾回收的开销。使用对象池…

【opencv】基础知识到进阶(更新中)

安装&#xff1a;pip install opencv-python 入门案例 读取图片 本节我们将来学习,如何使用opencv显示一张图片出来,我们首先需要掌握一条图片读取的api cv.imread("图片路径","读取的方式") # 图片路径: 需要在工程目录中,或者一个文件的绝对路径 # 读取…

【Part 3 Unity VR眼镜端播放器开发与优化】第二节|VR眼镜端的开发适配与交互设计

文章目录 《VR 360全景视频开发》专栏Part 3&#xff5c;Unity VR眼镜端播放器开发与优化第一节&#xff5c;基于Unity的360全景视频播放实现方案第二节&#xff5c;VR眼镜端的开发适配与交互设计一、Unity XR开发环境与设备适配1.1 启用XR Plugin Management1.2 配置OpenXR与平…

SQL进阶之旅 Day 16:特定数据库引擎高级特性

【SQL进阶之旅 Day 16】特定数据库引擎高级特性 开篇 在“SQL进阶之旅”系列的第16天&#xff0c;我们将探讨特定数据库引擎的高级特性。这些特性通常为某些特定场景设计&#xff0c;能够显著提升查询性能或简化复杂任务。本篇文章将覆盖MySQL、PostgreSQL和Oracle的核心高级…

c++算法学习4——广度搜索bfs

一、引言&#xff1a;探索迷宫的智能方法 在解决迷宫最短路径问题时&#xff0c;广度优先搜索&#xff08;BFS&#xff09;是一种高效而优雅的算法。与深度优先搜索&#xff08;DFS&#xff09;不同&#xff0c;BFS采用"由近及远"的搜索策略&#xff0c;逐层探索所有…

4.RV1126-OPENCV 图像轮廓识别

一.图像识别API 1.图像识别作用 它常用于视觉任务、目标检测、图像分割等等。在 OPENCV 中通常使用 Canny 函数、findContours 函数、drawContours 函数结合在一起去做轮廓的形检测。 2.常用的API findContours 函数&#xff1a;用于寻找图片的轮廓&#xff0c;并把所有的数…