Tengo un conjunto de datos que se parece a esto

 140400 70.7850 1
 140401 70.7923 2
 140402 70.7993 3
 140403 70.8067 4
 140404 70.8139 5
 140405 70.8212 3

Donde la primera columna corresponde al tiempo (intervalos de un segundo entre puntos de datos) y será en el eje x, la segunda columna corresponde con la distancia y será en el eje y. La tercera columna es un número (de uno a cinco) que es un título de el movimiento.

Quiero hacer una trama que cambia el color de la línea entre dos puntos dependiendo de lo que el número de la anterior punto de datos fue. Por ejemplo, quiero que la línea roja entre el primer y segundo puntos de datos debido a que el valor de cualificación de la era 1.

He visto un montón de posts sobre la fabricación de una escala de colores dependiendo de un valor de intensidad, pero solo quiero 5 colores: rojo, naranja, amarillo, verde y azul), respectivamente.

He intentado hacer algo como esto:

plot(x,y,{'r','o','y','g','b'})

Pero no hubo suerte.

Alguna idea de cómo acercarse a este? Sin bucle si es posible.

Lo que está mal con el bucle? Lo que usted está pidiendo en mi humilde opinión no se puede hacer sin un bucle.
Intente esto, asumiendo que la matriz se almacena en A: colors='rmygb'; figure; hold on; for idx = 1 : size(A,1)-1, plot(A(idx:idx+1,1), A(idx:idx+1,2), colors(A(idx,3))); end. Dar que un ir y ver cómo se ejecuta. Por CIERTO, o no se admite como un color desde o denota un marcador circular. He reemplazado el color magenta.
¿Qué tipo de datos tiene donde trazado de 100.000 puntos en una gráfica va a ser del todo útil? Hay tanta información que se puede recoger a partir de una gráfica, y poner más puntos de datos en general, hace que sea más difícil de averiguar lo que está pasando. Ver 100,000 segmentos de línea que probablemente no es muy útil, el uso de scatter le dará casi la misma información, yo no garantizo que va a ser útil!
Si quería un gráfico de dispersión en su lugar, usted puede dividir los datos en cinco matrices haciendo [i,j]=find(A==1), etc. Esto le dará las filas que tienen el tercer valor igual a 1. Entonces, se podría hacer scatter(x(i),y(j),'r'); hold on y, a continuación, repita cuatro veces más.
desde Matlab 2014b y gracias a Yair Altman se puede hacer sin un bucle ahora: indocumentados Matlab.

OriginalEl autor JSZ | 2015-07-28

