Это альтернативное решение, основанное на подходе, использованном EBH в его решении.
Надеюсь, это не будет считаться плагиатом, в случае, если я извинюсь, пожалуйста, оставьте комментарий, и я удалю свой ответ.
Предлагаемое мной решение не использует никаких недокументированных функций и было протестировано на R2015b; Я не знаю, будет ли это работать в более поздних версиях.
Идея такова:
- вызывает функцию
legend
, требуя все выходные параметры
- работа со вторым выходным параметром
- первая половина данных в этом параметре относится к
text
легенды
- вторая половина - адта
patch
легенды (коробки)
- цикл по этому параметру
- Получить исходную позицию текстового элемента
- Получить оригинал согласованных вершин патча
- Установить позицию текста в исходную координату первого
X
патча
- Установите координаты «X» патча в исходное положение «X» текста и масштабируйте его
На последнем шаге содержится блок извлечения, потому что он требует масштабирования размера патчей, чтобы удерживать их внутри поля легенды.
Кроме того, я изменил определение текста легенды, поскольку R2015b не обрабатывает строку в соответствии с вопросом.
test_values = [ 12, 232, 22, 44, 67, 72, 123, 35, 98 ];
test_text = { 'I''m', 'sorry', 'Dave', 'I''m', 'afraid', 'I' 'can''t', 'do', 'that' };
Pie = pie( test_values );
% get all the output from the legend function
[lgd,icons,plots,txt]=legend( test_text );
% Get the number of elements in the legend
n_items=length(icons)/2
% Loop over the legend's items
for i=1:n_items
% Get the original position of the text item
orig_txt=icons(i).Position
% Get the original coordinated of the Vertices of the patch
orig_mark=icons(i+n_items).Vertices
% Set the position of the text to the original coordinate of the first
% "X" of the patch
icons(i).Position=[orig_mark(1) orig_txt(2)]
% Set the "X" coordinates of the patch to the original "X" position of
% the text and scale it
icons(i+n_items).Vertices(:,1)=icons(i+n_items).Vertices(:,1)+orig_txt(1)*.7
end