MATLAB:指定点的颜色时,图例不匹配

Posted

技术标签:

【中文标题】MATLAB:指定点的颜色时,图例不匹配【英文标题】:MATLAB: When specifying the color of points, legend does not match 【发布时间】:2020-11-08 08:58:17 【问题描述】:

我正在使用 MATLAB R2017b。

这部分代码正在生成要绘制的数据:

% Parameters 
cE = 0.1;      
cs = 0.1;      
a0 = 0.5;      
a  = 0.5;      
L= 0.1;         
b=1
% Parameter in inspection
eStart=0.0;   %inicial value of parameter
eStep=0.01;   %how far apart is each value
eEnd=1;       %Final value of parameter
e = eStart:eStep:eEnd; %Array containing all parameters
nPoints = length(e); %number of parameter values used
T=700;              % time interval
transientCut = 500; %indicates the cut to avoid seeing transient
                    % points (points before reach equilibtium);
                    %thus as transientCut increases the graph will start to
                    %show points that did not reach equilibrium yet
%setting the matrix that will save the time series for each value of parameter used
XIR=zeros(nPoints,T); 
XiR=zeros(nPoints,T); 
XIr=zeros(nPoints,T); 
Xir=zeros(nPoints,T); 
for k=1:nPoints        %outer loop gives the condition in which the eValues
                       % will be accesed
                    
    xiR =0.5 %IC
    xIr =0.20 %IC
    xir = 0.3 %IC
    xIR= 1-xiR-xIr-xir; 
    for t=1:T
        %Difference equation
        xIR=(xIR*(1 + (a0 + a*(L*xIr + xIR))*(-cE - cs + (1 - xir - xIr + (xir + xIr)*e(k))^b)))/(xiR + xIr + xIR - cE*xiR*(a0 + a*(L*xIr + xIR)) - (cE + cs)*(a0*(xIr + xIR) + a*xIR*(L*xIr + xIR)) + xir*(1 - a0*cE + (a0 + a*(L*xIr + xIR))*((-1 + xir + xIr)*(-1 + e(k)))^b) + xIr*(a0 + a*(L*xIr + xIR))*((-1 + xir + xIr)*(-1 + e(k)))^b + a0*(xir + xIr)*e(k)^b + (xiR + xIR)*(a0 + a*(L*xIr + xIR))*(1 - xir - xIr + (xir + xIr)*e(k))^b);
        xiR=(xiR + xiR*(a0 + a*(L*xIr + xIR))*(-cE + (1 - xir - xIr + (xir + xIr)*e(k))^b))/(xiR + xIr + xIR - cE*xiR*(a0 + a*(L*xIr + xIR)) - (cE + cs)*(a0*(xIr + xIR) + a*xIR*(L*xIr + xIR)) + xir*(1 - a0*cE + (a0 + a*(L*xIr + xIR))*((-1 + xir + xIr)*(-1 + e(k)))^b) + xIr*(a0 + a*(L*xIr + xIR))*((-1 + xir + xIr)*(-1 + e(k)))^b + a0*(xir + xIr)*e(k)^b + (xiR + xIR)*(a0 + a*(L*xIr + xIR))*(1 - xir - xIr + (xir + xIr)*e(k))^b); 
        xIr=(xIr*(1 - a0*(cE + cs) + (a0 + a*(L*xIr + xIR))*((-1 + xir + xIr)*(-1 + e(k)))^b + a0*e(k)^b))/(xiR + xIr + xIR - cE*xiR*(a0 + a*(L*xIr + xIR)) - (cE + cs)*(a0*(xIr + xIR) + a*xIR*(L*xIr + xIR)) + xir*(1 - a0*cE + (a0 + a*(L*xIr + xIR))*((-1 + xir + xIr)*(-1 + e(k)))^b) + xIr*(a0 + a*(L*xIr + xIR))*((-1 + xir + xIr)*(-1 + e(k)))^b + a0*(xir + xIr)*e(k)^b + (xiR + xIR)*(a0 + a*(L*xIr + xIR))*(1 - xir - xIr + (xir + xIr)*e(k))^b);
        xir=(xir*(1 - a0*cE + (a0 + a*(L*xIr + xIR))*((-1 + xir + xIr)*(-1 + e(k)))^b + a0*e(k)^b))/(xiR + xIr + xIR - cE*xiR*(a0 + a*(L*xIr + xIR)) - (cE + cs)*(a0*(xIr + xIR) + a*xIR*(L*xIr + xIR)) + xir*(1 - a0*cE + (a0 + a*(L*xIr + xIR))*((-1 + xir + xIr)*(-1 + e(k)))^b) + xIr*(a0 + a*(L*xIr + xIR))*((-1 + xir + xIr)*(-1 + e(k)))^b + a0*(xir + xIr)*e(k)^b + (xiR + xIR)*(a0 + a*(L*xIr + xIR))*(1 - xir - xIr + (xir + xIr)*e(k))^b);
        
        %saving for each value of e (at row k), the time serie
        XIR(k,t)=xIR;
        XiR(k,t)=xiR;
        XIr(k,t)=xIr;
        Xir(k,t)=xir;
    end
