使用双y轴更改散点图的颜色

时间:2016-04-14 22:37:08

标签: matlab matlab-figure

我已经四处寻找,但还没有找到解决方案。我的目标是使用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]具有相同的颜色。有没有办法改变颜色,以便三组数据有不同的颜色?还有如何添加一个显示三组数据的图例?

2 个答案:

答案 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')

enter image description here

希望这有帮助。

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个独立的轴。所以我想你的问题的答案是否可以完成(尽管如果你删除了分散约束)。