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

[复制链接]
发表于 5 天前 | 显示全部楼层 |阅读模式
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
可以看出复刻出的图的颜色和变量次序有点出入,原文后面又调整了数据次序,这里我们就不调整了直接画:首先直接举行数据导入和预处理:
  1. % 数据预处理部分 ====================================
  2. CList = [  1,201,117; 197,169,255;  78,149,241;
  3.          247,191,142; 252,235, 79; 190,190,190]./255;
  4. Data = readtable('Fig.4d.csv');
  5. % 提取变量名和数值
  6. nameList = Data.Region;
  7. Data = Data(:, 2:end);
  8. dataMat = Data.Variables;
复制代码
1 弦图绘制

fileexchange 下载的工具包里面有这个函数详细的用法,本账号搜弦图也能搜到很多根本使用教程这里不再详述,我们创建一个 figure 窗口,之后在左侧天生一个 axes 坐标区,然后几行代码就能绘制图像:
  1. % 弦图绘图部分 ==========================================
  2. figure('Units','normalized','Position',[.02,.05,.7,.85])
  3. ax1 = axes('Parent', gcf, 'Position',[0, .11, .7, .8], 'NextPlot','add');
  4. BCC=biChordChart(dataMat, 'Label',nameList, 'Arrow','on', 'CData',CList, ...
  5.     'TickMode','Linear', 'LRadius',1.3);
  6. % 刻度的设置要在draw()之前
  7. % 刻度的紧密程度,数值越高刻度线数量越多
  8. BCC.linearTickCompactDegree = 3.2;
  9. % 是否开启次刻度线
  10. BCC.linearMinorTick = 'on';
  11. BCC=BCC.draw();
  12. BCC.tickState('on')
  13. BCC.tickLabelState('on')
  14. % 设置字体、刻度线粗细
  15. set(findobj('type', 'line'), 'LineWidth',1.5)
  16. BCC.setFont('FontSize', 18)
复制代码

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

  1. % 桑基图绘图部分 =========================================
  2. ax2 = axes('Parent', gcf, 'Position', [.7, .11, .23, .8], 'NextPlot','add');
  3. links(1:5, 1) = nameList(1);
  4. links(1:5, 2) = nameList(2:end);
  5. links(1:5, 3) = num2cell(dataMat(2:end,1));
  6. disp(links)
  7. % 创建桑基图对象
  8. SK=SSankey(links(:,1), links(:,2), links(:,3));
  9. % 设置配色
  10. SK.ColorList = CList;
  11. % 修改链接颜色渲染方式
  12. % 'left'/'right'/'interp'(default)/'map'/'simple'
  13. SK.RenderingMethod='interp';
  14. % 设置方块横向宽度和竖向间隔
  15. SK.Sep=.02;
  16. SK.BlockScale = .1;
  17. SK.draw()
  18. % 修饰一下
  19. for i=1:6
  20.     % 设置块线条粗细,设置字体
  21.     SK.setBlock(i,'EdgeColor',[0,0,0], 'LineWidth',1)
  22.     SK.setLabel(i,'FontSize',18, 'FontName','default')
  23. end
  24. % 设置最左侧方块的文字旋转90度
  25. SK.setLabel(1,'Rotation',90, 'HorizontalAlignment','center', ...
  26.     'VerticalAlignment','bottom')
  27. 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内的数据举行了排序,还是先读取数据:
  1. % 数据预处理部分 ====================================
  2. Data = readtable('41467_2025_60327_MOESM6_ESM.xlsx');
  3. % 提取变量名和数值
  4. rowName = Data.Taxon_name;
  5. Data = Data(:, 2:end);
  6. colName = Data.Properties.VariableNames;
  7. Data = Data.Variables;
复制代码
1 弦图绘制

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

2 标签隐藏

可以看出很多标签互相遮挡,我们实验隐藏:
  1. % 设置字体、刻度线粗细并把 1 号和 5:10 号标签隐藏
  2. set(findobj('type', 'line'), 'LineWidth',1.5)
  3. CC.setFont('FontSize', 18)
  4. set(CC.nameFHdl([1, 5:10]), 'Color', 'none')
  5. set(CC.nameFHdl(7), 'Color', 'k', 'String', 'Others')
复制代码

3 配色修改

对每个方块和弦举行颜色修改:
  1. % 修改配色 ==========================================
  2. colCList = [204,103, 99; 232,183,183; 252,168,133;
  3.             206, 96, 16;  61,114,176;   1,  7,172]./255;
  4. rowCList = [ 32,180,  2;  95,167,255;  85, 77,150;
  5.             253,224,169; 215,234,209; 177,229,253;
  6.             255,239,206; 163,184,209; 207,225,226;
  7.             219,210,234]./255;
  8. % 修改上方方块颜色
  9. for i = 1:length(colName)
  10.     CC.setSquareT_N(i, 'FaceColor', colCList(i,:))
  11. end
  12. % 修改下方方块颜色和弦配色
  13. for i = 1:length(rowName)
  14.     CC.setSquareF_N(i, 'FaceColor', rowCList(i,:))
  15.     for j = 1:length(colName)
  16.         CC.setChordMN(i,j, 'FaceColor',rowCList(i,:), 'FaceAlpha',.4)
  17.     end
  18. end
复制代码

4 绘制图例

因为有些标签被隐藏,为了说明什么是什么,为这些块添加图例:
  1. % 绘制图例 ==========================================
  2. patchHdl = [];
  3. for i = [10:-1:5, 1]
  4.     patchHdl(end + 1) = fill([10,11,12],[10,13,13], ...
  5.         rowCList(i,:), 'EdgeColor', 'none');
  6. end
  7. lgdHdl = legend(patchHdl, rowName([10:-1:5, 1]), 'FontSize',14, 'Box','off');
  8. lgdHdl.Position = [.76,.11,.167,.27];
  9. lgdHdl.ItemTokenSize = [18,8];
复制代码


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


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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5

GMT+8, 2025-6-27 19:39 , Processed in 0.080993 second(s), 30 queries 手机版|qidao123.com技术社区-IT企服评测▪应用市场 ( 浙ICP备20004199 )|网站地图

快速回复 返回顶部 返回列表