MATLAB上的图例,每个点都是单独分散的

时间:2014-04-19 12:47:38

标签: matlab legend scatter

我试图在Matlab中的散点图上得到一个图例,问题是我绘制图形的方式涉及散布每个点(其中有> 10,000)单独通过for循环。代码如下:

figure;
xlabel ('\omega_u/p','FontSize',24,'FontName','Helvetica')
ylabel ('u_0/\alpha g','FontSize',24,'FontName','Helvetica')
set (findobj('type','axes'),'FontSize',24,'FontName','Helvetica')
hold on;

for j= 1:1:length(SURVIVALMODE)
 if SURVIVALMODE(j,1) == 1;
     scatter(U0OMEGAU(j,2)/p,U0OMEGAU(j,1)/(alpha*g),14,'g','fill');
 elseif SURVIVALMODE(j,1) == 0 && SURVIVALMODE(j,2)==6
     scatter(U0OMEGAU(j,2)/p,U0OMEGAU(j,1)/(alpha*g),14,'b','fill');
 elseif SURVIVALMODE(j,1) == 0 && SURVIVALMODE(j,2)==13
     scatter(U0OMEGAU(j,2)/p,U0OMEGAU(j,1)/(alpha*g),14,'r','fill');
 elseif SURVIVALMODE(j,1) == 0 && SURVIVALMODE(j,2)==14
     scatter(U0OMEGAU(j,2)/p,U0OMEGAU(j,1)/(alpha*g),14,'k','fill');
 elseif SURVIVALMODE(j,1) == 0 && SURVIVALMODE(j,2)==21
     scatter(U0OMEGAU(j,2)/p,U0OMEGAU(j,1)/(alpha*g),14,'c','fill');
 elseif SURVIVALMODE(j,1) == 0 && SURVIVALMODE(j,2)==29
     scatter(U0OMEGAU(j,2)/p,U0OMEGAU(j,1)/(alpha*g),14,'m','fill');
 elseif SURVIVALMODE(j,1) == 0 && SURVIVALMODE(j,2)==10
     scatter(U0OMEGAU(j,2)/p,U0OMEGAU(j,1)/(alpha*g),14,'b','^');
 elseif SURVIVALMODE(j,1) == 0 && SURVIVALMODE(j,2)==17
     scatter(U0OMEGAU(j,2)/p,U0OMEGAU(j,1)/(alpha*g),14,'r','^');
 elseif SURVIVALMODE(j,1) == 0 && SURVIVALMODE(j,2)==18
     scatter(U0OMEGAU(j,2)/p,U0OMEGAU(j,1)/(alpha*g),14,'k','^');
 elseif SURVIVALMODE(j,1) == 0 && SURVIVALMODE(j,2)==25
     scatter(U0OMEGAU(j,2)/p,U0OMEGAU(j,1)/(alpha*g),14,'c','^');
 elseif SURVIVALMODE(j,1) == 0 && SURVIVALMODE(j,2)==33
     scatter(U0OMEGAU(j,2)/p,U0OMEGAU(j,1)/(alpha*g),14,'m','^');
 end
end

U0OMEGAU是一个包含要绘制的所有点的矩阵SURVIVALMODE包含有关如何绘制它们的条件。当我使用传统的图例时,它会尝试制作包含已绘制的每个点的图例,而不是不同类型的点。我试图用每种类型的一个点创建一个虚拟散点图并从中创建一个图例但是没有成功。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

解决此问题的一种偷偷摸摸的方法是事先为要显示在图例中的每个数据绘制一个点,在显示实际点的区域之外,然后使用axis设置绘图边界以排除这些虚拟点。然后,图例条目将对应于这些点。

例如,假设您要绘制两个数据集但在图例中按相反顺序放置它们,您可以这样做:

x = 0:pi/100:2*pi;
y1 = sin(x); % I want this in green
y2 = cos(x); % I want this in red
% If for some reason I want to plot y1 before y2,
% but use a different order in the legend, I can do:
yOut = min([y1 y2]) - 1;
figure;
plot(0, yOut, 'r', 0, yOut, 'g');
hold on;
plot(x, y1, 'g', x, y2, 'r');
hold off;
legend('Red plotted 2nd', 'Green plotted 1st');
axis([min(x) max(x) min([y1 y2]) max([y1 y2])]);

这也适用于您的情况。可能有一个更简单的答案,但这对我有用。