代码之家  ›  专栏  ›  技术社区  ›  Y.C.

以不同颜色打印x轴上方的y值

  •  0
  • Y.C.  · 技术社区  · 2 年前

    我在这里策划 ((2*x.^2+3*exp(-x) -(100*a)).*sin(5*x))./(6*x.^2-9*x-42)-10 输入 a=3 , dx=0.1 .

    我想用蓝色绘制所有正y值,用红色绘制所有负y值:

    enter image description here

    a = input('Please input a: ');
    dx = input('Input step size dx: ');
    if dx<0
       fprintf('dx must be a non-negative number.');
       while(dx<0)
           dx = input('Input step size dx: ');
       end
    end
    clf;
    x = -10:dx:10;
    y = ((2*x.^2+3*exp(-x) -(100*a)).*sin(5*x))./(6*x.^2-9*x-42)-10
    
    plot(x,y)
    ylim([-100,100])
    

    为了用蓝色绘制正y值,用红色绘制负y值,我尝试了初始化正y值及其域的向量,初始化负y值及其域的向量。

    s = size(y);
    x_1 = [];
    x_2 = []; %negative
    y_1 = [];
    y_2 = []; %negative
    for i = 1:s(2)
        if(y(i) >0)
            x_1 = [x_1,x(i)];
            y_1 = [y_1,y(i)];
        elseif (y(i) <0)
            x_2 = [x_2,x(i)];
            y_2 = [y_2,y(i)];
        end
    end
    
    s_x1 = size(x_1);
    s_x1_lim = s_x1(2);
    s_x2 = size(x_2);
    s_x2_lim = s_x2(2);
    
    plot(x_1,y_1,'b');
    xlim([x_1(1), s_x1_lim]);
    hold on
    plot(x_2,y_2,'r');
    xlim([x_2(1), s_x2_lim]);
    hold on;
    xlim([-10,10])
    ylim([-100,100]);
    

    问题是,这种方法会留下一些我不希望有的重叠。我怎样才能改变这个?

    enter image description here

    1 回复  |  直到 2 年前
        1
  •  2
  •   Adriaan Decoder    2 年前

    您可以制作两个阵列: neg_x = x; neg_x (neg_x >0) = nan 使用 'r' 而正值则相反。然而,这将留下两个阵列之间的片段,即您的间隙。您可以通过查找它们并将索引扩展1来更正它们:

    x = 0:0.1:6*pi;
    y = sin(x);
    neg_y = y; neg_y (neg_y>0) = nan;
    tmp_y = isnan(neg_y);
    idx = find(diff(tmp_y)==1);  % find gaps
    neg_y(idx+1) = y(idx+1);  % correct gaps
    idx = find(diff(tmp_y)==-1);
    neg_y(idx) = y(idx);
    
    pos_y = y; pos_y (pos_y<0) = nan;
    plot(x, neg_y,'r');
    hold on;
    plot(x,pos_y,'b')
    
    

    使用 nan 这里有一点帮助,因为MATLAB在绘图时会自动忽略这些条目,即留下一个很好的间隙,而不是一条直线。

    结果如下:

    enter image description here