在我的研究领域(气象学)中,通常会生成图表中的图表。
有关它的更多信息可以是found here。
这些行中的每一行都联系了具有以下内容的数据点:
我试图在MATLAB中重现类似的东西。谷歌搜索出现了许多答案,如this,其中包含插图而非我正在寻找的内容。
我将数据组织在一个3D数组中,每个页面指的是不同级别的误报率。 FAR为0.8的页面(数据here)就像这样开始
然后3D阵列上的其他页面专门用于0.7,0.6等的FAR。
问题
1.甚至可以在MATLAB中创建这样的图形吗?
2.如果是,我应该使用什么功能,我应该采取什么方法?编辑:我有工作代码(下面)使用线性plot
函数创建一个有点相似的数字,但此函数的文档并未指示任何方式在另一个图形中插入图形。我不确定这段代码有多大帮助,但已将其插入以响应downvoter。
H = [0:0.01:1];
figure; hold on
fill([0 1 1],[0 0 1],[0 0.2 0.4]) % Deep blue
fill([0 1 0],[0 1 1],[0.4 0 0]) % Purple
low_colours = {[0 0.501 1],[0 0.8 0.4], [0.4 0.8 0], [0.8 0.8 0]};
high_colours = {[0.6 0 0],[0.8 0 0], [1 0.5019 0], [0.988 0.827 0.196]};
colour_counter = 0;
for ii = -0.8:0.2:0
colour_counter = colour_counter + 1;
if colour_counter < 5
colour_now = low_colours{colour_counter};
end
ORSS = ones(1,size(H,2))*ii;
F = (H .* (1-ORSS)) ./ ((1-2.*H) .* ORSS + 1);
plot(F,H)
fill(F,H,colour_now);
end
colour_counter = 0;
for ii = 0.8:-0.2:0
colour_counter = colour_counter + 1;
if colour_counter < 5
colour_now = high_colours{colour_counter};
end
ORSS = ones(1,size(H,2))*ii;
F = (H .* (1-ORSS)) ./ ((1-2.*H) .* ORSS + 1);
plot(F,H)
fill(F,H,colour_now);
end
答案 0 :(得分:3)
我想我得到了你想要的东西,但在你看下面的代码之前,请注意以下几点:
x
和y
列,它们是PSS
和B
的冗余坐标。FAR
下方),其中包含5列(FAR,x,y,PSS,FB
)。如果仔细查看数据,您会看到图中应该着色的某些区域没有任何表示(即没有值)。因此,为了将颜色插入到那里,我们需要添加角落:
FAR{end+1,:} = [0.8 0 0 0 4];
FAR{end+1,:} = [0.9 0 0 -0.66 3.33];
FAR{end+1,:} = [1 0 0 0 0];
FAR{end+1,:} = [1 0 0 -1 3];
接下来,该过程分为两部分。首先,我们为每个变量创建一个矩阵,按照相应的FAR
值按列排序,例如,在PSS
矩阵中,第一列是FAR为0的所有PSS值,第二列是FAR为0.1的所有PSS值,依此类推。我们为FAR(F
),PSS和FreqBias(B
)制作了这样的矩阵,我们用NaN初始化它们,这样我们就可以得到具有不同数值的列:
F = nan(max(histcounts(FAR.FAR,10)),10);
PSS = F;
B = F;
c = 1;
f = unique(FAR.FAR).';
for k = f
valid = FAR.FAR==k & FAR.x<=1;
B(1:sum(valid),c) = FAR.FB(valid);
B(sum(valid):end,c) = B(sum(valid),c);
PSS(1:sum(valid),c) = FAR.PSS(valid);
PSS(sum(valid):end,c) = PSS(sum(valid),c);
F(:,c) = k;
c = c+1;
end
然后我们设置colormap的颜色(我部分从你那里拿走),并设置标签位置:
colors = [0 0.2 0.4
0 0.501 1;
0 0.8 0.4;
0.4 0.8 0;
0.8 0.8 0;
0.988 0.827 0.196;
1 0.5019 0;
0.8 0 0;
0.6 0 0.2;
0.4 0.1 0.5];
label_pos =[0.89 0.77
1.01 0.74
1.14 0.69
1.37 0.64
1.7 0.57
2.03 0.41
2.65 0.18
2.925 -0.195
2.75 -0.55];
我们使用contourf
将所有内容绘制在一起,并设置所有类型的属性以使其看起来很好:
[C,h] = contourf(B,PSS,F);
xlim([0 4])
ylim([-1 1])
colormap(colors)
caxis([0 1])
xlabel('Frequency Bias B')
ylabel('Pierce Skill Score PSS')
title('False Alarm Ratio')
ax = h.Parent;
ax.XTick = 0:4;
ax.YTick = -1:0.5:1;
ax.FontSize = 20;
for k = 1:numel(f)-2
text(label_pos(k,1),label_pos(k,2),num2str(f(k+1)),...
'FontSize',12+k)
end
结果如下:
获取标签位置
如果你想知道获取变量label_pos
的快捷方法是什么,那么我就是这样做的......
您在没有最后for
循环的情况下运行上面的代码。然后运行以下代码:
clabel(C,'manual')
f = gcf;
label_pos = zeros(numel(f.Children.Children)-1,2);
for k = 1:2:size(label_pos,1)
label_pos(k,:) = f.Children.Children(k).Position(1:2);
end
label_pos(2:2:size(label_pos,1),:) = [];
在第一行之后,脚本将暂停,您将在命令窗口中看到此消息:
仔细选择轮廓以进行标记。 完成后,在“图形”窗口为活动窗口时按RETURN。
单击要添加标签的图,然后按 Enter 。
而已!现在,变量label_pos
具有标签的位置,就像我上面使用它一样。