Автоматизация легенды графика Matlab

Я решаю pde, который зависит от x и t, и хотел бы показать решение для всех x для нескольких значений t. Я пытаюсь написать код, который будет автоматически генерировать легенду для этого сюжета. Например, если я рисую решение при t = 0, 1, 5 и 9, я хочу, чтобы легенда показывала «t = 0», «t = 1» и т. д.

Допустим, мое решение содержится в матрице u. Мое время хранится в векторе t. Индекс времени, когда я сэмплирую, будет в векторе tsampled. Обратите внимание, что это не то же самое, что и время, которое я хочу на графике. Если я возьму время с индексом 6 вектора t, это значение не равно 6, но может быть любым.

В настоящее время я пытаюсь сделать это:

tlen = max(size(t));
tsampled = [2, floor(tlen/5), floor(2*tlen/5), floor(3*tlen/5), floor(4*tlen/5), floor(tlen)];
t(tsampled)
legnd = {'', '', '', '', '', ''};
hold on
for i = 1:1:size(tsampled) 
plot(x,u(tsampled(i),:))
legnd(i) = sprintf('t = %0.2f s \n', t(tsampled(i)));
end
title('my PDE solution');
legend(legnd, 0);
xlabel('x')
ylabel('u')
hold off

Но это вызывает ошибку «Преобразование в ячейку из char невозможно».

Когда я вместо этого пытаюсь использовать строку:

legend (sprintf('t = %0.2f s \n', t(tsampled)))

Я получаю правильные «строки» на графике, но они имеют следующий формат: введите здесь описание изображения

Я хотел бы, чтобы это отображало «t = 10,20 с» рядом с синей линией, «t = 91,84 с» рядом с оранжевой линией и так далее. Как мне получить желаемый результат?


person farid99    schedule 25.04.2015    source источник
comment
Не могли бы вы показать нам, как вы определили t и u?   -  person jadhachem    schedule 26.04.2015
comment
u определяется как результат вызова pdepe, а t просто: t = linspace(0, 500, 5000);   -  person farid99    schedule 26.04.2015
comment
Ваша проблема может возникнуть из-за использования size вместо length в строке for i=1:1:size(tsampled). Вместо этого попробуйте length. Я не могу точно сказать, потому что я не мог воспроизвести вашу проблему.   -  person jadhachem    schedule 26.04.2015
comment
Моя проблема заключается в создании легенды, а не в самих данных. По сути, как мне создать легенду, чтобы делать то, что я хочу. Что касается данных, то они работают.   -  person farid99    schedule 26.04.2015
comment
Я понимаю. tsampled является вектором, поэтому size(tsampled) возвращает [1 n] для некоторого целого числа n. Это приведет к тому, что ваш цикл будет выполняться только один раз. Я подозреваю, что вы рисуете все данные за один раз. И строка legend(sprintf('t = %0.2f s \n', t(tsampled))) создает одну большую строку со всеми строками t= в ней.   -  person jadhachem    schedule 26.04.2015


Ответы (1)


Поскольку вы предопределили legnd как массив ячеек, вам нужно использовать {} вместо (), чтобы получить правильный индекс. Пытаться:

legnd{i} = sprintf('t = %0.2f s \n', t(tsampled(i)));
person chepyle    schedule 25.04.2015