Change color of 2D plot line depending on 3rd value

前端 未结 5 1976
Happy的楠姐
Happy的楠姐 2020-11-30 10:40

I have a data set that looks like this

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

相关标签:
5条回答
  • 2020-11-30 11:02

    You can also do it with a trick which works with Matlab version anterior to 2014b (as far back as 2009a at least).
    However, is will never be as simple as you expected (unless you write a wrapper for one of the solution here you can forget about plot(x,y,{'r','o','y','g','b'})).

    The trick is to use a surface instead of a line object. Surfaces benefit from their CData properties and a lot of useful features to exploit color maps and texture.

    Matlab surf does not handle 1D data, it needs a matrix as input so we are going to give it by just duplicating each coordinate set (for example xx=[x,x]).
    Don't worry though, the surface will stay as thin as a line, so the end result is not ugly.

    %% // 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
    

    will get you:
    cmapline


    As an example of a more general case:

    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)
    

    will give you a sine wave with the color associated to the y value:
    cmapline2

    0 讨论(0)
  • 2020-11-30 11:02

    Do you have Matlab R2014b or higher?

    Then you could use some undocumented features introduced by 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)
    

    0 讨论(0)
  • 2020-11-30 11:03

    My desired effect was achieved below (simplified):

            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
    
    0 讨论(0)
  • 2020-11-30 11:05

    When the result figure of two variables plotted is a circle, will be necessary to add the time in z axes.

    For example the figure of induction machine rotor velocity vs electric torque in one laboratory test is: 2d plot figure

    In the last figure the direction of the time point plotting could be clockwise or counter clockwise. For the last reason will be added time in z axis.

    % 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) 
    

    Finally we can view the 3d form and detect that counterwise is the real direction of the time plotting is: 3d plot

    0 讨论(0)
  • 2020-11-30 11:07

    Scatter can plot the color according to the value and shows the colormap of the range of values. It's hard to interpolate the color though if you want continuous curves.

    Try:

    figure
    i = 1:20;
    t = 1:20;
    c = rand(1, 20) * 10;
    scatter(i, t, [], c, 's', 'filled')
    colormap(jet)
    

    The figure looks like

    0 讨论(0)
提交回复
热议问题