Tight subplot with colorbars and subplot's 3rd parameter in Matlab?

后端 未结 2 482
天涯浪人
天涯浪人 2021-01-16 18:59

I would like to have a tight subplot i.e. minimum spacing between figures in the subplot where

  • you have subplot\'s 3rd parameter i.e. you can decide where the
相关标签:
2条回答
  • 2021-01-16 19:11

    The third parameter of tight_subplot defines the gaps between axis objects. For the built-in subplot command, the third parameter defines which axis is set as the CurrentAxes of the Figure. This option is not available in tight_subplot because I personally did not find it useful. Typically, I use the returned axes handles to specify where to add graphics.

    Existing axes objects are repositioned when you add a colorbar.

    I have added a second output argument to tight_subplot which provides the output position of the axes so that you can "reset" the axes positions after adding a colorbar.

    [hax, position] = tight_subplot();
    
    % Add a colorbar which alters the positions
    colorbar();
    
    % Now reset the positions back to where they were
    set(hax, {'Position'}, pos);
    
    0 讨论(0)
  • 2021-01-16 19:19

    Rather than trying to deal with subplot and different versions on the file exchange, I would probably just manually set the positions of my axes objects to get the effect that you want. You can use normalized units so that the positions scale as the size of the parent figure changes.

    Also, you can set the OuterPosition property of the axes which takes into account the room needed to properly display all text labels of the axes.

    figure
    
    data=randi(513,513);
    
    set(0, 'defaultaxeslooseinset', [0 0 0 0])
    
    D = mat2gray(pdist(data, 'correlation'));
    square = squareform(D, 'tomatrix');
    
    % Set normalized outer position (x,y,width,height)
    ax1 = axes('OuterPosition', [0, 0.5, 1, 0.5]);
    plot(D, 'Parent', ax1);
    set(ax1, 'XLim', [0, size(square, 1)])
    axis(ax1, 'square');
    
    cbar1 = colorbar();
    set(cbar1, 'Visible', 'off')
    
    % Set normalized outer position (x,y,width,height)
    ax2 = axes('OuterPosition', [0 0 1 0.5]);
    imshow(square);
    colormap('parula'); colorbar;
    axis(ax2, 'square');
    

    And if you remove the x and y ticks on the axes

    set([ax1,ax2], 'xtick', [], 'ytick', []);
    

    This can easily be adapted to any dimensions with something similar to the following

    figure;
    % [Rows, Columns]
    axdim = [3, 3];
    
    width = 1 ./ axdim(2);
    height = 1./ axdim(1);
    
    [x,y] = meshgrid(linspace(0,1,axdim(2)+1), ...
                     linspace(0,1, axdim(1)+1));
    
    for k = 1:numel(x)
        ax = axes('OuterPosition', [x(k), y(k), width, height]);
        set(ax, 'xtick', [], 'ytick', []);
    end
    
    0 讨论(0)
提交回复
热议问题