为 x 轴上方的 y 值绘制不同的颜色

Plot in a different colors for y-values above x-axis

这里我用输入 a=3dx=0.1.

绘制了 ((2*x.^2+3*exp(-x) -(100*a)).*sin(5*x))./(6*x.^2-9*x-42)-10

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

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]);

问题是,这种方法留下了一些我不希望有的重叠。我该如何更改?

您可以创建两个数组:neg_x = x; neg_x (neg_x >0) = nan 使用 'r' 绘图,然后对正值执行相反的操作。但是,这将使您留下两个阵列之间的部分,即您的差距。您可以通过找到它们并将索引扩展一个来更正它们:

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 在绘图时会自动忽略这些条目,即留下一个很好的间隙,而不是一条直线。

结果: