2014-09-22 7 views
7

Próbuję mieć pole tekstowe w MATLABU na wirującym wykresie, ale nie chcę, aby pole tekstowe zmieniło swoją pozycję względem figury. Pomyślałem, że funkcja 'units','normalized' w funkcji text to zrobi, ale nie działa tak, jak pokazuje poniższy przykład. Przypuszczam, że mógłbym użyć uicontrol, ale chciałbym użyć greckich liter i nie mogę uzyskać uicontrol wyglądającego tak dobrze jak text. Poniższy przykład odtwarza mój problem. Zauważysz, że pole tekstowe przesuwa się, gdy wykres się kręci, ale chciałbym, aby po prostu pozostał w lewym górnym obszarze, w którym się zaczyna. Dziękuję Ci!Pole tekstowe MATLAB w stałej pozycji na górze wirującego wykresu 3D?

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 dla powtarzalnego przykład –

Odpowiedz

3

kilka rzeczy:

1), jak dowiedział się - przy użyciu obiektu annotation zamiast text celem jest droga. Różnica jest wyjaśniona bardzo ładnie here.

2) Powinieneś tylko raz stworzyć annotation, a następnie zmodyfikować jego ciąg zamiast usuwać i ponownie tworzyć go w każdej iteracji.

Wreszcie:

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 

Uwagi:

1) To jest ciekawe, że @ sugestię Otto korzystania legend wyników w sprawie utworzenia osi (bo to jest to, co legend przedmiot is - an axes z dziećmi annotation). Następnie można ustawić legendę ręcznie i uzyskać jej lokalizację przy użyciu albo get(gco,'position') (przy założeniu, że była to ostatnia rzecz, którą kliknięto) lub bardziej ogólnie get(findobj('tag','legend'),'position'). Później, gdy utworzysz legendę, możesz ustawić jej position na tę, którą poprzednio otrzymałeś. Można też pozbyć się linia \ znacznika wewnątrz legendy usuwając odpowiednią child typu line z legend, np:

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'); 

Jest oczywiście również możliwe, aby manipulować legendy za String używając jego uchwytu (hA1) bezpośrednio.

2) This post on UndocumentedMatlab omawia zachowanie obiektów annotation i kilka nieudokumentowanych sposobów ich manipulowania.

+0

+1 dzięki za link do strony Yair, że dobrze wiedzieć! –

3

Można użyć

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

Dziękuję Dev-iL! annotation działa znacznie lepiej w tym celu niż text, a implementacja jest bardzo podobna. I dziękuję za poradę na temat modyfikacji łańcucha, zamiast usuwania go ponownie.

Oto kod teraz działa znacznie lepiej:

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

Widząc, jak nie zaakceptowałeś swojej własnej (roboczej) odpowiedzi, włączyłem twoją odpowiedź do mojej i dodałem małą dyskusję o "legendzie". –