Как добавить всплывающие подсказки или наложение текста на фигуре Matlab - PullRequest
2 голосов
/ 26 марта 2019

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

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

Однако поиск всплывающих подсказок / наложений / наведений на фигуры, похоже, не принес плодов.

Пример:

figure; hold on;
plot(1:10,rand(10,1))
plot(1:10,rand(10,1))
% additional info
plot_1_info.name = 'Alice';
plot_2_info.name = 'Bob';
plot_1_info.age = 24;
plot_2_info.age = 12;

Какие-нибудь хорошие решения или лучшие подходы для этого?

Ответы [ 2 ]

5 голосов
/ 26 марта 2019

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

data cursor

Подробности смотрите в моих комментариях:

% Create some data
x = (1:2:20).';
y = rand(10,1);
name = { 'Alice'; 'Alice'; 'Alice'; 'Alice'; 'Bob'; 'Bob'; 'Bob'; 'Chris'; 'Chris'; 'Chris' };
age = [ 24; 24; 24; 24; 12; 12; 12; 17; 17; 17 ];
% Put it in a table, so we have it all together for indexing as plot data
tbl = table( x, y, name, age );

% Create the plot, assign the UserData property to the plot object
f = figure; 
plt = plot( x, y );
plt.UserData = tbl;

% Hijack the Data Cursor update callback so we can inject our own info
dcm = datacursormode( f );
set( dcm, 'UpdateFcn', @onDataCursor );

% Function which returns the text to be displayed on the data cursor
function txt = onDataCursor( ~, evt )
    % Get containing figure
    f = ancestor( evt.Target, 'figure' );
    % Get the index within the original data
    idx = getfield( getCursorInfo( datacursormode( f ) ), 'DataIndex' );
    % The original data is stored in the UserData property
    data = evt.Target.UserData;
    % Each element of the cell array is a new line on the cursor
    txt = { sprintf( 'X: %g', data.x(idx) ), ...
            sprintf( 'Y: %g', data.y(idx) ), ...
            sprintf( 'Name: %s', data.name{idx} ), ...
            sprintf( 'Age: %g', data.age(idx) ) };          
end

Выход:

plot with data tip

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


Этот подход действительно гибкий. Например, если у нас было 3 строки (по одной на человека), каждая из них может иметь собственную структуру UserData, и нам не нужно повторять всю информацию в строках таблицы.

A = struct( 'X', 1:4, 'Y', rand(1,4), 'Name', 'Alice', 'Age', 24 );
B = struct( 'X', 1:3, 'Y', rand(1,3), 'Name', 'Bob', 'Age', 12 );
C = struct( 'X', 1:3, 'Y', rand(1,3), 'Name', 'Chris', 'Age', 17 );

f = figure; hold on;
plt = plot( A.X, A.Y ); plt.UserData = A;
plt = plot( B.X, B.Y ); plt.UserData = B;
plt = plot( C.X, C.Y ); plt.UserData = C;

% ... Now the struct fields can be accessed from the callback
3 голосов
/ 26 марта 2019

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

figure(); hP = plot(1:10,rand(10,1),1:10,rand(10,1));
nPts = cellfun(@numel, {hP.XData});
hP(1).DataTipTemplate.DataTipRows(end+1) = dataTipTextRow('Name', repmat("Alice",nPts(1),1) );
hP(1).DataTipTemplate.DataTipRows(end+1) = dataTipTextRow('Age',  repmat(12,     nPts(1),1) );
hP(2).DataTipTemplate.DataTipRows(end+1) = dataTipTextRow('Name', repmat("Bob",  nPts(2),1) );
hP(2).DataTipTemplate.DataTipRows(end+1) = dataTipTextRow('Age',  repmat(24,     nPts(2),1) );
% (Of course the above can be organized in a nicer way using a function)

Что дает:

enter image description here

Обратите внимание, что всплывающая подсказка содержит черный текст, а всплывающая подсказка - синий - это поведение по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...