10

我正在以典型的 MATLAB 散点图格式绘制数据。通常在绘制多个数据集时,我会使用命令'hold on;',然后绘制每个数据,然后再绘制图例:

legend('DataSet1', 'DataSet2') % etcetera

但是,我在相同轴上绘制的(多个)数据集不一定每次都是相同的数据集。我在同一轴上绘制了多达六组不同的数据,并且可以显示这些数据的任意组合(取决于用户选择显示的内容)。显然,如果我想以传统方式设置传说,那将是很多 elseif。

我真正想做的是在绘制时为每个 DataSet 分配一个名称,以便之后我可以调用所有正在显示的数据的图例。

...或者,任何人都可以想到的任何其他解决此问题的方法..?

4

5 回答 5

20

您应该能够为每个绘图设置 DisplayName 属性:

figure
hold on
plot(...,'DisplayName','DataSet1')
plot(...,'DisplayName','DataSet2')
legend(gca,'show')

http://www.mathworks.com/help/matlab/ref/line_props.html

旁注:通过让图形看起来像我想要的方式,然后选择图形的“文件”菜单选项“生成 M 文件...”并检查生成的输出代码,我发现了很多这样的小技巧。

于 2013-05-24T20:14:04.277 回答
11

一种选择是像这样利用该'UserData'属性:

figure;
hold on
plot([0 1], [1 0], '-b', 'userdata', 'blue line')
plot([1 0], [1 0], '--r', 'userdata', 'red dashes')

% legend(get(get(gca, 'children'), 'userdata'))                      % wrong
legend(get(gca, 'children'), get(get(gca, 'children'), 'userdata'))  % correct

编辑:正如提问者指出的那样,原始版本可能会出现故障。要解决此问题,请指定哪个句柄与哪个标签一起使用(在固定版本中,它的顺序正确)。

于 2012-05-24T16:31:59.320 回答
10

用作属性,并将您的图例'DisplayName'称为plot()

legend('-DynamicLegend');

我的代码如下所示:

x = 0:h:xmax;                                  %// get an array of x-values
y = someFunction;                              %// function
plot(x, y, 'DisplayName', 'Function plot 1');  %// plot with 'DisplayName' property

legend('-DynamicLegend',2);                    %// '-DynamicLegend' legend

来源:http ://undocumentedmatlab.com/blog/legend-semi-documented-feature/

于 2013-05-27T01:15:04.037 回答
3

您可以尝试以下方法

for k = 1:10

   h(k) = plot(...);
   name{k} = ['condition ' num2str(k)];

end

legend(h, name);
于 2012-05-24T16:18:18.960 回答
0

做一个for循环。但是在 for 循环之前,创建一个数组。

%for example 

legendset = {}

for i = 1:10 

%blabla
%Then in the fore loop say: 

legendset = [legendset;namedata(i)]

%It puts all names in a column of legendset. 
%Make sure namedata are characters. 

%foreloop ends
end

%Then after the foreloop say: 

legend(legendset). 
于 2014-01-24T10:31:35.673 回答