MATLAB | 泰勒图绘制,支持各种角度范围

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

该工具可在 gitee 仓库或者 fileexchange 仓库下载:

gitee

fileexchange

工具使用

基本使用

通过 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获取工具函数及案例完整代码:

gitee

fileexchange

相关推荐
mct1231 小时前
c++ iconv 字符utf-8转换gb2312失败
开发语言·c++
Marst Code3 小时前
Python 3.9 已停止维护!从 3.9 到 3.14 全版本深度对比,生产环境该选哪个?
开发语言·python
ZJH__GO3 小时前
网络编程v2--多客户端互通
java·运维·服务器·开发语言·计算机网络
万岳科技系统开发4 小时前
智慧医院小程序开发推动医疗服务流程全面线上化
大数据·开发语言·人工智能
一只小灿灿4 小时前
C++ 修饰符全面详解
开发语言·c++
马里马里奥-4 小时前
从零搭建AI Agent工具链的技术文章大纲
开发语言·qt
不做Java程序猿好多年4 小时前
Java中 String、StringBuffer、StringBuilder 的区别详解
开发语言·python
会周易的程序员5 小时前
js-shm: 高性能 Node.js 共享内存模块
开发语言·javascript·c++·node.js·共享内存·shm
笨蛋不要掉眼泪5 小时前
Java虚拟机:常用参数
java·开发语言·python