泰勒图是巧妙利用统计量之间的关系,将相关性(COR)、标准差(STD)和均方根误差(RMSE)统一到一张二维图中的工具:各个统计量的关系如下:

该工具可在 gitee 仓库或者 fileexchange 仓库下载:
gitee
fileexchange
- https://www.mathworks.com/matlabcentral/fileexchange/130889-taylor-diagram-class-customizable-sector
工具使用
基本使用
通过 SStats 函数将列向量数据转化为泰勒图需要的格式:
matlab
STATS = SStats(Data);
使用 STaylorAxes 函数创建泰勒图坐标区域:
matlab
tax = STaylorAxes(STATS)
使用 SPlot 代替 plot, SText 代替 text ... 在坐标区域绘图:
- tax.SScatter(STD, RMSD, COR, ___); 散点
- tax.SPlot(STD, RMSD, COR, ___); 折线
- tax.SFill(STD, RMSD, COR, ___); 填充区域
- tax.SText(STD, RMSD, COR, ___); 文本标签
给个例子:
matlab
D = load('testData.mat');
Data = D.Data;
NameList = {'AAA','BBB','CCC','DDD','EEE','FFF'};
% Calculate STD RMSD and COR (计算标准差、中心均方根误差、相关系数)
STATS = SStats(Data);
% Create taylor axes (生成泰勒图坐标区域)
figure('Units','normalized', 'Position',[.2, .1, .52, .72]);
tax = STaylorAxes(STATS);
% Color list and marker type (颜色列表与标记类型)
CList = [145,81,155; 217,34,30; 68,127,183; 76,181,75; 145,81,155; 248,130,7]./255;
MType = {'o', 'diamond', 'pentagram', '^', 'v', 'square'};
% scatter (绘制散点图)
for i = 1:size(Data, 2)
tax.SScatter(STATS(1,i), STATS(2,i), STATS(3,i), 200, CList(i,:), 'filled', 'Marker',MType{i})
end
% Legend (图例)
legend(NameList, 'FontSize',13, 'FontName','Times New Roman')

范围设置
若是有数据与基准数据(第一列数据)负相关,则绘图函数会自动扩展角度范围,同时也可以在构建泰勒图坐标区域时手动设定范围。
matlab
clc; clear
D = load('testData.mat');
Data = D.DataNegCorr;
NameList = compose('C%d', 1:10);
% Calculate STD RMSD and COR (计算标准差、中心均方根误差、相关系数)
STATS = SStats(Data);
% Create taylor axes (生成泰勒图坐标区域)
figure('Units','normalized','Position',[.1, .1, .82, .72]);
tax = STaylorAxes(STATS, 'CLim',[-.7, 1]);
% scatter (绘制散点图)
tax.SScatter(STATS(1,:), STATS(2,:), STATS(3,:), 270, 'k', 'filled')
% Format the text to appear at the upper-right of the data points.
% 构造如下的格式让文本出现在点的右上方
% {' ', name;
% ' '}
NameList = cellfun(@(s) {[' ', s], ''}, NameList, 'UniformOutput', false);
tax.SText(STATS(1,:), STATS(2,:), STATS(3,:), NameList, 'FontSize',15, 'FontName','Times New Roman')


