2016-07-06 6 views
0

Мне сложно изменить размер шрифта, используемый в легенде сюжета в Matlab R2016a. Если я использую предпочтительный синтаксис l = legend(), он работает правильно. Однако мне нужно получить доступ к дескриптору значков, чтобы изменить свойство facea. Поэтому я использую синтаксис [l, icons, plot, txt] = legend(), который согласно Matlab «не рекомендуется и создает легенду, которая не поддерживает все графические функции». При использовании этого синтаксиса размер шрифта не обновляется корректно. Есть ли способ получить правильный размер шрифта и прозрачные значки легенды?Размер шрифта легенды Matlab не обновляется при использовании [l, icons, plot, txt] = legend()

%% Some data to plot 
x=linspace(1,10); 
y=linspace(1,20); 
[xx,yy]=meshgrid(x,y); 
zz1=2*xx+3*xx.*yy+yy.^2; 

%% Correct font, but icons not transparent 
figure(1) 
h=surf(x,y,zz1,'FaceColor','b','EdgeColor','none'); 
alpha(h,0.4) 
l=legend('plot1'); 
l.FontSize=24; 
l.FontName='Wide Latin'; 

%% Icons transparent, but incorrect font 
figure(2) 
h=surf(x,y,zz1,'FaceColor','b','EdgeColor','none'); 
alpha(h,0.4) 
[l,icons,plot,text]=legend('plot1'); 
l.FontSize=24; 
l.FontName='Wide Latin'; 
set(findobj(icons,'type','patch'),'facea',0.4) 
+0

'icons' также содержит текстовый объект (ы), размер шрифта которого необходимо изменить. Я не знаю, почему это неправильно связано с размером шрифта объекта легенды, похоже на потенциальную ошибку. – excaza

ответ

0

Во множественном выходном вызове, похоже, размер шрифта прикреплен ко второму выходу Легенды. Попробуйте этот пример:

%Plot some data and a legend 
[X,Y,Z] = peaks; 
surf(X,Y,Z) 
[LEGH,OBJH,OUTH,OUTM] = legend('Peaks legend'); 

%Change the transparency of the legend patches 
OBJH(2).FaceAlpha = 0.4; %Your "findobj" call is probably more reliable. 

%Change the fontsize 
OBJH(1).FontSize = 6; %Your "findobj" call is probably more reliable. 

%If you change the "fontsize" of the main legend object, 
% that seems to change the size of the legend box, but not the contents. 
LEGH.FontSize = 16; 
%This could actually be useful, for example to fine tune the size 
% of the box. But it is pretty counterintuitive. 

Чтобы быть diretly применимо к вашему коду:

%% Altogether now 
figure(3) 
h=surf(x,y,zz1,'FaceColor','b','EdgeColor','none'); 
alpha(h,0.4) 
[l,icons,plot,text]=legend('plot1'); 
%Set the objects that you want 
set(findobj(icons,'type','Text'),'FontSize',24) 
set(findobj(icons,'type','Text'),'FontName','Wide Latin') 
set(findobj(icons,'type','patch'),'facea',0.4) 

%Make painful adjustments to item positioning (there should be a better way ...) 
l.FontName='Wide Latin'; %These two lines get the box about the right size 
l.FontSize=24; 
icons(2).Vertices([3 4],1) = 0.2; %This squeezes the color patch to the left 
icons(1).Position(1) = 0.3;  %This moves the text to the left to fit in the box 

(я в настоящее время работает R2015a Это прекрасное детальное поведение может немного изменить в более обновленной версии.).

0

Если бы одна и та же проблема - я мог запускать значки (ii) .FontSize в цикле, перейдя через или из командной строки, но не ответил бы в скрипте.
Я добавил паузу (0.1) перед моей петлей и вуаля!