更改循环中绘图线的颜色

时间:2016-07-25 20:00:37

标签: matlab for-loop colors

我有一个关于在MATLAB中更改绘图中线条颜色的问题。我编写了一个代码,我想改变嵌入在几个for循环中的绘图中的线条颜色(代码如下所示)。在代码中,当" if循环"时,会创建一个新的图(有自己的图)。条件得到满足。我希望每个绘图都有不同颜色的线条(来自其他绘图),所以我创建了一个变量=" NewColor"增加和更改线条颜色。但是,出现了以下问题:

假设我处于调试模式并且我已停止在plot命令中。我运行下一步,用蓝线创建一个图。我检查NewColor的值,找到NewColor = 0.1。接下来,我使用" run to cursor"命令进入下一次激活绘图命令的步骤。当我这样做时,我仍然在" i for loop"中,因此NewColor没有改变。我检查编辑器,发现NewColor = 0.1。因此,当我运行下一步时,蓝线应显示在当前图上。相反,我不相信橙色线出现(除了蓝线)。我不明白,因为在调试器NewColor = 0.1的两个步骤中,代码被写入,因此行的颜色= [0,NewColor,0]。如果有人能找到我的方式的错误,将不胜感激。谢谢

ThetaPlot = [40,50];   % Put incident angle as input

Count1 = 0;
Count2 = 0;
NewColor = 0;

for m = 1:length(ThetaPlot)
    NewColor = 0.1;
    Title = sprintf('Angle(%d)',ThetaPlot(m));
    figure('name',Title)
    Count1 = 0;
    for i = 1:length(xrange)-1             % X Coordinate of Start Node
        for j = 1:length(yrange)-1         % Y Coordinate of Start Node
            Count1 = Count1+1;
            for k = 2:length(xrange)       % X Coordinate of End Node
                for l = 2:length(yrange)   % Y Coordinate of End Node
                    Count2 = Count2+1;
                    if ReflRayData(Count2,ThetaPlot(m) - ThetaIncident(1) + 1,Count1) == 1
                        x = [xrange(i),xrange(k)];
                        y = [yrange(j),yrange(l)];
                        plot(x,y,['-',[0,NewColor,0],'o']);
                        hold on;
                    end
                end
                Count2 = 0;
            end
        end
    end
    NewColor = NewColor + 0.02;
end

完整代码:

%% Calculating Angles of Reflection

run = 1; % Set run = 1 for calculations

if run == 1
    xrange = [0:1:14.5]';      % Coordinates to try for Panel Geometry (in)
    yrange = [0:1:36]';        % Coordinates to try for Panel Geometry (in)
    ThetaIncident = [-90:1:90]';     % Incident Angle of Ray (measured relative to normal direction with clockwise postive)
    OvenGlassXrange = [14.5:0.1:36.5]; %Range of X coordinates for Oven Glass

ReflRayData = zeros((length(xrange)-1)*(length(yrange)-1),length(ThetaIncident),(length(xrange)-1)*(length(yrange)-1));  % Matrix containing Reflected Ray Data

Count1 = 0;
Count2 = 0;
for i = 1:length(xrange)-1             % X Coordinate of Start Node
    for j = 1:length(yrange)-1         % Y Coordinate of Start Node
        Count1 = Count1+1;
        for k = 2:length(xrange)       % X Coordinate of End Node
            for l = 2:length(yrange)   % Y Coordinate of End Node
                Count2 = Count2+1;
                for m = 1:length(ThetaIncident)
                    xStart = xrange(i);
                    yStart = yrange(j);
                    xEnd = xrange(k);
                    yEnd = yrange(l);

                    m1 = (yEnd - yStart)/(xEnd - xStart);  % Slope between Start and End Nodes
                    b1 = yStart - m1*xStart;

                    m2 = 1/m1;                             % Slope of normal direction

                    b2 = (yEnd - 0.5*(yEnd - yStart)) - m2*(xEnd - 0.5*(xEnd - xStart));

                    ArbXCoor = 1;                          % Arbitary Point X Coordinate on Normal Line
                    ArbYCoor = m2*ArbXCoor+b2;             % Arbitary Point Y Coordinate on Normal Line

                    ThetaReflected = -ThetaIncident(m);       % Reflected Angle

                    ArbXCoorRot = ArbXCoor*cosd(ThetaReflected) - ArbYCoor*sind(ThetaReflected); % Arbitary Point X Coordinate on Reflected Line
                    ArbYCoorRot = ArbYCoor*cosd(ThetaReflected) + ArbXCoor*sind(ThetaReflected); % Arbitary Point Y Coordinate on Reflected Line

                    m3 = (ArbYCoorRot - (yEnd - 0.5*(yEnd - yStart)))/(ArbXCoorRot - (xEnd - 0.5*(xEnd - xStart))); % Slope of Reflected Line
                    b3 = (yEnd - 0.5*(yEnd - yStart)) - m3*(xEnd - 0.5*(xEnd - xStart));

                    ElemLength = sqrt((yEnd - yStart)^2 + (xEnd - xStart)^2);

                    if min(OvenGlassXrange) < -b3/m3 && -b3/m3 < max(OvenGlassXrange) && -1 < m1 && m1 < 0 && m1 ~= -Inf && m1 ~= Inf && ElemLength < 3
                        ReflRayData(Count2,m,Count1) = 1;
                    end 
                end
            end
        end
        Count2 = 0;
    end
end

%% Plotting

ThetaPlot = [40,50];   % Put incident angle as input

Count1 = 0;
Count2 = 0;
NewColor = 0;

for m = 1:length(ThetaPlot)
    NewColor = 0.1;
    Title = sprintf('Angle(%d)',ThetaPlot(m));
    figure('name',Title)
    Count1 = 0;
    for i = 1:length(xrange)-1             % X Coordinate of Start Node
        for j = 1:length(yrange)-1         % Y Coordinate of Start Node
            Count1 = Count1+1;
            for k = 2:length(xrange)       % X Coordinate of End Node
                hold on;
                for l = 2:length(yrange)   % Y Coordinate of End Node
                    Count2 = Count2+1;
                    if ReflRayData(Count2,ThetaPlot(m) - ThetaIncident(1) + 1,Count1) == 1
                        x = [xrange(i),xrange(k)];
                        y = [yrange(j),yrange(l)];
                        plot(x,y,['-',[0,NewColor,0],'o']);
                        hold on;
                    end
                end
                Count2 = 0;
            end
        end
    end
    NewColor = NewColor + 0.02;
end

2 个答案:

答案 0 :(得分:1)

而不是plot(x,y,['-',[0,NewColor,0],'o']);尝试:

plot(x,y,'linestyle','-','marker','o','color',[0,NewColor,0])

答案 1 :(得分:-1)

根据Matlab文档,通过调用hold on Matlab使用下一种颜色。

  

保持当前轴上的保留图,以便添加到轴的新图不会删除现有图。新图使用基于轴的ColorOrder和LineStyleOrder属性的下一种颜色和线条样式。

因此,当您在hold on内拨打for时,在您的代码中,它只会使用下一种颜色。

我的解决方案是在figure; hold on;循环之前放置for并在循环中删除那个