为 x 轴上方的 y 值绘制不同的颜色
Plot in a different colors for y-values above x-axis
这里我用输入 a=3
、dx=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 在绘图时会自动忽略这些条目,即留下一个很好的间隙,而不是一条直线。
结果:
这里我用输入 a=3
、dx=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 在绘图时会自动忽略这些条目,即留下一个很好的间隙,而不是一条直线。
结果: