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