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

2023-11-03 08:50

本文主要是介绍MATLAB | 绘图复刻(十二) | 桑基图+气泡图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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:6links=[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:48SK.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:1if PatchSet(i).XData(1)==2Patch2Y=[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:6links=[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:48SK.setLabel(i,'FontSize',12)
endPatchSet=findobj(ax1,'Type','Patch');
Patch2Y=ones(0,4);
for i=length(PatchSet):-1:1if PatchSet(i).XData(1)==2Patch2Y=[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/

这篇关于MATLAB | 绘图复刻(十二) | 桑基图+气泡图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/337019

相关文章

AI绘图怎么变现?想做点副业的小白必看!

在科技飞速发展的今天,AI绘图作为一种新兴技术,不仅改变了艺术创作的方式,也为创作者提供了多种变现途径。本文将详细探讨几种常见的AI绘图变现方式,帮助创作者更好地利用这一技术实现经济收益。 更多实操教程和AI绘画工具,可以扫描下方,免费获取 定制服务:个性化的创意商机 个性化定制 AI绘图技术能够根据用户需求生成个性化的头像、壁纸、插画等作品。例如,姓氏头像在电商平台上非常受欢迎,

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

matplotlib绘图中插入图片

在使用matplotlib下的pyplot绘图时,有时处于各种原因,需要采用类似贴图的方式,插入外部的图片,例如添加自己的logo,或者其他的图形水印等。 一开始,查找到的资料都是使用imshow,但是这会有带来几个问题,一个是图形的原点发生了变化,另外一个问题就是图形比例也产生了变化,当然最大的问题是图形占据了整个绘图区域,完全喧宾夺主了,与我们设想的只在绘图区域中占据很小的一块不相符。 经

libsvm在matlab中的使用方法

原文地址:libsvm在matlab中的使用方法 作者: lwenqu_8lbsk 前段时间,gyp326曾在论坛里问libsvm如何在matlab中使用,我还奇怪,认为libsvm是C的程序,应该不能。没想到今天又有人问道,难道matlab真的能运行libsvm。我到官方网站看了下,原来,真的提供了matlab的使用接口。 接口下载在: http://www.csie.ntu.edu.

海龟绘图简易教程|Turtle for Python

turtle 是 python 内置的一个比较有趣味的模块,俗称 海龟绘图,它是基于 tkinter 模块打造,提供一些简单的绘图工具,海龟作图最初源自 20 世纪 60 年代的 Logo 编程语言,之后一些很酷的 Python 程序员构建了 turtle 库,让其他程序员只需要 import turtle,就可以在 Python 中使用海龟作图。 原文链接|海龟绘图简易教程 1. 基本

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数_matlab pmsm-CSDN博客

MATLAB层次聚类分析法

转自:http://blog.163.com/lxg_1123@126/blog/static/74841406201022774051963/ 层次聚类是基于距离的聚类方法,MATLAB中通过pdist、linkage、dendrogram、cluster等函数来完成。层次聚类的过程可以分这么几步: (1) 确定对象(实际上就是数据集中的每个数据点)之间的相似性,实际上就是定义一个表征