如何让matlab图例识别多个散点图?

时间:2015-10-10 23:10:20

标签: matlab matlab-figure

我想在同一个图窗口中放置三个散点图,并有一个描述它们的图例。散点图可以很好地绘制同一窗口中的所有载荷,但图例只能识别最后一个系列。换句话说,图例显示每个条目的红色标记(最后一个系列的颜色)。

如何让图例识别每个分散而不仅仅是最后一个分散?我尝试了很多不同的东西,但似乎都没有。谢谢!

图片是我的一个数据集的图,请注意图例。

s10 = scatter3(x1, y1, z1, 'b'); hold on;
s1 = scatter3(x2, y2, z2, 'g'); hold on;
s01 = scatter3(x3, y3, z3, 'r'); hold on;
legend([s10,s1,s01], {'10ms', '1ms', '0.1ms'}) 
% Every legend entry is red (pertains to the last series)

example of the problem

4 个答案:

答案 0 :(得分:1)

我无法重现这个问题。使用上面的代码与随机数据似乎工作(我确实修复了一个拼写错误,你需要在legend的第一个参数之后使用逗号):

x1 = rand(10, 1); y1 = rand(10, 1); z1 = rand(10, 1);
x2 = rand(10, 1); y2 = rand(10, 1); z2 = rand(10, 1);
x3 = rand(10, 1); y3 = rand(10, 1); z3 = rand(10, 1);
s10 = scatter3(x1, y1, z1, 'b'); hold on;
s1 = scatter3(x2, y2, z2, 'g'); hold on;
s01 = scatter3(x3, y3, z3, 'r'); hold on;
legend([s10,s1,s01], {'Series 10', 'Series 1', 'Series 01'})

enter image description here

答案 1 :(得分:0)

如果上一个答案不起作用,您还可以利用动态图例。这个答案是鼓舞人心的帖子:Dynamic Legend (Updates in every recursion)。这是一个相当无证的功能,但它确实很有效。基本上,在每个绘图之后,您可以动态更新图例的外观,而无需调用一起包含所有这些图例的图例。

因此,尝试这样的事情。我将借用之前的一些答案代码来启动我:

x1 = rand(10, 1); y1 = rand(10, 1); z1 = rand(10, 1);
x2 = rand(10, 1); y2 = rand(10, 1); z2 = rand(10, 1);
x3 = rand(10, 1); y3 = rand(10, 1); z3 = rand(10, 1);

scatter3(x1, y1, z1, 'b', 'DisplayName', '10ms'); hold on;
legend('-DynamicLegend');
scatter3(x2, y2, z2, 'g', 'DisplayName', '1ms'); hold on;
legend('-DynamicLegend');
scatter3(x3, y3, z3, 'r','DisplayName', '0.1ms'); hold on;
legend('-DynamicLegend');

调用scatter3,然后确保使用'DisplayName'标记,并将您通常放置在相应图例点中的内容放置。在每次调用scatter3之后,使用legend('-DynamicLegend');命令向MATLAB发信号通知条目即将到来......您将在'DisplayName'中指定它们标志。

当你这样做时,这就是我得到的数字:

enter image description here

作为一个小调,我也无法重现你的情节。我得到了与上一个答案相同的情节。

答案 2 :(得分:0)

对我而言,这似乎与最新版本的Matlab(R2015b)有关;在这个版本中,我得到了与你相同的问题,图例条目只显示一种颜色(与其他无法重现问题的答案形成鲜明对比)。但如果我回滚到以前的版本(R2010b),问题就会消失。我不确定你是否有这个选项,但它可能有助于诊断确切的问题。

答案 3 :(得分:0)

此问题是由影响版本R2015b的Matlab错误引起的。它在R2016a中修复。有一个bugreport here,其中包含一个补丁和3个替代解决方法。

以下是链接失效的解决方法:

如果您无法安装补丁,则有三种替代解决方法:

  1. 如果每个散点图的CData是RGB三元组,则将每个散点图的MarkerEdgeColor或MarkerFaceColor分配给CData的值:

    s1 = scatter(1:10,1:10);
    hold on
    s2 = scatter(2:11,1:10);
    s1.MarkerEdgeColor = s1.CData;
    s2.MarkerEdgeColor = s2.CData;
    legend('show');
    
  2. 将RGB三元组分配给每个散点图的MarkerEdgeColor或MarkerFaceColor:

    s1 = scatter(1:10,1:10);
    hold on
    s2 = scatter(2:11,1:10);
    s1.MarkerEdgeColor = [0 0.4470 0.7410];
    s2.MarkerEdgeColor = [0.8500 0.3250 0.0980];
    legend('show');
    
  3. 当每个散点图中的所有点都是相同的颜色时,请使用此解决方法。

    1. 使用两个或多个输出参数调用图例函数:

      s1 = scatter(1:10,1:10,[],1:10);
      hold on
      s2 = scatter(2:11,1:10,[],26:35);
      [h, ~] = legend('show');
      
    2. 当每个散点图中的点为不同颜色时,请使用此解决方法。