坐标区外观属性设置
matlab
D = load('testData.mat');
Data = D.Data;
STATS = SStats(Data);
% Create taylor axes (生成泰勒图坐标区域)
figure('Units','normalized', 'Position',[.2, .1, .52, .72]);
tax = STaylorAxes(STATS, 'TickDir','out');
% scatter (绘制散点图)
tax.SScatter(STATS(1,:), STATS(2,:), STATS(3,:), 300, 'k','filled', 'CData',lines(size(Data, 2)))
tax.SText(STATS(1,1), STATS(2,1), STATS(3,1), {'Reference';' ';' '}, 'FontWeight','bold', ...
'FontSize',20, 'FontName','Times New Roman', 'Color','k', 'HorizontalAlignment','center')
% Set base properties (设置基础属性)
tax.set('TickLength',[.03, .01], ...
'SLim',[0, 300], ...
'RLim',[0, 175], ...
'CLim',[.3, 1], ...
'STickValues',0:100:300, ...
'SMinorTickValues',0:20:300, ...
'RTickValues',0:50:150, ...
'CTickValues',[.1,.2,.3,.4,.5,.6,.7,.8,.9,.95,.99])
% Set Grid (修饰各个网格)
tax.set('SGrid', 'Color',[.80,.00,.00], 'LineWidth',0.8, ...
'RGrid', 'Color',[.77,.60,.18], 'LineWidth',1.5, ...
'CGrid', 'Color',[.00,.00,.80], 'LineWidth',0.8, 'LineStyle',':');
% Set Label and Tick Label (修饰标签及刻度标签)
tax.set('SLabel', 'Color',[.8,0,0], 'FontWeight','bold', ...
'CLabel', 'Color',[0,0,.8], 'FontWeight','bold', ...
'STickLabel', 'Color',[.80,.00,.00], 'FontWeight','bold', 'FontSize',15, ...
'RTickLabel', 'Color',[.77,.60,.18], 'FontWeight','bold', 'FontSize',15, ...
'CTickLabel', 'Color',[.00,.00,.80], 'FontWeight','bold', 'FontSize',15);
% Set Axis, Tick and MinorTick (修饰轴、刻度、及次刻度)
tax.set('SAxis', 'Color',[.8,0,0], 'LineWidth',3, ...
'CAxis', 'Color',[0,0,.8], 'LineWidth',3, ...
'STick', 'Color',[.8,0,0], 'LineWidth',2, ...
'CTick', 'Color',[0,0,.8], 'LineWidth',2, ...
'SMinorTick', 'Color',[.8,0,0], 'LineWidth',1, ...
'CMinorTick', 'Color',[0,0,.8], 'LineWidth',1)

