Графическое построение графика MATLAB: назначение меток легенды во время графика
Я рисую данные в типичном формате диаграммы рассеяния MATLAB. Обычно при построении нескольких наборов данных я бы использовал команду "hold on;", а затем построил график каждого из этих данных, после чего получим мою легенду:
legend('DataSet1', 'DataSet2') % etcetera
Однако, (несколько) наборов данных, которые я рисую на тех же осях, не обязательно являются одними и теми же наборами данных каждый раз. Я рисую до шести различных наборов данных на тех же осях, и может быть любая комбинация этих показанных (в зависимости от того, что пользователь выбирает для отображения). Очевидно, что было бы много elseif, если бы я хотел установить легенду традиционным способом.
То, что я действительно хотел бы сделать, - назначить каждому DataSet имя, поскольку оно построено так, что впоследствии я могу просто вызвать легенду о всех отображаемых данных.
... Или любое другое решение этой проблемы, о котором каждый может подумать..?
Ответы
Ответ 1
Один из вариантов заключается в том, чтобы воспользоваться свойством '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
Изменить: Как заметил собеседник, исходная версия может выйти из строя. Чтобы исправить это, укажите, какой дескриптор идет с какой меткой (в фиксированной версии он находится в правильном порядке).
Ответ 2
Вы можете установить свойство DisplayName для каждого графика:
figure
hold on
plot(...,'DisplayName','DataSet1')
plot(...,'DisplayName','DataSet2')
legend(gca,'show')
http://www.mathworks.com/help/matlab/ref/line_props.html
Боковое примечание. Я нашел много маленьких трюков, подобных этому, заставив фигуру выглядеть так, как я хочу, затем выбрав пункт меню "Файл" "Создать M файл..." и проверив сгенерированный выходной код.
Ответ 3
Используйте '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/
Ответ 4
Вы можете попробовать что-то вроде следующего
for k = 1:10
h(k) = plot(...);
name{k} = ['condition ' num2str(k)];
end
legend(h, name);
Ответ 5
Сделайте цикл 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).