我想在同一个图窗口中放置三个散点图,并有一个描述它们的图例。散点图可以很好地绘制同一窗口中的所有载荷,但图例只能识别最后一个系列。换句话说,图例显示每个条目的红色标记(最后一个系列的颜色)。
如何让图例识别每个分散而不仅仅是最后一个分散?我尝试了很多不同的东西,但似乎都没有。谢谢!
图片是我的一个数据集的图,请注意图例。
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)
答案 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'})
答案 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'
中指定它们标志。
当你这样做时,这就是我得到的数字:
作为一个小调,我也无法重现你的情节。我得到了与上一个答案相同的情节。
答案 2 :(得分:0)
对我而言,这似乎与最新版本的Matlab(R2015b)有关;在这个版本中,我得到了与你相同的问题,图例条目只显示一种颜色(与其他无法重现问题的答案形成鲜明对比)。但如果我回滚到以前的版本(R2010b),问题就会消失。我不确定你是否有这个选项,但它可能有助于诊断确切的问题。
答案 3 :(得分:0)
此问题是由影响版本R2015b的Matlab错误引起的。它在R2016a中修复。有一个bugreport here,其中包含一个补丁和3个替代解决方法。
以下是链接失效的解决方法:
如果您无法安装补丁,则有三种替代解决方法:
如果每个散点图的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');
将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');
当每个散点图中的所有点都是相同的颜色时,请使用此解决方法。
使用两个或多个输出参数调用图例函数:
s1 = scatter(1:10,1:10,[],1:10);
hold on
s2 = scatter(2:11,1:10,[],26:35);
[h, ~] = legend('show');
当每个散点图中的点为不同颜色时,请使用此解决方法。