MATLAB fill area between lines

后端 未结 4 1339
感动是毒
感动是毒 2020-12-18 15:01

I\'m trying to do something similar to what\'s outlined in this post: MATLAB, Filling in the area between two sets of data, lines in one figure but running into a roadblock.

相关标签:
4条回答
  • 2020-12-18 15:24

    It turned out to be a column vs row vector issue. For some reason using the fill method above with flipud with the original column vectors doesn't work, but transposing the original variables then using fliplr does. Go figure. Here's the code in case it helps someone else:

    x = linspace(0,100, 101);
    mean = torqueRnormMean(:,DOF)';
    meanPlusSTD = torqueRnormMean(:,DOF)' + torqueRnormStd(:,DOF)';
    meanMinusSTD = torqueRnormMean(:,DOF)' - torqueRnormStd(:,DOF)';
    fill( [x fliplr(x)],  [meanPlusSTD fliplr(meanMinusSTD)], 'k');
    alpha(.25);
    plot(x, mean, 'k', 'LineWidth', 2)
    plot(x, meanPlusSTD, 'k')
    plot(x, meanMinusSTD, 'k')
    

    Note that I removed the dotted line and just used thin vs. thick lines to denote standard deviation and mean. I did this because the line style was inconsistent. This code is in a loop where DOF runs from 1:9, and in some of the subplots both std curves would be dashed and in some just the top or bottom. It didn't matter enough to me to have them dashed so I kept it simple. Now this is an example of the graph I get:

    enter image description here

    0 讨论(0)
  • 2020-12-18 15:25

    You may be getting a problem with using mean as a variable, since it's also a reserved MATLAB command. Try clearing the variable space and then using a unique variable name.

    As for the second problem, you want

    fill( [x fliplr(x)],  [meanUniqueName fliplr(meanMinusSTD)], 'y', 'LineStyle','--');
    

    You also don't need to do this in two steps, but can do it all at once. A code snippet from a script I'm currently working on does the exact same thing and contains the lines:

        avar = allan(DATA, tau);
        xFill = [avar.tau1 fliplr(avar.tau1)];
        yFill = [avar.sig2+avar.sig2err fliplr(avar.sig2-avar.sig2err)];
    
        figure(2);
        fill(xFill,yFill,'y','LineStyle','--')
        line(avar.tau1,avar.sig2);
    

    So I fill the area between the two error lines, and then draw the data line on top.

    0 讨论(0)
  • 2020-12-18 15:43

    Another possibility:

    x = 1:1000; % example x values
    y_upper = 5+sin(2*pi/200*x); % example upper curve
    y_lower = 2+sin(2*pi/230*x); % example lower curve
    bar(x, y_upper, 1, 'b', 'edgecolor', 'b');
    hold on
    bar(x, y_lower, 1, 'w', 'edgecolor', 'w');
    axis([0 1000 0 7])
    

    It uses bar (with unit width and same-color edges) to fill the upper curve, and then a second bar to "remove" (plot in white) the lower part.

    enter image description here

    0 讨论(0)
  • 2020-12-18 15:50

    One thing that you appear to be doing wrong is that you're applying fliplr to column vectors. That will have no effect. The example you cited uses row vectors. You also concatenate them into a matrix instead of into a single vector like the example. I think that the equivalent with column vectors would be:

    fill( [x;flipud(x)],  [mean;flipud(meanMinusSTD)], 'y');
    
    0 讨论(0)
提交回复
热议问题