Легенда для нескольких строк в сюжете Matlab - PullRequest
4 голосов
/ 07 апреля 2011

У меня 13 линий на графике, каждая строка соответствует набору данных из текстового файла. Я хотел бы обозначить каждую строку, начиная с первого набора данных, как 1,2, затем последовательно 1,25, 1,30, 1,80 и т. Д., С каждым приращением 0,05. Если бы я набрал его вручную, это было бы

legend('1.20','1.25','1.30', ...., '1.80')

Однако в будущем у меня может быть более 20 строк на графике. Поэтому печатать каждый из них нереально. Я попытался создать цикл в легенде, и он не работает.

Как я могу сделать это на практике?


N_FILES=13 ; 
N_FRAMES=2999 ; 
a=1.20 ;b=0.05 ; 
phi_matrix = zeros(N_FILES,N_FRAMES) ; 
for i=1:N_FILES
    eta=a + (i-1)*b ; 
    fname=sprintf('phi_per_timestep_eta=%3.2f.txt', eta) ; 
    phi_matrix(i,:)=load(fname);
end 
figure(1);
x=linspace(1,N_FRAMES,N_FRAMES) ;
plot(x,phi_matrix) ; 

Нужна помощь здесь:

legend(a+0*b,a+1*b,a+2*b, ...., a+N_FILES*b)

Ответы [ 5 ]

7 голосов
/ 07 апреля 2011

В качестве альтернативы построению легенды, вы также можете установить свойство DisplayName линии, чтобы легенда автоматически корректировалась.

Таким образом, вы можете сделать следующее:

N_FILES = 13;
N_FRAMES = 2999;
a = 1.20; b = 0.05;

% # create colormap (look for distinguishable_colors on the File Exchange)
% # as an alternative to jet
cmap = jet(N_FILES);

x = linspace(1,N_FRAMES,N_FRAMES);

figure(1)
hold on % # make sure new plots aren't overwriting old ones

for i = 1:N_FILES
    eta = a + (i-1)*b ; 
    fname = sprintf('phi_per_timestep_eta=%3.2f.txt', eta); 
    y = load(fname);

    %# plot the line, choosing the right color and setting the displayName
    plot(x,y,'Color',cmap(i,:),'DisplayName',sprintf('%3.2f',eta));
end 

% # turn on the legend. It automatically has the right names for the curves
legend
6 голосов
/ 27 мая 2013

Используйте '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

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

5 голосов
/ 07 апреля 2011

legend также может принимать список ячеек строк в качестве аргумента. Попробуйте это:

legend_fcn = @(n)sprintf('%0.2f',a+b*n);
legend(cellfun(legend_fcn, num2cell(0:N_FILES) , 'UniformOutput', false));
1 голос
/ 07 апреля 2011

Самый простой подход, вероятно, состоит в том, чтобы создать вектор-столбец чисел для использования в качестве меток, преобразовать их в форматированный символьный массив с N_FILES строками, используя функцию NUM2STR , а затем передать это как один аргумент LEGEND :

legend(num2str(a+b.*(0:N_FILES-1).','%.2f'));
0 голосов
/ 07 апреля 2011

Я нашел это Я нашел через Google:

legend(string_matrix) добавляет легенду, содержащую строки матрицы string_matrix в качестве меток. Это то же самое, что и legend(string_matrix(1,:),string_matrix(2,:),...).

Так что, в принципе, похоже, что для этого можно как-то построить матрицу.

Пример:

strmatrix = ['a';'b';'c';'d'];

x = linspace(0,10,11);
ya = x;
yb = x+1;
yc = x+2;
yd = x+3;

figure()
plot(x,ya,x,yb,x,yc,x,yd)
legend(strmatrix)
...