在之前的文章中,复刻了《Nature》论文中的多组柱状图:
横向单组多色柱状图:
面积图:
以及单组多色柱状图:
这一期,我们来复刻《Nature》高清论文插图集Part1中第233号插图中图A的双轴折线面积填充图(以下简称233)。
先来看一下复刻效果:
特别提示:Nature论文插图复刻系列,旨在降低科研绘图的门槛,让大家不再觉得“顶级期刊里的论文插图对自己来说遥不可及”。如果觉得有用,不妨分享给你身边的人。
根据线与面的遮挡关系,可以大体将233拆分为3条折线与2个填充面,而2个填充面的上边缘与2条折线是重合的。画图时,需要注意5个对象的图层顺序。
此外,233是一个双坐标轴图像,而Matlab中似乎是将右轴对象覆盖于左轴对象之上,这就导致了右轴CRP蓝色填充面会遮挡掉大部分其它对象。所以,画图前需要进行一定的处理。
Matlab R2022a
Matlab科研绘图插件-ColorCopy配色方案提取工具
Matlab科研绘图插件-Fig2Data图片原始数据提取工具
此部分主要是提取233中的数据以及配色方案,以用于绘图。
首先,使用Fig2Data工具提取3条折线数据:
为了避免图形遮挡问题,本文将双轴绘图问题转化为单轴绘图,将右轴CRP对象缩放至左轴坐标系下,这样只需要在完成左轴绘制后添加右轴标记即可(由于本文目的为复刻,手段有一定限制,实际绘图时有更多选择)。
%% 数据准备
% 读取数据
load data1.mat
x = X;
WCC = Y2;
Lymphocyte = Y3;
CRP = Y1;
% 缩放
Scale = 10;
CRP = CRP/Scale;
然后,利用ColorCopy工具提取配色方案(本文顺序为蓝-黑-黄):
%% 颜色提取
C = ColorCopy;
close
首先,利用‘area’与‘line’命令绘制左轴的折线图与面积图,并对其坐标轴参数进行调整:
%% 左轴绘制
yyaxis left
% 面积图
area(X, CRP, 'FaceColor',C(1,:),'EdgeColor','none','FaceAlpha',1);
area(X, WCC, 'FaceColor',C(2,:),'EdgeColor','none','FaceAlpha',1);
% 线图
L2 = line(X, Lymphocyte,'linewidth',2,'color',C(3,:));
L3 = line(x, CRP,'linewidth',2,'color',C(1,:));
L1 = line(X, WCC,'linewidth',2,'color',C(2,:));
hXLabel = xlabel('Days Since 1st Positive RT-PCR for SARS-CoV-2',...
'VerticalAlignment','top',...
'FontWeight','bold');
hYLabel1 = ylabel('WCC/Lymphocyte x10^{3} ml^{3}', ...
'VerticalAlignment','bottom',...
'FontWeight','bold');
% 坐标轴参数调整
set(gca, 'LineWidth', 2,... % 线宽
'Box', 'off', ... % 边框
'XGrid', 'off', 'YGrid', 'off', ... % 网格线
'TickDir', 'out', 'TickLength', [.01 .01], ... % 刻度样式
'XMinorTick', 'off', 'YMinorTick', 'off', ... % 次刻度
'XColor', [.1 .1 .1], 'YColor', [.1 .1 .1],... % 坐标轴颜色
'XTick', 34:2:104,... % 刻度与范围
'XLim', [35.5 102.5],...
'XTickLabelRotation',90,...
'YTick', 0:10:40,...
'YLim', [0 40])
然后,添加右坐标轴元素:
%% 右轴绘制
yyaxis right
hYLabel2 = ylabel('CRP (mg/L)','rotation',270, ...
'VerticalAlignment','bottom',...
'FontWeight','bold');
% 坐标轴参数调整
set(gca, 'LineWidth', 2,... % 线宽
'Box', 'off', ... % 边框
'TickDir', 'out', 'TickLength', [.01 .01], ... % 刻度样式
'XColor', [.1 .1 .1], 'YColor', [.1 .1 .1],... % 坐标轴颜色
'YTick', 0:100:400,...
'YLim', [0 400],...
'FontWeight','bold')
再然后,对图例、字体字号、背景颜色等细节进行进一步的调整:
%% 细节调整
% legend
hLegend = legend([L1,L2,L3],...
'WCC','Lymphocyte','CRP',...
'Location', 'northoutside','Orientation','horizontal',...
'FontName', 'Arial', 'FontSize', 11,'FontWeight','normal');
legend('boxoff');
% 添加上框线
xc = get(gca,'XColor');
yc = get(gca,'YColor');
unit = get(gca,'units');
ax = axes( 'Units', unit,...
'Position',get(gca,'Position'),...
'XAxisLocation','top',...
'YAxisLocation','right',...
'Color','none',...
'XColor',xc,...
'YColor',yc);
set(ax, 'linewidth',2,...
'XTick', [],...
'YTick', []);
% 字体字号
set(gca, 'FontName', 'Arial', 'FontSize', 10)
set([hXLabel,hYLabel1,hYLabel2], 'FontName', 'Arial', 'FontSize', 12)
% 背景颜色
set(gcf,'Color',[1 1 1])
最后,按照所需分辨率输出图片:
%% 图片输出
figW = figureWidth;
figH = figureHeight;
set(figureHandle,'PaperUnits',figureUnits);
set(figureHandle,'PaperPosition',[0 0 figW figH]);
fileout = 'test';
print(figureHandle,[fileout,'.png'],'-r300','-dpng');
可以说还是很像的。
大家还想看我复刻哪张图,可以告诉我号码。
以上。
Nature5