2016-02-15 2 views
1

Я написал и использую программу matlab, которая, помимо прочего, генерирует большое количество цифр, обычно используя команду subplot. [Эти цифры представляют собой траектории молекул в экспериментах с одной молекулой, их общее количество неизвестно заранее, но обычно составляет несколько сотен.] Он работал абсолютно гладко до сегодняшнего дня, где я получил следующее сообщение об ошибке:Непонятное поведение конкретной фигуры-подзадачи в matlab

Ошибка при использовании подзаголовка (строка 159) Требуется действительная ось для ввода.

После некоторой ручной отладки, я думаю, я выделил проблему исходя из следующей последовательности:

figure(i) 
... 
subplot(i) 

Где я могу быть любым целым числом. Простой воспроизводимый пример может быть:

i=211; 
... 
x=linspace(0,1,101); 
figure(i) 
subplot(211) 
plot(x,x) 
subplot(212) 
plot(x,x) 

проблема тождественно включается установка I = 212 в описанном выше случае. Очевидно, что я, возможно, грязно-быстро решить эту проблему с некоторыми

if i=212 || 211 
    j=something-different-from-212-or-211; 
else 
    j=i; 
end 
figure(j) 
... 

Но мне бы хотелось знать, если что-то более удобное/удобный/элегантный существует - и, я бы интересно узнать больше, если это возможно, о причина этой проблемы!

Спасибо!

+0

Создаете ли вы несколько фигур с несколькими осями (подзаголовки) или одну фигуру с несколькими осями? – Erik

+0

Я создаю несколько фигур с несколькими осями. Как правило, у меня есть цикл, работающий по индексу i, как указано выше, и для каждого i я открываю фигуру, содержащую обычно 2,3 или 4 подзаголовка (зависит). (И я не хочу закрывать ранее сгенерированные цифры) –

+0

Вы уверены, что должны использовать как 'figure (i)', так и 'subplot (i)' с той же переменной индексирования 'i'? У вас может не быть одинакового количества цифр и количества осей на всех этих фигурах. Если у вас есть цифры «N», используйте «n = 1: N» с «figure (n)» для изменения/создания фигур, и если на рисунке есть оси «M», то используйте другую переменную индексации подзаголовка для тех Оси «M» (в зависимости от компоновки подзаголовка: количество столбцов и строк осей подзаголовка). – Erik

ответ

2

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

figure(211); subplot(211) 
figure(212); subplot(212) 

но:

figure; subplot(211) 
figure; subplot(212) 

оба в порядке.

В первом, что делает Matlab, заключается в том, что он анализирует входные аргументы, чтобы определить, какой из способов обработки. то есть 1-й аргумент также может быть дескриптором осей. например

ax = subplot (211) 
% some other code and plot on other subplot 
% you can then set the 1st subplot to be active again: 
subplot (ax); 

Ключевой элемент здесь является то, что первый аргумент сюжетные может быть много вещей ...

В оригинальном случае, когда вы имели:

figure(211); 

Это означает, что, когда вы проходите в 211 в к подзаговору

subplot(211) 

Он проверяет, есть ли св handle -> а:

figure(211) 
ishandle(211) 

Затем он проверяет, является ли сво axes -> который где она терпит неудачу и вызывает ошибку, что вы видите.

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

hFig = figure; 
ax(p) = subplot(m,n,p,'Parent',hFig) 

, где у меня есть дескриптор графического интерфейса объектов и явно назвать их при работе на них.

+0

Спасибо за этот подробный ответ, он просветит все это. (и просмотреть комментарии к первому сообщению для "соответствующего синтаксиса") –

+0

Нет проблем - это была изворотливая проблема! :) – matlabgui

Смежные вопросы