4 Comentarios

  1. 8

    También se puede hacer con un truco que funciona con Matlab versión anterior a 2014b (tan lejos como 2009a al menos).

    Sin embargo, es que nunca será tan simple como usted esperaba (a menos que escribir un contenedor para uno de la solución aquí usted puede olvidarse de plot(x,y,{'r','o','y','g','b'})).

    El truco es usar un surface en lugar de un line objeto. Las superficies se benefician de su CData propiedades y una gran cantidad de características útiles para aprovechar mapas a color y textura.

    Matlab surf no controla 1D datos, necesita de una matriz como de entrada, por lo que vamos a dar por simplemente duplicar cada conjunto de coordenadas (por ejemplo xx=[x,x]).

    Aunque no te preocupes, la superficie queda tan fina como una línea, por lo que el resultado final no es feo.

    %% //your data
    M=[140400 70.7850 1
     140401 70.7923 2
     140402 70.7993 3
     140403 70.8067 4
     140404 70.8139 5
     140405 70.8212 3];
    
    x = M(:,1) ; %//extract "X" column
    y = M(:,2) ; %//same for "Y"
    c = M(:,3) ; %//extract color index for the custom colormap
    
    %% //define your custom colormap
    custom_colormap = [
        1  0 0 ; ... %//red
        1 .5 0 ; ... %//orange
        1  1 0 ; ... %//yellow
        0  1 0 ; ... %//green
        0  0 1 ; ... %//blue
        ] ;
    
    %% //Prepare matrix data
    xx=[x x];           %//create a 2D matrix based on "X" column
    yy=[y y];           %//same for Y
    zz=zeros(size(xx)); %//everything in the Z=0 plane
    cc =[c c] ;         %//matrix for "CData"
    
    %//draw the surface (actually a line)
    hs=surf(xx,yy,zz,cc,'EdgeColor','interp','FaceColor','none','Marker','o') ;
    
    colormap(custom_colormap) ;     %//assign the colormap
    shading flat                    %//so each line segment has a plain color
    view(2) %//view(0,90)          %//set view in X-Y plane
    colorbar

    conseguirá que:

    El cambio de color de los gráficos 2D de la línea en función de la 3ª valor


    Como un ejemplo de un caso más general:

    x=linspace(0,2*pi);
    y=sin(x) ;
    
    xx=[x;x];
    yy=[y;y];
    zz=zeros(size(xx));
    
    hs=surf(xx,yy,zz,yy,'EdgeColor','interp') %//color binded to "y" values
    colormap('hsv')
    view(2) %//view(0,90)

    le dará una onda sinusoidal con el color asociado a la y valor:

    El cambio de color de los gráficos 2D de la línea en función de la 3ª valor

    Ahh muy agradable. +1.

    OriginalEl autor Hoki

  2. 6

    ¿Tiene Matlab R2014b o superior?

    Entonces usted podría utilizar un poco de indocumentados características introducidas por Yair Altman:

    n = 100;
    x = linspace(-10,10,n); y = x.^2;
    p = plot(x,y,'r', 'LineWidth',5);
    
    %//modified jet-colormap
    cd = [uint8(jet(n)*255) uint8(ones(n,1))].' %'
    
    drawnow
    set(p.Edge, 'ColorBinding','interpolated', 'ColorData',cd)

    El cambio de color de los gráficos 2D de la línea en función de la 3ª valor

    wow que genial! Cualquier manera de enlazar/escala el mapa de colores del valor Y del punto directamente, o tenemos que hacer la búsqueda/escala manualmente y crear las cd ?
    parece así por desgracia. El mapa de colores de las necesidades de tantos puntos como el actucal de datos.
    Wow! Muy bien hecho!

    OriginalEl autor thewaywewalk

  3. 0

    Mi efecto deseado se logra a continuación (simplificado):

            indices(1).index  = find( data( 1 : end - 1, 3) == 1);
    indices(1).color  = [1 0 0]; 
    indices(2).index  = find( data( 1 : end - 1, 3) == 2 | ...
                                      data( 1 : end - 1, 3) == 3);
    indices(2).color  = [1 1 0];
    indices(3).index  = find( data( 1 : end - 1, 3) == 4 | ...
                                      data( 1 : end - 1, 3) == 5);
    indices(3).color  = [0 1 0];
    indices(4).index  = find( data( 1 : end - 1, 3) == 10);
    indices(4).color  = [0 0 0];
    indices(5).index  = find( data( 1 : end - 1, 3) == 15);
    indices(5).color  = [0 0 1];
    % Loop through the locations of the values and plot their data points
    % together (This will save time vs. plotting each line segment
    % individually.)
    for iii = 1 : size(indices,2)
    % Store locations of the value we are looking to plot
    curindex = indices(iii).index;
    % Get color that corresponds to that value
    color = indices(iii).color;
    % Create X and Y that will go into plot, This will make the line
    % segment from P1 to P2 have the color that corresponds with P1
    x = [data(curindex, 1), data(curindex + 1, 1)]';
    y = [data(curindex, 2), data(curindex + 1, 2)]';
    % Plot the line segments
    hold on
    plot(x,y,'Color',color,'LineWidth',lineWidth1)            
    end

    OriginalEl autor JSZ

  4. 0

    Cuando el resultado de la figura de dos variables trazan un círculo, será necesario añadir el tiempo en z ejes.

    Por ejemplo la figura de la máquina de inducción de rotor de velocidad vs eléctrico de par de torsión en una prueba de laboratorio es: Gráfico 2d figura

    En la última figura la dirección de el momento en el trazado podría ser en sentido horario o antihorario. Para la última razón será el tiempo añadido en el eje z.

    % Wr vs Te
    x =  logsout.getElement( 'Wr' ).Values.Data; 
    y =  logsout.getElement( '<Te>' ).Values.Data;
    z =  logsout.getElement( '<Te>' ).Values.Time;
    % % adapt variables for use surf function
    xx = zeros( length( x ) ,2 );
    yy = zeros( length( y ) ,2 );
    zz = zeros( length( z ) ,2 );
    xx (:,1) = x; xx (:,2) = x;
    yy (:,1) = y; yy (:,2) = y;
    zz (:,1) = z; zz (:,2) = z;
    % % figure(1) 2D plot
    figure (1)
    hs = surf(xx,yy,zz,yy,'EdgeColor','interp') %//color binded to "y" values
    colormap('hsv')
    view(2) 
    % %
    figure(2)
    hs = surf(xx,yy,zz,yy,'EdgeColor','interp') %//color binded to "y" values
    colormap('hsv')
    view(3) 

    Finalmente podemos ver el formato 3d y detectar que counterwise es la dirección real de la época de trazado es: Gráfico 3d

    OriginalEl autor cals

Dejar respuesta

Please enter your comment!
Please enter your name here