end

这就是问题所在。 如果我让 MATLAB 默认选择颜色,则图例与颜色匹配。 但是如果我指定数据的形状和颜色,那么图例与这些规范不匹配(见下文)

figure
plot(eStart:eStep:eEnd, XIR(:,transientCut:T),'g*'   ,eStart:eStep:eEnd, XiR(:,transientCut:T),'b.' ...
  ,eStart:eStep:eEnd, XIr(:,transientCut:T),'r.'   ,eStart:eStep:eEnd, Xir(:,transientCut:T),'k.')
xlabel('xlable','FontSize',12)
ylabel('ylable','FontSize',12)
ylim([0 1])
title(['c_s=',num2str(cs),', c_E=',num2str(cE),...
            ', L=',num2str(L),', a_0=',num2str(a0), ', a=',num2str(a)])
legend('XIR','XiR','XIr','Xir')

Notice the legend does not match the color and shape in the graph

我也尝试了我在这个论坛中发现的类似问题的建议,但图例仍然不符合颜色/形状规范:

p1=plot(eStart:eStep:eEnd, XIR(:,transientCut:T),'g*');
hold on
p2=plot(eStart:eStep:eEnd, XiR(:,transientCut:T),'b.');
p3=plot(eStart:eStep:eEnd, Xir(:,transientCut:T),'r.');
p4=plot(eStart:eStep:eEnd, Xir(:,transientCut:T),'k.');
xlabel('xlable','FontSize',12)
ylabel('ylable','FontSize',12)
ylim([0 1])
title(['c_s=',num2str(cs),', c_E=',num2str(cE),...
       ', L=',num2str(L),', a_0=',num2str(a0), ', a=',num2str(a)])
legend([p1;p2;p3;p4], 'xIR','xiR','xIr','xir')
ylabel('ylable','FontSize',12)
ylim([0 1])
title(['c_s=',num2str(cs),', c_E=',num2str(cE),...
            ', L=',num2str(L),', a_0=',num2str(a0), ', a=',num2str(a)])
legend('XIR','XiR','XIr','Xir')

【问题讨论】:

在最后一段代码中,您再次调用legend。删除它,它应该可以工作。 【参考方案1】:

问题在于数据的形状。您的 y 轴数据,XIRXir,...都是矩阵

因此,当您使用命令:plot(eStart:eStep:eEnd, XIR(:,transientCut:T),'g*') 时,您获得的不仅仅是一个数据系列。

试试这个,你就会明白我的意思:

plot(eStart:eStep:eEnd, XIR(:,transientCut:T),'g*')
legend

您应该尝试绘制一个数据系列 XIR,而将有 201 个系列。 (eStart:eStep:eEnd 的大小是一个[1,101] 向量,而XIR(:,transientCut:T) 的大小是一个[101,201] 矩阵。


要解决此问题,您有两种选择。

    整理出您希望如何绘制数据。所以在绘图时将XIR(:,transientCut:T)这样的数据集转换成向量。

    如果你真的需要用你拥有的代码来绘制它,你可以“欺骗”matlab,通过在你的数据集之前绘制一个具有相同标记的空数据集。

figure
hold on
plot(NaN, NaN, 'g*') % Same marker style as XIR
plot(NaN, NaN, 'b.') % Same marker style as XiR
plot(NaN, NaN, 'r.') % Same marker style as XIr
plot(NaN, NaN, 'k.') % Same marker style as Xir

% Plot your data as normal
plot(eStart:eStep:eEnd, XIR(:,transientCut:T),'g*'   ,eStart:eStep:eEnd, XiR(:,transientCut:T),'b.' ...
  ,eStart:eStep:eEnd, XIr(:,transientCut:T),'r.'   ,eStart:eStep:eEnd, Xir(:,transientCut:T),'k.')

% Call legend after plotting your data
legend('XIR','XiR','XIr','Xir')

附:我建议您也重命名变量。 XIRXiRXIrXir 都太容易切换了,从您上一个代码 sn-p 中可以看出:

p1=plot(eStart:eStep:eEnd, XIR(:,transientCut:T),'g*');
hold on
p2=plot(eStart:eStep:eEnd, XiR(:,transientCut:T),'b.');
p3=plot(eStart:eStep:eEnd, Xir(:,transientCut:T),'r.'); <-- XIr, not Xir?
p4=plot(eStart:eStep:eEnd, Xir(:,transientCut:T),'k.');

【讨论】:

以上是关于MATLAB:指定点的颜色时,图例不匹配的主要内容,如果未能解决你的问题,请参考以下文章

XlsxWriter - 图表列和图例颜色不匹配

在 R 中创建具有匹配颜色和线条形状的图例

R语言ggplot2可视化线图(line)自定义配置标题文本相关内容颜色和图例(legend)颜色相匹配(和分组线图的颜色相匹配match colors of groups)

在R中创建具有匹配颜色和线形的图例

Matlab图例中同一行的两种不同颜色

arcgis图例颜色怎么批量导入