MATLAB | 绘图复刻(十二) | 桑基图+气泡图

news2024/11/25 18:44:36

hey 绘图复刻居然已经出到第十二期,破百指日可待hiahiahia,今天来复刻一下

  • Yu, W., Wang, Z., Yu, X. et al. Kir2.1-mediated membrane potential promotes nutrient acquisition and inflammation through regulation of nutrient transporters. Nat Commun 13, 3544 (2022).

这篇论文中的Fig. 1的i图,大概长这样:

这里我们随便生成了点数据效果大概长这样:

原论文可以在以下地址下载:

  • https://www.nature.com/articles/s41467-022-31149-y.pdf

本文用到了我以前写的文章中用到的工具,请将以下俩工具添加到路径或放在m文件所在文件夹内:

  • https://slandarer.blog.csdn.net/article/details/130430147
  • https://slandarer.blog.csdn.net/article/details/127719784

若是嫌麻烦可以直接移步文末去gitee仓库下载!!!!!!

若是嫌麻烦可以直接移步文末去gitee仓库下载!!!!!!

若是嫌麻烦可以直接移步文末去gitee仓库下载!!!!!!


1 桑基图

在左侧建立个axes并绘制桑基图。为了方便理解注释写的比较详细:

1.1 创建坐标区域部分代码

clc;clear;close all;rng(32)
% sankeyBubble
fig=figure('Name','sankey bubble','Units','normalized','Position',[.05,.05,.44,.85],'Color','w');

ax1=axes('Parent',fig,'Position',[1/20,1/15,2.8/5-1/20,1-1.6/15]);
ax1.NextPlot='add';

1.2 随机生成数据部分代码

