2010-03-15 47 views
14

Me gustaría trazar una línea vertical (preferiría cualquier orientación, pero estaría contento con la vertical en este momento) con guiones de dos colores, por ejemplo rojo-azul-rojo -azul -...Trazado de una línea multicolor en Matlab

sé que podría hacerlo de esta manera:

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

Sin embargo, ya que necesito para poder mover la línea, entre otros, que sólo debería tener una sola asa. ¿Cómo podría hacer esto?

EDIT Gracias por su respuesta. Creo que debería dar más información.

Tengo algunos datos que se clasifican en diferentes partes. Quiero ser capaz de ajustar manualmente los límites entre las clases. Para esto, estoy dibujando líneas verticales en los límites de clasificación y uso draggable para permitir mover las líneas.

Para el límite entre la clase roja y la azul, me gustaría tener una línea roja/azul.

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

es lo que estoy usando en este momento. Sin embargo, no es tan bonito (si quiero un espaciado igual, se convierte en un dolor real, y quiero darles el mismo peso a los dos colores), y me gustaría tener la posibilidad de usar tres colores (y no con el borde del marcador y la cara es diferente, porque hace que mis ojos sangren).

Desafortunadamente, arrastrable no me permite usar múltiples identificadores, y agrupar las líneas con hggroup no parece crear un objeto que se pueda arrastrar.

cline parece un enfoque prometedor, pero los colores del arco iris no funcionarán para mi aplicación.

Respuesta

6

Puede usar el código que tiene, y simplemente concatenar los identificadores de cada línea en un vector de identificadores. Cuando desee cambiar las propiedades de ambas líneas simultáneamente, la función SET puede aceptar el vector de identificadores como argumento. A partir de la documentación para SET:

set(H,'PropertyName',PropertyValue,...) establece las propiedades con nombre a los valores especificados en el objeto (s) identificado por H.H puede ser un vector de identificadores, en cuyo caso set establece los valores de las propiedades para todos los objetos .

He aquí un ejemplo:

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 



ACTUALIZACIÓN: Ya que mencionas está utilizando draggable del MathWorks File Exchange, aquí es una solución alternativa. A partir de la descripción de draggable:

Una función que se llama cuando el objeto se mueve se puede proporcionar como un argumento opcional , por lo que el movimiento desencadena más acciones.

entonces usted podría intentar la siguiente solución:

  • Plot sus dos líneas, ahorrando el mango para cada uno (es decir, h1 y h2).
  • colocar el mango para cada uno en la propiedad 'UserData' del otro:

    set(h1,'UserData',h2); 
    set(h2,'UserData',h1); 
    
  • Cree la siguiente función:

    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 
    
  • Encienda draggable para ambas líneas, usando la función anterior como el llamado cuando cualquiera de los objetos se mueve:

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

Sí, me gustaría poder hacer eso. Desafortunadamente, no parece funcionar para mi aplicación (ver edición). – Jonas

+0

@Jonas: Agregué una solución adicional a mi respuesta que creo que debería funcionar con arrastrable. – gnovice

+1

¡Gracias! Esto funciona muy bien. Necesito usar setappdata/getappdata, porque ya uso UserData. – Jonas

1

No sé cómo hacer exactamente lo que quiere, pero presumiblemente la razón por la que desea hacer esto es tener alguna forma de distinguir esta línea de otras líneas. En ese sentido, eche un vistazo a MathWorks 'documentation on 2-D line plots. Específicamente, este ejemplo:

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

debe darle muchas ideas para la variación. Si realmente necesita guiones de dos colores, podría ser útil especificar por qué. De esa forma, incluso si no podemos responder la pregunta, quizás podamos convencerlo de que realmente no necesita los guiones de dos colores. Como ya ha descartado la solución superpuesta, estoy bastante seguro de que no hay una solución que responda a todas sus necesidades. Supongo que el bicolor es la más fluida de esas necesidades.

+0

Resulta que, en realidad, he leído el manual primero (aunque admito que debería haberlo mencionado), y realmente quiero el bicolor. – Jonas

3

Nunca lo he usado, pero hay una presentación de Sebastian Hölz ​​llamada CLINE en el intercambio de archivos de Mathworks que parece estar relacionada.

+0

Eso es casi lo que necesito. En cualquier caso, es bueno saber que existe cline. – Jonas

Cuestiones relacionadas