我已经四处寻找,但还没有找到解决方案。我的目标是使用3组数据绘制散点图,每组数据使用不同的颜色。以下是我的代码示例:
%generate input
x1=[732490 732509 732512 732513 732521 732528];
y1=[7.828 7.609 22.422 14.758 26.258 1.477];
x2=[732402 732403 732404 732404 732433 732555];
y2=[0.693 0.645 0.668 0.669 0.668 0.662];
x3=[832402 832403 832404 832404 832433 835423];
y3=[0.693 0.645 0.668 0.669 0.668 0.685];
figure(1);
[ax,h1,h2]=plotyy(x1,y1,[x2,x3],[y2,y3],'scatter');
blue=[0 0 1];
red=[1 0 0];
set(h1,'cdata',red);
set(h2,'cdata',blue);
set(ax(1),'ycolor','r');
set(ax(2),'ycolor','b');
然而,这正是我想要的,因为[x2 y2] [x3 y3]具有相同的颜色。有没有办法改变颜色,以便三组数据有不同的颜色?还有如何添加一个显示三组数据的图例?
答案 0 :(得分:2)
您可以通过以下方式构建自己的情节来克服plotyy
的限制:
figure
axes
axes
并:
position
等于第一个轴color
设置为“无" 现在,您可以通过将其指定为第一个参数(例如scatter
)来选择要使用scatter(axes_1, ...)
的轴。
绘制完所有数据集后,必须使两个轴的xlim
等于。
要添加图例,您只需指定handles" returned by the
分散function as first argument of the
图例`功能。
此方法已在以下代码中实现。
在代码中进行检查以验证是否可以使用 dot notation (introduced in R2014b)。
x1=[732490 732509 732512 732513 732521 732528];
y1=[7.828 7.609 22.422 14.758 26.258 1.477];
x2=[732402 732403 732404 732404 732433 732555];
y2=[0.693 0.645 0.668 0.669 0.668 0.662];
x3=[832402 832403 832404 832404 832433 835423];
y3=[0.693 0.645 0.668 0.669 0.668 0.685];
% Check if the "dot notation" can be used
dot_notation=~verLessThan('matlab','8.4')
%
figure
% Add the first axes
ax1=axes
% Add the second axes
ax2=axes
% Plot the scatter of the first set of data on the first axes
h1=scatter(ax1,x1,y1,'r','filled')
% Plot the scatter of the second set of data on the second axes
h2=scatter(ax2,x2,y2,'b','filled')
hold on
% Plot the scatter of the third set of data on the second axes
h3=scatter(ax2,x3,y3,'g','filled')
if(dot_notation)
% Superimpose the second axes over the first ome
ax2.Position=ax1.Position
% Make it transparent
ax2.Color='none'
% Move the YAxis to the right
ax2.YAxisLocation='right'
% Adjust the X limits
x_lim=[min([ax1.XLim ax2.XLim]) max([ax1.XLim ax2.XLim])]
ax1.XLim=x_lim
ax2.XLim=x_lim
% Remove XAxis Tick
ax2.XTick=[]
else
ax1_pos=get(ax1,'position');
% Superimpose the second axes over the first ome
set(ax2,'Position',ax1_pos)
% Make it transparent
set(ax2,'color','none')
% Move the YAxis to the right
set(ax2,'YAxisLocation','right')
% Adjust the X limits
ax1_x_lim=get(ax1,'xLim');
ax2_x_lim=get(ax2,'xLim');
x_lim=[min([ax1_x_lim ax2_x_lim]) max([ax1_x_lim ax2_x_lim])]
set(ax1,'XLim',x_lim)
set(ax2,'XLim',x_lim)
end
% Add the legend
[a,b,c,d]=legend(ax2,[h1,h2,h3],'1° data set','2° Data set','3° Data set')
if(dot_notation)
a.Color='none'
else
set(a,'color','w')
end
grid(ax1,'on')
希望这有帮助。
Qapla'
答案 1 :(得分:1)
在matlab的这个例子中,它是在没有分散的情况下完成的:
x = linspace(0,10);
y1 = 200*exp(-0.05*x).*sin(x);
y2 = 0.8*exp(-0.5*x).*sin(10*x);
y3 = 0.2*exp(-0.5*x).*sin(10*x);
figure
[hAx,hLine1,hLine2] = plotyy(x,y1,[x',x'],[y2',y3']);
请注意,如果您写[hAx,hLine1,hLine2] = plotyy(x,y1,[x,x],[y2,y3]);
,那么您将失去第三种颜色,因此您需要[x',x']
代替[x,x]
我刚用[ax,h1,h2]=plotyy(x1,y1,[x2',x3'],[y2',y3']);
测试了你的代码,我可以看到3种颜色。可悲的是,当我做[ax,h1,h2]=plotyy(x1,y1,[x2',x3'],[y2',y3'],'scatter');
时,我会继续得到同样的
Error using scatter (line 44)
X and Y must be vectors of the same length
,即使我尝试了matlab示例中的代码。显然,scatter属性不允许您拥有3组数据。如果你查看scatter.m的第42行,你会看到
[~, cax, args] = parseplotapi(varargin{:},'-mfilename',mfilename);
执行[hAx,hLine1,hLine2] = plotyy(x,y1,x,y2,'scatter');
时,只有2套图,你会看到第42行中的args是一个带有两个向量的1x2单元格,但是当你执行[ax,h1,h2]=plotyy(x1,y1,[x2',x3'],[y2',y3'],'scatter');
时,这将是获得3种颜色的唯一方法
(记住[ax,h1,h2]=plotyy(x1,y1,[x2,x3],[y2,y3],'scatter')
只会给你2种颜色,虽然它在scatter.m中工作,因为args也被解释为2个矢量)
现在,第42行中的args是一个1x2单元格,有两个矩阵而不是两个向量,导致错误。
此外使用:
blue=[0 0 1];
red=[1 0 0];
set(h1,'cdata',red);
set(h2,'cdata',blue);
set(ax(1),'ycolor','r');
set(ax(2),'ycolor','b');
没有用,因为你只能操纵2而不是3个独立的轴。所以我想你的问题的答案是否可以完成(尽管如果你删除了分散约束)。