LSet='ABCDEFGH';
links={'','',''};
for i=1:length(LSet)
    tLinks=[compose([char(LSet(i)+32),'%d'],(1:5)'),...
            num2cell(char(LSet(i).*ones(5,1))),num2cell(rand(5,1).*10)];   
    links=[links;tLinks];
end
for i=1:6
    links=[links;
        [char('A'+32+randi([0,7],[1,1])),...
        num2str(randi([1,5],[1,1]))],...
        char('A'+randi([0,7],[1,1])),...
        num2cell(rand(1,1).*10)];
end
links(1,:)=[];

1.3 实际绘图代码

% 创建桑基图对象(Create a Sankey diagram object)
SK=SSankey(links(:,1),links(:,2),links(:,3));

% 修改对齐方式(Set alignment)
% 'up'/'down'/'center'(default)
SK.Align='down';

SK.Sep=.12;

% 设置颜色(Set color)
SK.ColorList=[slanCM(134,40);slanCM(134,8)];

% 修改链接颜色渲染方式(Set link color rendering method)
% 'left'/'right'/'interp'(default)/'map'/'simple'
SK.RenderingMethod='simple'; 

% 开始绘图(Start drawing)
SK.draw();

for i=1:48
    SK.setLabel(i,'FontSize',12)
end

桑基图更详细的用法请去以下推送获取查看哇:

  • https://slandarer.blog.csdn.net/article/details/130430147

下面几个图都是我写的这个桑基图工具能实现的可以去瞅瞅~



而配色使用的是我写的slanCM工具包:

  • https://slandarer.blog.csdn.net/article/details/127719784


2 右侧axes创建

2.1 定位axes

因为我们是随机生成的数据,我们不知道右侧实际会有多宽,我们想要对齐就要获取一下数据范围,并计算一下右侧axes应该在的位置:

PatchSet=findobj(ax1,'Type','Patch');
Patch2Y=ones(0,4);
for i=length(PatchSet):-1:1
    if PatchSet(i).XData(1)==2
        Patch2Y=[Patch2Y;PatchSet(i).YData(:)'];
    end
end

%% ========================================================================
% 构建右侧坐标区域并基础修饰
Patch2Lim=max(max(Patch2Y))-min(min(Patch2Y));
ax2=axes('Parent',fig,'Position',[2.8/5+1/80,1/15,1.5/5-1/20,Patch2Lim./diff(ax1.YLim).*(1-1.6/15)]);
ax2.YLim=[min(min(Patch2Y)),max(max(Patch2Y))];

2.2 右侧axes修饰

左侧我自己写的工具会自带修饰,因此只修饰右侧就好啦~

ax2.NextPlot='add';
ax2.Box='on';
ax2.YTick=[];
ax2.TickDir='out';
ax2.LineWidth=1;
ax2.FontName='Times New Roman';
ax2.FontSize=11;
ax2.YDir='reverse';
ax2.XLim=[-0.6,2.4];
ax2.XTick=-0.5:0.5:2;
ax2.XLabel.String='-Log(Pvalue)';
ax2.XLabel.FontSize=14;
ax2.XLabel.FontWeight='bold';

tMap=slanCM(20,64);
colormap(tMap(33:end,:))


3 气泡图绘制

3.1 随机数据生成

% 随便编了点数据
NLogPvalue=linspace(2,-0.3,8);
PatchMeanY=(Patch2Y(:,2)+Patch2Y(:,3)).'./2;
Count=randi([1,8],[1,8]);
HitRatio=0.1+0.4.*rand([1,8]);

3.2 绘制气泡图并调整气泡大小

bubblechart(NLogPvalue,PatchMeanY,Count,HitRatio)
bubblesize([15,30])

3.3 绘制颜色条和图例

% 绘制颜色条
CMPHdl=colorbar;
CMPHdl.Position=[4.3/5,1/15+Patch2Lim./diff(ax1.YLim).*(1-1.6/15)./2,1/40,Patch2Lim./diff(ax1.YLim).*(1-1.6/15).*0.4];
text(ax2,ax2.XLim(2)+diff(ax2.XLim).*0.12,ax2.YLim(1)+diff(ax2.YLim).*0.05,'Hit Ratio',...
    'FontSize',14,'FontName','Times New Roman','FontWeight','bold')

% 绘制图例
LGDHdl=bubblelegend;
LGDHdl.Position=[4.2/5,1/15,1/40,Patch2Lim./diff(ax1.YLim).*(1-1.6/15).*0.4];
LGDHdl.Box='off';
text(ax2,ax2.XLim(2)+diff(ax2.XLim).*0.12,ax2.YLim(1)+diff(ax2.YLim).*0.65,'Count',...
    'FontSize',14,'FontName','Times New Roman','FontWeight','bold')


4 完整代码

clc;clear;close all;rng(32)
% sankeyBubble
fig=figure('Name','sankey bubble','Units','normalized','Position',[.05,.05,.44,.85],'Color','w');

ax1=axes('Parent',fig,'Position',[1/20,1/15,2.8/5-1/20,1-1.6/15]);
ax1.NextPlot='add';

LSet='ABCDEFGH';
links={'','',''};
for i=1:length(LSet)
    tLinks=[compose([char(LSet(i)+32),'%d'],(1:5)'),...
            num2cell(char(LSet(i).*ones(5,1))),num2cell(rand(5,1).*10)];   
    links=[links;tLinks];
end
for i=1:6
    links=[links;
        [char('A'+32+randi([0,7],[1,1])),...
        num2str(randi([1,5],[1,1]))],...
        char('A'+randi([0,7],[1,1])),...
        num2cell(rand(1,1).*10)];
end
links(1,:)=[];

% 创建桑基图对象(Create a Sankey diagram object)
SK=SSankey(links(:,1),links(:,2),links(:,3));

% 修改对齐方式(Set alignment)
% 'up'/'down'/'center'(default)
SK.Align='down';

SK.Sep=.12;

% 设置颜色(Set color)
SK.ColorList=[slanCM(134,40);slanCM(134,8)];

% 修改链接颜色渲染方式(Set link color rendering method)
% 'left'/'right'/'interp'(default)/'map'/'simple'
SK.RenderingMethod='simple'; 

% 开始绘图(Start drawing)
SK.draw();

for i=1:48
    SK.setLabel(i,'FontSize',12)
end

PatchSet=findobj(ax1,'Type','Patch');
Patch2Y=ones(0,4);
for i=length(PatchSet):-1:1
    if PatchSet(i).XData(1)==2
        Patch2Y=[Patch2Y;PatchSet(i).YData(:)'];
    end
end

%% ========================================================================
% 构建右侧坐标区域并基础修饰
Patch2Lim=max(max(Patch2Y))-min(min(Patch2Y));
ax2=axes('Parent',fig,'Position',[2.8/5+1/80,1/15,1.5/5-1/20,Patch2Lim./diff(ax1.YLim).*(1-1.6/15)]);
ax2.YLim=[min(min(Patch2Y)),max(max(Patch2Y))];
ax2.NextPlot='add';
ax2.Box='on';
ax2.YTick=[];
ax2.TickDir='out';
ax2.LineWidth=1;
ax2.FontName='Times New Roman';
ax2.FontSize=11;
ax2.YDir='reverse';
ax2.XLim=[-0.6,2.4];
ax2.XTick=-0.5:0.5:2;
ax2.XLabel.String='-Log(Pvalue)';
ax2.XLabel.FontSize=14;
ax2.XLabel.FontWeight='bold';

tMap=slanCM(20,64);
colormap(tMap(33:end,:))

% 随便编了点数据
NLogPvalue=linspace(2,-0.3,8);
PatchMeanY=(Patch2Y(:,2)+Patch2Y(:,3)).'./2;
Count=randi([1,8],[1,8]);
HitRatio=0.1+0.4.*rand([1,8]);

bubblechart(NLogPvalue,PatchMeanY,Count,HitRatio)
bubblesize([15,30])

% 绘制颜色条
CMPHdl=colorbar;
CMPHdl.Position=[4.3/5,1/15+Patch2Lim./diff(ax1.YLim).*(1-1.6/15)./2,1/40,Patch2Lim./diff(ax1.YLim).*(1-1.6/15).*0.4];
text(ax2,ax2.XLim(2)+diff(ax2.XLim).*0.12,ax2.YLim(1)+diff(ax2.YLim).*0.05,'Hit Ratio',...
    'FontSize',14,'FontName','Times New Roman','FontWeight','bold')

% 绘制图例
LGDHdl=bubblelegend;
LGDHdl.Position=[4.2/5,1/15,1/40,Patch2Lim./diff(ax1.YLim).*(1-1.6/15).*0.4];
LGDHdl.Box='off';
text(ax2,ax2.XLim(2)+diff(ax2.XLim).*0.12,ax2.YLim(1)+diff(ax2.YLim).*0.65,'Count',...
    'FontSize',14,'FontName','Times New Roman','FontWeight','bold')

以上已经是本文全部内容,需要用到两个我自己写的工具包,若懒得一一获取代码,可以去以下gitee仓库获取全部代码:

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

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

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

相关文章

【css | loading】好看的loading特效

示例&#xff1a; https://code.juejin.cn/pen/7277764394618978365 html <div class"pl"><div class"pl__dot"></div><div class"pl__dot"></div><div class"pl__dot"></div><div c…

认识 AIGC ,浅淡 AIGC 的那些事—— AIGC:用 AI 创造万物

文章目录 &#x1f525;关于活动&#x1f4cb;前言&#x1f3af;什么是 AIGC&#x1f9e9;AIGC&#xff1a;用 AI 创造万物 &#x1f3af;AIGC 发展历程&#x1f3af;AIGC 峰会分享&#x1f3af;AIGC 与大模型&#x1f4dd;最后&#x1f4d1;参考资料 &#x1f525;关于活动 从…

数据库-基础篇-SQL-DML(数据操作语言)

目录 前言 一 . 添加数据(insert) 1.指定字段添加数据 2. 全部字段添加数据 3. 批量添加数据(指定字段) 4.批量添加数据(全部字段) 二 . 修改数据(Update) 三 . 删除数据 总结 前言 DML英文全称是Data Manipulation Language(数据操作语言)&#xff0c;用来对数据库中…

Revit SDK 内容摘要: 9.0 - 9.1

前提 不包含已单独写博客部分。 Revit SDK Samples 9.0 AllViews 创建图纸&#xff0c;并放置视图。 ViewSheet sheet ViewSheet.Create(doc, m_titleBlock.Id); double xDistance 0; double yDistance 0; CalculateDistance(sheet.Outline, views.Size, ref xDistance…

few shot目标检测survey paper笔记(整体概念)

paper: Few-Shot Object Detection: A Comprehensive Survey (CVPR2021) 深度学习提高了目标检测的精度&#xff0c;但是它需要大量的训练数据。 对于训练数据集中没有见过的目标&#xff0c;是检测不了的&#xff0c;所以就限制了在实际中的应用。 如果想让模型去识别新的目标…

【SLAM】坐标系变换与外参标定

【SLAM】坐标系变换与外参标定 突然发现学习文档有下面这句话&#xff1a; 学习这件事不在乎有没有人教你&#xff0c;最重要的是在于你自己有没有觉悟和恒心。——法布尔 task02从二维坐标系开始推导坐标系变换参数&#xff0c;进而加入平移&#xff0c;加入Z轴拓展到三维坐…

论文笔记:Deep Representation Learning for Trajectory Similarity Computation

ICDE 2018 1 intro 1.1 背景 用于计算轨迹相似性的成对点匹配方法&#xff08;DTW&#xff0c;LCSS&#xff0c;EDR&#xff0c;ERP&#xff09;的问题&#xff1a; 轨迹的采样率不均匀 如果两个轨迹表示相同的基本路径&#xff0c;但是以不同的采样率生成&#xff0c;那么这…

uni-app 之 下拉刷新,上拉加载,获取网络列表数据

uni-app 之 下拉刷新&#xff0c;上拉加载&#xff0c;获取网络列表数据 image.png <template><view><!-- 车源模块 -->--- uni.request 网络请求API接口 ---<view v-for"(item) in newsArr" :key"item.id" style"display: fle…

uniapp使用Vue2框架生成二维码

1. 生成二维码插件 npm install qrcodejs2 --save 上代码&#xff1a; <template><view><view class"page" ><div id"qrCode" ref"qrCodeDiv" ></div></view><view class"page">核…

微信小程序音频后台播放功能

微信小程序在手机息屏后依旧能播放音频&#xff0c;需要使用 wx.getBackgroundAudioManager() 方法创建后台音乐播放器&#xff0c;并将音乐播放任务交给这个后台播放器。 具体实现步骤如下&#xff1a; 小程序页面中&#xff0c;使用 wx.getBackgroundAudioManager() 方法创…

springMVC1之ModelAttribute注解

什么叫先执行 只要控制器方法一过来&#xff0c; 这个控制器里面的所有方法都会比下面执行的慢一点 我们来访问一个页面 也就是说访问的是控制器里面下面这个方法 看一下控制台执行效果 还是shouUser先执行了 什么叫如果没有提交的字段使用原来的数据 比如下面这个方法 我们在调…

php高级 TP+Redis实现发布订阅和消息推送案例实战

Redis 的发布-订阅模型是一种消息通信模式&#xff0c;它允许客户端之间通过特定的频道进行通信。在这种模型中&#xff0c;有些客户端负责发布消息&#xff08;发布者&#xff09;&#xff0c;而其他客户端则订阅它们感兴趣的频道并接收这些消息&#xff08;订阅者&#xff09…

自动驾驶汽车下匝道路径优化控制策略研究

摘要 随着社会不断进步&#xff0c; 经济快速发展&#xff0c; 科学技术也在突飞猛进&#xff0c; 交通行业是典型的领域之一。现阶段的交通发展&#xff37; 实现智能交通系统为目标&#xff0c; 正逐渐从信息化步入智能化&#xff0c;朝着智慧化迈进。近年来&#xff0c;一系…

线程练习题

有三个线程&#xff0c;分别只能打印A&#xff0c;B和C&#xff0c;要求按顺序打印ABC&#xff0c;打印10次 输出示例&#xff1a; ABC ABC ABC ABC ABC ABC ABC ABC ABC ABC &#xff08;1&#xff09;、这种方法并不能达到题目要求&#xff0c;因为无法确认当线程…

ChatGPT AIGC 实现Excel行列多条件交叉查找

查找函数在Excel中一直是非常重要的知识点,我们让ChatGPT AIGC来总结一下关于查找函数的优点与了处。 Excel中的查找函数是一种非常强大且多用途的工具,具有以下优点和作用: 1. 数据定位:查找函数可以帮助我们在大量数据中快速定位某个特定的数据或信息。 2. 数据整理:如…

sql注入之高权限注入和文件读写

死在山野的风里&#xff0c;活在自由的梦里 sql注入之高权限注入 高权限注入1.多个网站共享mysql服务器2.MySQL 权限介绍3.注入流程查询所有数据库名称查询表名对应的字段名查询数据 文件读写1.文件读写注入的原理2.文件读写注入的条件3.读取文件4.写入文件 高权限注入 在数据…

linux jenkins2.414.1-1.1版本安装

文章目录 前言一、rpm文件下载二、安装jenkins2.1.升级jdk1.82.2安装jenkins2.3 启动服务2.4 使用密码登录2.5 修改插件源2.6 汉化插件安装演示 总结 前言 之前也安装过jenkins&#xff0c;但是那个版本是2.1的&#xff0c;太老了很多插件都不支持&#xff0c;现在安装目前为止…

2022年全国研究生数学建模竞赛华为杯D题PISA架构芯片资源排布问题求解全过程文档及程序

2022年全国研究生数学建模竞赛华为杯 D题 PISA架构芯片资源排布问题 原题再现&#xff1a; 一、背景介绍 芯片是电子行业的基础&#xff0c;在当前日益复杂的国际形势下&#xff0c;芯片成了各个大国必争的高科技技术。本课题关注网络通信领域的交换芯片&#xff0c;传统的交…

5.5G的技术原理和应用场景

引言 5.5G即5G-Advanced&#xff0c;是一种移动通信技术。 这个解释显然十分的boring&#xff0c;但是在5.5G还未正式进入大家生活的今天&#xff0c;这是百度词条给出为数不多的解释。 当今社会&#xff0c;移动通讯已成为人们生活中不可缺少的一部分。2G打开了文本时代&…

C/C++ 代码中使用 CMake 工程目录

C/C 代码中使用 CMake 工程目录 文章目录 C/C 代码中使用 CMake 工程目录使用原因如何使用参考链接 使用原因 在 C 代码中获取工程路径有点麻烦&#xff0c;因为如果生成的可执行文件(.exe) 位置与工程目录不同&#xff0c;则当前的路径为运行时的路径&#xff0c;可能需要通过…