How can I make a “color map” plot in matlab?

前端 未结 4 531
伪装坚强ぢ
伪装坚强ぢ 2020-12-12 17:16

I have some data (a function of two parameters) stored in a matlab format, and I\'d like to use matlab to plot it. Once I read the data in, I use mesh() to make

相关标签:
4条回答
  • 2020-12-12 17:52

    I also suggest using contourf(Z). For my problem, I wanted to visualize a 3D histogram in 2D, but the contours were too smooth to represent a top view of histogram bars.

    So in my case, I prefer to use jucestain's answer. The default shading faceted of pcolor() is more suitable. However, pcolor() does not use the last row and column of the plotted matrix. For this, I used the padarray() function:

    pcolor(padarray(Z,[1 1],0,'post'))
    

    Sorry if that is not really related to the original post

    0 讨论(0)
  • 2020-12-12 17:53

    By default mesh will color surface values based on the (default) jet colormap (i.e. hot is higher). You can additionally use surf for filled surface patches and set the 'EdgeColor' property to 'None' (so the patch edges are non-visible).

    [X,Y] = meshgrid(-8:.5:8);
    R = sqrt(X.^2 + Y.^2) + eps;
    Z = sin(R)./R;
    
    % surface in 3D
    figure;
    surf(Z,'EdgeColor','None');
    

    enter image description here

    2D map: You can get a 2D map by switching the view property of the figure

    % 2D map using view
    figure;
    surf(Z,'EdgeColor','None');
    view(2);    
    

    enter image description here

    ... or treating the values in Z as a matrix, viewing it as a scaled image using imagesc and selecting an appropriate colormap.

    % using imagesc to view just Z
    figure;
    imagesc(Z); 
    colormap jet; 
    

    enter image description here

    The color pallet of the map is controlled by colormap(map), where map can be custom or any of the built-in colormaps provided by MATLAB:

    enter image description here

    Update/Refining the map: Several design options on the map (resolution, smoothing, axis etc.) can be controlled by the regular MATLAB options. As @Floris points out, here is a smoothed, equal-axis, no-axis labels maps, adapted to this example:

    figure;
    surf(X, Y, Z,'EdgeColor', 'None', 'facecolor', 'interp');
    view(2);
    axis equal; 
    axis off;
    

    enter image description here

    0 讨论(0)
  • 2020-12-12 18:12

    gevang's answer is great. There's another way as well to do this directly by using pcolor. Code:

    [X,Y] = meshgrid(-8:.5:8);
    R = sqrt(X.^2 + Y.^2) + eps;
    Z = sin(R)./R;
    figure;
    subplot(1,3,1);
    pcolor(X,Y,Z); 
    subplot(1,3,2);
    pcolor(X,Y,Z); shading flat;
    subplot(1,3,3);
    pcolor(X,Y,Z); shading interp;
    

    Output:

    enter image description here

    Also, pcolor is flat too, as show here (pcolor is the 2d base; the 3d figure above it is generated using mesh):

    enter image description here

    0 讨论(0)
  • 2020-12-12 18:18

    Note that both pcolor and "surf + view(2)" do not show the last row and the last column of your 2D data.

    On the other hand, using imagesc, you have to be careful with the axes. The surf and the imagesc examples in gevang's answer only (almost -- apart from the last row and column) correspond to each other because the 2D sinc function is symmetric.

    To illustrate these 2 points, I produced the figure below with the following code:

    [x, y] = meshgrid(1:10,1:5);
    z      = x.^3 + y.^3;
    
    subplot(3,1,1)
    imagesc(flipud(z)), axis equal tight, colorbar
    set(gca, 'YTick', 1:5, 'YTickLabel', 5:-1:1);
    title('imagesc')
    
    subplot(3,1,2)
    surf(x,y,z,'EdgeColor','None'), view(2), axis equal tight, colorbar
    title('surf with view(2)')
    
    subplot(3,1,3)
    imagesc(flipud(z)), axis equal tight, colorbar
    axis([0.5 9.5 1.5 5.5])
    set(gca, 'YTick', 1:5, 'YTickLabel', 5:-1:1);
    title('imagesc cropped')
    
    colormap jet
    

    surf vs imagesc

    As you can see the 10th row and 5th column are missing in the surf plot. (You can also see this in images in the other answers.)

    Note how you can use the "set(gca, 'YTick'..." (and Xtick) command to set the x and y tick labels properly if x and y are not 1:1:N.

    Also note that imagesc only makes sense if your z data correspond to xs and ys are (each) equally spaced. If not you can use surf (and possibly duplicate the last column and row and one more "(end,end)" value -- although that's a kind of a dirty approach).

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