多图拼接案例一
matlab
rng(1)
% Generate four random datasets (生成四组随机数据)
Data1 = randn(100, 6).*.2 + [(linspace(-1,.5,100)').*ones(1, 2), (linspace(-.5,.7,100)').*ones(1, 2), (linspace(-.9,.2,100)').*ones(1, 2)];
Data2 = randn(100, 6).*.2 + [(linspace(-1,.5,100)').*ones(1, 2), (linspace(-.5,.7,100)').*ones(1, 2), (linspace(-.9,.2,100)').*ones(1, 2)];
Data3 = randn(100, 6).*.2 + [(linspace(-1,.5,100)').*ones(1, 2), (linspace(-.5,.7,100)').*ones(1, 2), (linspace(-.9,.2,100)').*ones(1, 2)];
Data4 = randn(100, 6).*.2 + [(linspace(-1,.5,100)').*ones(1, 2), (linspace(-.5,.7,100)').*ones(1, 2), (linspace(-.9,.2,100)').*ones(1, 2)];
STATS1 = SStats(Data1); STATS2 = SStats(Data2);
STATS3 = SStats(Data3); STATS4 = SStats(Data4);
fig = figure('Units','normalized', 'Position',[.2,.058,.645,.88]);
bkgAx = axes(fig, 'Position',[.13,.11,.67,.88], 'XTick',[], 'YTick',[], 'Box','on',...
'Color',[253,228,203]./255, 'XLim',[0,100], 'YLim',[0,88], 'NextPlot','add', 'LineWidth',1);
plot(bkgAx, [50,50], [0,88], 'Color','k', 'LineWidth',.8)
text(bkgAx, [25,75,25,75], [86,86,42,42], {'Spring','Summer', 'Autumn','Winter'}, ...
'FontSize',16, 'FontName','Times New Roman', 'HorizontalAlignment','center')
set(bkgAx.XLabel, 'String','Standard Deviation (mm month^{-1})', ...
'FontSize',18, 'FontName','Times New Roman', 'Position',[50,-3,-1])
set(bkgAx.YLabel, 'String','Standard Deviation (mm month^{-1})', ...
'FontSize',18, 'FontName','Times New Roman', 'Position',[-7,44,-1])
ax1 = axes(fig, 'Position',[ .13,.55,.335,.4]);
ax2 = axes(fig, 'Position',[.465,.55,.335,.4]);
ax3 = axes(fig, 'Position',[ .13,.11,.335,.4]);
ax4 = axes(fig, 'Position',[.465,.11,.335,.4]);
%% Create taylor axes (生成泰勒图坐标区域)
propS = {'SLabel', 'Color','none', 'RGrid', 'Color',[.77,.6,.18], 'LineWidth',1.2, ...
'RTickLabel', 'Color',[.77,.6,.18], 'FontWeight','bold', 'CLabel', 'FontSize',15};
propA = {'Box','on', 'XTick',[], 'YTick',[], 'XColor','k', 'YColor','k', 'LineWidth',1};
TA1 = STaylorAxes(ax1, STATS1);
TA1.set(propS{:}); set(ax1, 'XLim',TA1.SLim.*1.13, 'YLim',TA1.SLim.*1.15, propA{:});
set(TA1.STickLabel(1:length(TA1.STickValues)), 'Color','none')
TA2 = STaylorAxes(ax2, STATS2);
TA2.set(propS{:}); set(ax2, 'XLim',TA2.SLim.*1.13, 'YLim',TA2.SLim.*1.15, propA{:});
set(TA2.STickLabel(1:length(TA2.STickValues)), 'Color','none')
TA3 = STaylorAxes(ax3, STATS3);
TA3.set(propS{:}); set(ax3, 'XLim',TA3.SLim.*1.13, 'YLim',TA3.SLim.*1.15, propA{:});
TA4 = STaylorAxes(ax4, STATS4);
TA4.set(propS{:}); set(ax4, 'XLim',TA4.SLim.*1.13, 'YLim',TA4.SLim.*1.15, propA{:});
%% Scatter (绘制散点图)
CList = [145,81,155; 217,34,30; 68,127,183; 76,181,75; 145,81,155; 248,130,7]./255;
pltHdl = gobjects(1, size(Data1,2));
for i = 1:size(Data1,2)
TA1.SPlot(STATS1(1,i), STATS1(2,i), STATS1(3,i), 'o', 'MarkerSize',10, 'Color',CList(i,:), 'MarkerFaceColor',CList(i,:));
TA2.SPlot(STATS2(1,i), STATS2(2,i), STATS2(3,i), 'o', 'MarkerSize',10, 'Color',CList(i,:), 'MarkerFaceColor',CList(i,:));
TA3.SPlot(STATS3(1,i), STATS3(2,i), STATS3(3,i), 'o', 'MarkerSize',10, 'Color',CList(i,:), 'MarkerFaceColor',CList(i,:));
pltHdl(i) = ...
TA4.SPlot(STATS4(1,i), STATS4(2,i), STATS4(3,i), 'o', 'MarkerSize',10, 'Color',CList(i,:), 'MarkerFaceColor',CList(i,:));
end
%% Annotation
propO = {'FontSize',15, 'FontName','Times New Roman', 'FontWeight','bold', ...
'Color',CList(1,:), 'VerticalAlignment','bottom', 'HorizontalAlignment','center'};
propR = {'FontSize',15, 'FontName','Times New Roman', 'FontWeight','bold', ...
'Color',[.77,.6,.18], 'VerticalAlignment','top', 'HorizontalAlignment','right'};
TA1.SText(STATS1(1,1), STATS1(2,1), STATS1(3,1), {'observed';''}, propO{:});
TA2.SText(STATS2(1,1), STATS2(2,1), STATS2(3,1), {'observed';''}, propO{:});
TA3.SText(STATS3(1,1), STATS3(2,1), STATS3(3,1), {'observed';''}, propO{:});
TA4.SText(STATS4(1,1), STATS4(2,1), STATS4(3,1), {'observed';''}, propO{:});
text(ax1, TA1.SLim(2).*1.1, TA1.SLim(2).*1.12, 'RMS error', propR{:})
text(ax2, TA2.SLim(2).*1.1, TA2.SLim(2).*1.12, 'RMS error', propR{:})
text(ax3, TA3.SLim(2).*1.1, TA3.SLim(2).*1.12, 'RMS error', propR{:})
text(ax4, TA4.SLim(2).*1.1, TA4.SLim(2).*1.12, 'RMS error', propR{:})
%% legend
lgdHdl = legend(ax4, pltHdl(2:end), {'# 1 1/x','# 2 e\^-x(x/0.1\^2)','# 3 e\^-x(x/0.5\^2)','# 4 e\^-x(x/0.2\^2)','# 5 e\^-x(x/0.25\^2)'},...
'Position',[.825,.47,0.15,0.2], 'FontSize',15, 'FontName','Times New Roman', 'Box','off');
set(lgdHdl.Title, 'String','Weighting Scheme', 'FontSize',17, 'FontName','Times New Roman');

多图拼接案例二
matlab
rng(1)
% Generate four random datasets (生成四组随机数据)
Data1 = randn(100, 6).*.2 + [(linspace(-1,.5,100)').*ones(1, 2), (linspace(-.5,.7,100)').*ones(1, 2), (linspace(-.9,.2,100)').*ones(1, 2)];
Data2 = randn(100, 6).*.2 + [(linspace(-1,.5,100)').*ones(1, 2), (linspace(-.5,.7,100)').*ones(1, 2), (linspace(-.9,.2,100)').*ones(1, 2)];
Data3 = randn(100, 6).*.2 + [(linspace(-1,.5,100)').*ones(1, 2), (linspace(-.5,.7,100)').*ones(1, 2), (linspace(-.9,.2,100)').*ones(1, 2)];
Data4 = randn(100, 6).*.2 + [(linspace(-1,.5,100)').*ones(1, 2), (linspace(-.5,.7,100)').*ones(1, 2), (linspace(-.9,.2,100)').*ones(1, 2)];
STATS1 = SStats(Data1); STATS2 = SStats(Data2);
STATS3 = SStats(Data3); STATS4 = SStats(Data4);
fig = figure('Units','normalized', 'Position',[.1,.058,.8,.88]);
bkgAx = axes(fig, 'Position',[.13,.11,.67,.88], 'XLim',[0,100], 'YLim',[0,88], 'NextPlot','add', 'XColor','none', 'YColor','none');
text(bkgAx, [25,75,25,75] - 23, [86,86,42,42], {'a.','b.','c.','d.'}, 'FontSize',25, 'FontName','Times New Roman', 'HorizontalAlignment','center')
text(bkgAx, -5, 44, 'Standard Deviation (mm month^{-1})', 'FontSize',20, 'FontName','Times New Roman', 'HorizontalAlignment','center', 'Rotation',90)
text(bkgAx, 50, -6, 'Standard Deviation (mm month^{-1})', 'FontSize',20, 'FontName','Times New Roman', 'HorizontalAlignment','center')
ax1 = axes(fig, 'Position',[ .13,.55,.335,.4]);
ax2 = axes(fig, 'Position',[.465,.55,.335,.4]);
ax3 = axes(fig, 'Position',[ .13,.11,.335,.4]);
ax4 = axes(fig, 'Position',[.465,.11,.335,.4]);
%% Create taylor axes (生成泰勒图坐标区域)
propS = {'SLabel', 'Color','none', 'RGrid', 'Color',[.77,.6,.18], 'LineWidth',1.2, ...
'RTickLabel', 'Color',[.77,.6,.18], 'FontWeight','bold', 'CLabel', 'FontSize',15};
propA = {'Box','on', 'XTick',[], 'YTick',[], 'XColor','k', 'YColor','k', 'LineWidth',1};
TA1 = STaylorAxes(ax1, STATS1);
TA1.set(propS{:}); set(ax1, 'XLim',TA1.SLim.*1.13, 'YLim',TA1.SLim.*1.15, propA{:});
set(TA1.STickLabel(1:length(TA1.STickValues)), 'Color','none')
TA2 = STaylorAxes(ax2, STATS2);
TA2.set(propS{:}); set(ax2, 'XLim',TA2.SLim.*1.13, 'YLim',TA2.SLim.*1.15, propA{:});
set(TA2.STickLabel(1:length(TA2.STickValues)), 'Color','none')
TA3 = STaylorAxes(ax3, STATS3);
TA3.set(propS{:}); set(ax3, 'XLim',TA3.SLim.*1.13, 'YLim',TA3.SLim.*1.15, propA{:});
TA4 = STaylorAxes(ax4, STATS4);
TA4.set(propS{:}); set(ax4, 'XLim',TA4.SLim.*1.13, 'YLim',TA4.SLim.*1.15, propA{:});
%% Scatter (绘制散点图)
CList = [145,81,155; 217,34,30; 68,127,183; 76,181,75; 145,81,155; 248,130,7]./255;
pltHdl = gobjects(1, size(Data1,2));
for i = 1:size(Data1,2)
TA1.SPlot(STATS1(1,i), STATS1(2,i), STATS1(3,i), 'o', 'MarkerSize',10, 'Color',CList(i,:), 'MarkerFaceColor',CList(i,:));
TA2.SPlot(STATS2(1,i), STATS2(2,i), STATS2(3,i), 'o', 'MarkerSize',10, 'Color',CList(i,:), 'MarkerFaceColor',CList(i,:));
TA3.SPlot(STATS3(1,i), STATS3(2,i), STATS3(3,i), 'o', 'MarkerSize',10, 'Color',CList(i,:), 'MarkerFaceColor',CList(i,:));
TA4.SPlot(STATS4(1,i), STATS4(2,i), STATS4(3,i), 'o', 'MarkerSize',10, 'Color',CList(i,:), 'MarkerFaceColor',CList(i,:));
end
%% Annotation
propR = {'FontSize',17, 'FontName','Times New Roman', 'FontWeight','bold', ...
'Color',[.77,.6,.18], 'VerticalAlignment','top', 'HorizontalAlignment','right'};
text(ax1, TA1.SLim(2).*1.1, TA1.SLim(2).*1.12, 'RMS error', propR{:})
text(ax2, TA2.SLim(2).*1.1, TA2.SLim(2).*1.12, 'RMS error', propR{:})
text(ax3, TA3.SLim(2).*1.1, TA3.SLim(2).*1.12, 'RMS error', propR{:})
text(ax4, TA4.SLim(2).*1.1, TA4.SLim(2).*1.12, 'RMS error', propR{:})
%% legend
lgdHdl = legend(ax4, {'observed', '# 1 1/x','# 2 e\^-x(x/0.1\^2)','# 3 e\^-x(x/0.5\^2)','# 4 e\^-x(x/0.2\^2)','# 5 e\^-x(x/0.25\^2)'},...
'Position',[.78,.47,0.15,0.2], 'FontSize',15, 'FontName','Times New Roman', 'Box','off');
set(lgdHdl.Title, 'String','Weighting Scheme', 'FontSize',17, 'FontName','Times New Roman');

colormap
matlab
D = load('testData.mat');
Data = D.DataNegCorr;
% Calculate STD RMSD and COR (计算标准差、中心均方根误差、相关系数)
STATS = SStats(Data);
% Create taylor axes (生成泰勒图坐标区域)
figure('Units','normalized','Position',[.1, .1, .82, .72]);
tax = STaylorAxes(STATS);
% scatter (绘制散点图)
tax.SScatter(STATS(1,:), STATS(2,:), STATS(3,:), 270, 'k', 'filled', 'CData',STATS(3,:))
colormap(turbo)
cb = colorbar('Location','eastoutside');
cb.Position(1) = cb.Position(1) + .05;

结
工具函数过长,且发在这不容易实时更新,因此还是建议去gitee仓库或者fileexchange获取工具函数及案例完整代码: