МАТЛАБ: Изменение свойств линии загруженной фигуры? - PullRequest
13 голосов
/ 17 февраля 2012

У меня очень простой вопрос для пользователей MATLAB:

Если я загружаю файл рисунка (.fig) с помощью команды load, есть ли способ изменить свойства нанесенных линий из командной строки? (ширина, цвет, маркер и пр.)

PD: первые два варианта в соответствии с информацией в Определение цвета линий для печати На этой странице… работает только при использовании команды plot. По-видимому, они бесполезны, если вы загрузите фигуру.

Ответы [ 4 ]

17 голосов
/ 17 февраля 2012

Вы можете получить дескрипторы для всех линейных объектов на текущем рисунке с помощью функции FINDOBJ :

hline = findobj(gcf, 'type', 'line');

Затем вы можете изменить некоторые свойства для всех линейных объектов:

set(hline,'LineWidth',3)

или только для некоторых из них:

set(hline(1),'LineWidth',3) 
set(hline(2:3),'LineStyle',':') 
idx = [4 5];
set(hline(idx),'Marker','*') 
2 голосов
/ 04 апреля 2014

В дополнение к ответу @yuk, если у вас также нарисована легенда , ,

hline = findobj(gcf, 'type', 'line');

вернет N x 3 строк (или точнее - lines plotted + 2x lines in legend). Здесь я рассмотрю только случай, когда все изображенные линии также находятся в легенде.

Последовательность странная: в случае 5 строк (отметим их 1 to 5) подготовили и добавили легенду, у вас будет

hline:
1 : 5 th line (mistical)    
2 : 5 th line (in legend)
3 : 4 th line (mistical)    
4 : 4 th line (in legend)
5 : 3 th line (mistical)    
6 : 3 th line (in legend)
7 : 2 th line (mistical)    
8 : 2 th line (in legend)
9 : 1 th line (mistical)    
10: 1 th line (in legend)
11: 5 th line (in plot)
12: 4 th line (in plot)
13: 3 th line (in plot)
14: 2 th line (in plot)
15: 1 th line (in plot)

В качестве решения (промедление в пятницу вечером) я родила этого маленького ребенка:

Решение 1: еслиВы не хотите сбрасывать легенду

Определить, есть ли легенда и сколько линий нанесено:

hline = findobj(gcf, 'type', 'line');
isThereLegend=(~isempty(findobj(gcf,'Type','axes','Tag','legend')))

if(isThereLegend)
    nLines=length(hline)/3
else
    nLines=length(hline)
end

Для каждой строки найдите нужные маркеры и сделайте для этого все необходимоестрока (это также относится к соответствующей строке легенды)

for iterLine=1:nLines
    mInd=nLines-iterLine+1
    if(isThereLegend)
        set(hline([(mInd*2-1) (mInd*2) (2*nLines+mInd)]),'LineWidth',iterLine) 
    else
    set(hline(mInd),'LineWidth',iterLine)     
    end
end

Это делает каждую i-th строку с width=i, и здесь вы можете добавить автоматическое изменение свойства;

Решение 2: Упростите

Избавьтесь от легенды, позаботьтесь о строках, сбросьте легенду.

legend off
hline = findobj(gcf, 'type', 'line');
nLines=length(hline)

for iterLine=1:nLines
    mInd=nLines-iterLine+1
    set(hline(mInd),'LineWidth',iterLine)     
end
legend show

Это может не подойти для ситуаций, когдалегенда должна быть размещена в определенном месте и т. д.

2 голосов
/ 17 февраля 2012

Чтобы манипулировать объектами на фигуре, вам необходимо иметь доступ к их ручкам.Если вы создадите фигуру, используя функции построения графиков, они вернут вам маркеры.Когда вы открываете фигуру, как и в вашем случае, вам нужно следовать дереву графических объектов, чтобы найти указатель на конкретный элемент, которым вы хотите манипулировать.

Эта страница содержит информацию о структуре графических объектов.

Путь к нужным маркерам будет зависеть от вашей фигуры, но, например, если вашрисунок был создан с помощью простой команды plot, это был бы один из способов изменить свойства линии:

x = 0:0.1:2;
plot(x,sin(x));

fig = gcf % get a handle to the current figure
% get handles to the children of that figure: the axes in this case
ax = get(fig,'children') 
% get handles to the elements in the axes: a single line plot here
h = get(ax,'children') 
% manipulate desired properties of the line, e.g. line width
set(h,'LineWidth',3)
0 голосов
/ 24 марта 2015

Вы также можете просто щелкнуть правой кнопкой мыши по строке в средстве просмотра и изменить там свойства. Это также изменяет соответствующую запись 'легенды' (по крайней мере, в 2014b).

...