2010-03-15 12 views
14

Chciałbym wykreślić pionową linię (wolałbym jakąkolwiek orientację, ale teraz byłbym zadowolony z pionu) z dwukolorowymi kresek, powiedzmy czerwono-niebiesko-czerwonymi -blue -...Wykreślanie wielobarwnej linii w Matlab

wiem, że mogę to zrobić tak:

plot([1,1],[0,1],'r'), 
hold on, 
plot([1,1],[0,1],'--b') 

Jednakże, ponieważ muszę być w stanie przesunąć linię, między innymi, powinien mieć tylko jeden uchwyt. Jak mogłem to zrobić?

EDYTOWANIE Dziękuję za odpowiedzi. Chyba powinienem podać więcej informacji.

Mam niektóre dane, które są podzielone na różne części. Chcę móc ręcznie dostosować granice między klasami. W tym celu rysuję pionowe linie na granicach klasyfikacji i używam draggable, aby umożliwić przesuwanie linii.

Dla granicy między klasą czerwoną i niebieską, chciałbym mieć czerwoną/niebieską linię.

plot(ones(10,1),linspace(0,1,10),'-bs','MarkerFaceColor','r','MarkerEdgeColor','none','linewidth',6) 

jest to, czego aktualnie używam. Jednak nie jest tak ładna (jeśli chcę równego odstępu, staje się prawdziwym bólem i chcę nadać obu kolorom tę samą wagę) i chciałbym mieć możliwość użycia trzech kolorów (a nie z krawędzią znacznika i twarz jest inna, ponieważ sprawia, że ​​moje oczy krwawią).

Niestety, przeciąganie nie pozwala mi używać wielu uchwytów, a grupowanie linii za pomocą hggroup wydaje się nie tworzyć przeciągalnego obiektu.

cline wygląda obiecująco, ale kolory tęczy nie będą działać w mojej aplikacji.

Odpowiedz

6

Możesz użyć posiadanego kodu i po prostu połączyć uchwyty z każdej linii w wektor klamek. Jeśli chcesz zmienić właściwości obu linii jednocześnie, funkcja SET jest w stanie zaakceptować wektor uchwytów jako argument. Z dokumentacji SET:

set(H,'PropertyName',PropertyValue,...) ustawia nazwanych właściwości do określonymi wartościami na obiekt (y) zidentyfikowane przez H.H może być wektorem uchwytów , w którym to przypadku set ustawia wartości właściwości dla wszystkich obiektów dla wszystkich obiektów .

Oto przykład:

h1 = plot([1 1],[0 1],'r'); %# Plot line 1 
hold on; 
h2 = plot([1 1],[0 1],'--b'); %# Plot line 2 
hVector = [h1 h2];    %# Vector of handles 
set(hVector,'XData',[2 3]); %# Shifts the x data points for both lines 



UPDATE: Skoro wspomniałeś używasz draggable z MathWorks File Exchange, oto rozwiązanie alternatywne. Z opisu draggable:

funkcja, która jest wywoływana, gdy obiekt porusza się mogą być dostarczone jako opcjonalnego argumentu, tak że ruch wyzwala dalszych działań.

Następnie można wypróbować następujące rozwiązanie:

  • Działka swoich dwóch linii, oszczędzając uchwyt dla każdego (tj h1 i h2).
  • Umieścić uchwyt dla każdego w nieruchomości 'UserData' drugiej:

    set(h1,'UserData',h2); 
    set(h2,'UserData',h1); 
    
  • Utwórz następującą funkcję:

    function motionFcn(hMoving) %# Currently moving handle is passed in 
        hOther = get(hMoving,'UserData'); %# Get the other plot handle 
        set(hOther,'XData',get(hMoving,'XData'),... %# Update the x data 
          'YData',get(hMoving,'YData')); %# Update the y data 
    end 
    
  • Włącz draggable na obu liniach, stosując powyższą funkcję jak ten, który jest wywoływany, gdy dowolny obiekt jest przenoszony:

    draggable(h1,@motionFcn); 
    draggable(h2,@motionFcn); 
    
+0

Tak, chciałbym móc to zrobić. Niestety nie działa to dla mojej aplikacji (patrz edycja). – Jonas

+0

@ Jonas: Dodałem dodatkowe rozwiązanie do mojej odpowiedzi, która moim zdaniem powinna działać z przeciąganiem. – gnovice

+1

Dzięki! Działa to bardzo ładnie. Potrzebuję użyć setappdata/getappdata, ponieważ już korzystam z UserData. – Jonas

1

Nie wiem, jak zrobić dokładnie to, co chcesz, ale prawdopodobnie powodem, dla którego chcesz to zrobić, jest sposób odróżnienia tej linii od innych linii. Wzdłuż tych linii spójrz na MathWorks 'documentation on 2-D line plots. W szczególności ten przykład:

plot(x,y,'--rs','LineWidth',2,... 
       'MarkerEdgeColor','k',... 
       'MarkerFaceColor','g',... 
       'MarkerSize',10) 

powinien dać ci mnóstwo pomysłów na odmianę. Jeśli naprawdę potrzebujesz dwubarwnych kresek, może pomóc określić, dlaczego. W ten sposób, nawet jeśli nie będziemy w stanie odpowiedzieć na to pytanie, być może uda nam się przekonać, że tak naprawdę nie potrzebujesz dwukolorowych kresek. Ponieważ wykluczyliście już rozwiązanie z nadmiernym docieraniem, jestem prawie pewien, że nie ma rozwiązania, które zaspokoi wszystkie wasze potrzeby. Zakładam, że dwukolorowość jest najbardziej płynną z tych potrzeb.

+0

Okazuje się, że najpierw przeczytałem podręcznik (choć muszę przyznać, że powinienem był o tym wspomnieć) i naprawdę chcę uzyskać dwukolorowość. – Jonas

3

Nigdy go nie używałem, ale jest zgłoszenie Sebastiana Hölza o nazwie CLINE na temat wymiany plików Mathworks, która wydaje się być powiązana.

+0

To prawie to, czego potrzebuję. W każdym razie dobrze jest wiedzieć, że istnieje cline. – Jonas

Powiązane problemy