2012-04-20 3 views
3

В Matlab 2011b у меня есть многомерная матрица, которая должна быть изначально представлена ​​как 2D-график из двух его размеров. Я хочу, чтобы маркеры можно было щелкнуть левой кнопкой мыши. Нажатие на маркер рисует новую фигуру других размеров, нарезанных щелчком.Сделать щелчок MATLAB графиков участков график подграф

Этот вопрос связан с Matlab: Plot points and make them clickable to display informations about it, но я хочу запустить скрипт, а не просто всплывать данные о точке клика.

Googling намекнул, что ButtonDownFcn может быть использован, но примеры, которые я нашел требует ручного черчения каждой точки и прикрепления обработчика, например, так:

hp = plot(x(1), y(1), 'o'); 
set(hp, 'buttondownfcn', 'disp(1)'); 

Поскольку существует множество маркеров в главном графике, можно ли просто прикрепите обработчик ко всей кривой и вызовите функцию построения подграфа с индексом (предпочтительнее) или координатами щелчка маркера?

ответ

3

Это идея того, что вам нужно, и должно помочь вам начать работу, если я пойму ваши требования.

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

function main 
subplot(211) 
h = plot (peaks); 

set (h,'buttondownfcn', @hitme) 
end 

function hitme(gcbo,evendata) 
subplot (212) 
hold on; 

col = get (gcbo,'Color'); 
h2 = plot (get (gcbo,'XData'),get (gcbo,'YData')); 
set (h2,'Color', col) 

pt = get (gca, 'CurrentPoint'); 
disp (pt); 
end 

Вы можете изучить ваши варианты получить, просто писать get(gcbo) в функции hitme.

+0

Спасибо. Хотя ваш пример показывает, как я могу получить 2D-фрагмент трехмерных данных, меня больше интересует получение индекса маркера 2D-графика, на который я нажимаю. Например, изменяя свой код ниже, щелчок любого маркера печатает те же XData и YData. Я бы хотел, чтобы вместо этого щелкнул указатель (1, 2, 3 и т. Д.). функция main данные = пики; h = plot (1: размер (данные, 2), данные (1, :), 'o-'); множества (Л, 'buttondownfcn', @hitme) конец функция hitme (gcbo, evendata) прибудут (gcbo, 'XData') прибудет (gcbo, 'YData') конца – Gnubie

+0

если все, что вы хотите это point, добавьте 'pt = get (gca, 'CurrentPoint');', как показано выше. Это даст вам трехмерную точку, поэтому в зависимости от ваших потребностей просто используйте первую строку. – Rasman

+0

Большое спасибо! Это дает мне координаты, а не индекс маркера, но поскольку я знаю исходную матрицу, я могу вычислить индекс из x-координаты, например. раунд (pt (1)). – Gnubie