如何创建"技能偏见图" (气象)?

时间:2016-09-26 04:49:25

标签: matlab plot graph matlab-figure

在我的研究领域(气象学)中,通常会生成图表中的图表。

False Alarm Ratio Graph

有关它的更多信息可以是found here

这些行中的每一行都联系了具有以下内容的数据点:

  1. x值,介于0和1之间(大于1的值不应在图表中表示)。
  2. y值,介于0和1之间。
  3. PSS值,介于1和-1之间。
  4. 频率偏差值,范围从0到+∞,但不显示高于4的值。
  5. 虚警率(FAR)值,范围从0.0到0.9。对于任何给定行上的每个数据点,虚警率保持恒定在特定值。
  6. 编辑:为了使事情变得具体,我在图表上画了一个粉红点。该点代表数据点,其中x = 0.81,y = 0.61,PSS = -0.2,B = 3.05,FAR = 0.8。

    我试图在MATLAB中重现类似的东西。谷歌搜索出现了许多答案,如this,其中包含插图而非我正在寻找的内容。

    我将数据组织在一个3D数组中,每个页面指的是不同级别的误报率。 FAR为0.8的页面(数据here)就像这样开始

    First four lines of data matrix

    然后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
    

1 个答案:

答案 0 :(得分:3)

我想我得到了你想要的东西,但在你看下面的代码之前,请注意以下几点:

  1. 我不需要链接中的任何功能(我不知道他们做了什么)。
  2. 我也没有真正使用数据中的xy列,它们是PSSB的冗余坐标。
  3. 我将您数据中的所有“页面”汇总到一个长表(FAR下方),其中包含5列(FAR,x,y,PSS,FB)。
  4. 如果仔细查看数据,您会看到图中应该着色的某些区域没有任何表示(即没有值)。因此,为了将颜色插入到那里,我们需要添加角落:

    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
    

    结果如下:

    FAR

    获取标签位置

    如果你想知道获取变量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具有标签的位置,就像我上面使用它一样。