Как нарисовать вертикальную линию по осям в графическом интерфейсе Matlab?

У меня есть графический интерфейс Matlab с компонентами 3 осей. Их теги predicted_ax, cost_ax и error_ax. Я хочу нарисовать вертикальную линию в определенной позиции на первом компоненте осей (тот, что с тегом predicted_ax). Как мне это сделать?

Я пробовал этот код:

ylim = get(handles.predicted_ax, 'ylim');
line([linePos, linePos], ylim);

Но он рисует линию по разным осям (те, что с тегом error_ax)! Я уверен, что не перепутал теги или компоненты осей. На самом деле еще один тест

ylim = get(handles.cost_ax, 'ylim');
line([linePos, linePos], ylim);

дает точно такой же результат: линия рисуется на последнем компоненте осей с тегом error_ax. Итак, как мне нарисовать линию на правильных осях?


person Rasto    schedule 18.07.2012    source источник


Ответы (2)


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

h = line([linePos, linePos], ylim);
set(h, 'parent', handles.predicted_ax);
person Isaac    schedule 18.07.2012
comment
Это лучший ответ. Каждая линия имеет родительские оси. Если вы не предоставите функции line() дескриптор осей, она по умолчанию прикрепит линию к текущим осям. Вот почему axes(handles.predicted_ax) работает. Это делает прогнозируемый_акс текущими осями, и поэтому любая линия, которую вы создадите впоследствии, будет иметь его в качестве родителя по умолчанию. Тем не менее, я считаю, что гораздо понятнее просто установить свойство «Родительский» линии для осей, к которым вы хотите ее прикрепить. В общем, никогда не рекомендуется полагаться на использование текущих осей (gca) или текущей фигуры (gcf), когда у вас есть более четкие доступные варианты. - person cholland; 19.07.2012
comment
В качестве примечания. Вы можете сделать все это одним вызовом, например: line([linePos, linePos], ylim, 'Parent', handles.predicted_ax) - person cholland; 19.07.2012
comment
@cholland Это был бы лучший ответ, если бы это сработало. Но это не так. - person Rasto; 19.07.2012
comment
@cholland Однако это сработает, если я сделаю так, как вы предложили - создайте строку и установите родительский элемент одним вызовом. - person Rasto; 19.07.2012
comment
Он в основном прав, ну, я должен сказать, что идея правильная. Единственное, чего ему не хватает, так это части handles.predicted_ax. Вот что он хотел сказать: h = line([linePos, linePos], ylim); set(h, 'parent', handles.predicted_ax); - person cholland; 19.07.2012

Я думаю, вам нужно использовать команду axes, чтобы установить текущую ось, по которой будет рисоваться линия. Попробуйте axes(handles.predicted_ax); перед вашей командой line.

(Получение значения ylim для оси, по-видимому, не делает его текущим.)

person Turix    schedule 18.07.2012