2014-09-22 15 views
7

Sto provando ad avere una casella di testo in MATLAB su un grafico a rotazione, ma non voglio che la casella di testo cambi la sua posizione rispetto alla figura. Ho pensato che lo 'units','normalized' nella funzione text lo farebbe, ma non funziona abbastanza, come illustrato nell'esempio seguente. Suppongo che potrei usare uicontrol ma mi piacerebbe usare le lettere greche e non riesco a ottenere uicontrol con un bell'aspetto come text. L'esempio seguente ricrea il mio problema. Noterai che la casella di testo si sposta mentre la trama gira, ma mi piacerebbe che rimanesse nella zona in alto a sinistra dove inizia. Grazie!Casella di testo MATLAB in una posizione costante in cima alla trama 3D a rotazione?

part_x = rand(1000,3)-.5;       %generate random 3D coordinates to scatter 
fig1 = figure; 
scatter3(part_x(:,1), part_x(:,2), part_x(:,3)) 
axis equal vis3d 
axis([-1 1 -1 1 -1 1]) 
set(fig1,'color','w') 

for tau = 1:150 
    view(tau+20,30);        %spin the plot 
    pause(.01) 
    if tau~=1; delete(tau_text); end;    %delete the previous text if it exists 
    tau_text = text(.1,.7,... 
        ['\tau = ',num2str(tau)],... 
        'units','normalized',...  %text coordinates relative to figure? 
        'Margin',3,...    %these last 3 lines make it look nice 
        'edgecolor','k',... 
        'backgroundcolor','w'); 
end 
+2

+1 ad esempio riproducibile –

risposta

3

diverse cose:

1) Come hai scoperto - utilizzando un oggetto annotation invece di text oggetto è la strada da percorrere. La differenza è spiegata molto bene here.

2) È necessario creare solo lo annotation una volta e quindi modificare la stringa anziché eliminarla e ricrearla in ogni iterazione.

Infine:

part_x = rand(1000,3)-.5; 
fig1 = figure; 
scatter3(part_x(:,1), part_x(:,2), part_x(:,3)) 
axis equal vis3d 
axis([-1 1 -1 1 -1 1]) 
set(fig1,'color','w') 

%// Create the text outside the loop: 
tau_text = annotation('textbox',[0.2 0.8 0.1 0.05],... 
        'string','\tau = NaN',... 
        'Margin',4,... 
        'edgecolor','k',... 
        'backgroundcolor','w',... 
        'LineWidth',1); 

for tau = 1:150 
    view(tau+20,30); 
    pause(.01) 
    set(tau_text,'String',['\tau = ',num2str(tau)]); %// Modify the string 
end 

Note:

1) È interessante notare che @ suggerimento di Ottone di utilizzare legend risultati nella creazione di un assi (perché questo è ciò che un oggetto legend è - un axes con annotation bambini). È quindi possibile posizionare manualmente la legenda e ottenere la sua posizione utilizzando get(gco,'position') (presumendo che fosse l'ultima cosa che si è fatto clic) o più in generale get(findobj('tag','legend'),'position'). Successivamente, ogni volta che crei la legenda, puoi semplicemente impostare il suo position su quello che hai precedentemente ottenuto. Si potrebbe anche sbarazzarsi della linea \ marcatore all'interno della leggenda cancellando l'appropriato child di tipo line dal legend, ad esempio:

ezplot('sin(x)'); 
hLeg = legend('\tauex\tau'); 
delete(findobj(findobj('Tag','legend'),'Type','line')); 
hA1 = findobj(findobj('Tag','legend'),'Type','text'); 
set(hA1,'Position',[0.5,0.5,0],'HorizontalAlignment','center'); 

Naturalmente è anche possibile manipolare la leggenda String usando l'apposita maniglia (hA1) direttamente.

2) This post on UndocumentedMatlab discute il comportamento degli oggetti annotation e alcuni modi non documentati per manipolarli.

+0

+1 grazie per il link al sito web di Yair che è bene sapere! –

3

Si potrebbe utilizzare

legend(['\tau = ',num2str(tau)],'Location','NorthWestOutside') 
0

Grazie Dev-iL! annotation funziona molto meglio per questo scopo rispetto a text e l'implementazione è molto simile. E grazie per il consiglio su come modificare la stringa piuttosto che cancellarla e ricrearla.

Ecco il codice ora, lavorando molto meglio:

part_x = rand(1000,3)-.5;       %generate random 3D coordinates to scatter 
fig1 = figure; 
scatter3(part_x(:,1), part_x(:,2), part_x(:,3)) 
axis equal vis3d 
axis([-1 1 -1 1 -1 1]) 
set(fig1,'color','w') 

tau_text = annotation('textbox',[0.2 0.8 0.1 0.05],... 
         'string','',... 
         'Margin',4,...    %these last 4 lines make it look nice 
         'edgecolor','k',... 
         'backgroundcolor','w',... 
         'LineWidth',1); 

for tau = 1:150 
    view(tau+20,30);        %spin the plot 
    pause(.01) 
    set(tau_text,'String',['\tau = ',num2str(tau)]); 
end 
+0

Vedendo come non hai accettato la tua risposta (di lavoro), ho incorporato la tua risposta nella mia e ho aggiunto una piccola discussione su 'legend'. –

Problemi correlati