【Matlab】去除图片周围空白区域(plot subplot)

标签: matlab
6375人阅读 评论(0) 收藏 举报
分类:

1. 原理

figure如同一张画布,axes是坐标轴用来控制所画图的位置和大小。

在matlab的帮助文档中Graphics->Formatting and Annotation->Coordinate System->Properties->Axes Properties有axes的属性,在Location and Size中可以看到主要有:

Position

TightInset

OuterPosition

下图是三者的关系,OuterPosition是外边框(红色虚线),Position是内边框(绿色实线),TightInset是有效边界(蓝色)与Position之间的部分(理解它才能自定义axes)。

图片引自matlab帮助手册。

2. plot画出来的图的空白边缘消除

Plot画出来的为单一的一张图,与之对应的是subplot,在一个figure中画多个图。消除Plot的空白区域有3种方法。

2.1

加一句命令即可:

set(gca,'LooseInset',get(gca,'TightInset'))

去除的不是很完全。

2.2

加一句命令即可:

set(gca,'looseInset',[0 0 0 0])

2.3

第3种要麻烦一些,我把它写成了一个函数,方便调用,如果您有需要,只需要在您的代码中使用该函数即可:

% RemovePlotWhiteArea: 去除Plot画的图的空白部分
% RemovePlotWhiteArea(gca)
% 输入
% gca: axes句柄

% author : TSC
% time   : 2017-01-02
% email  : 292936085#qq.com(将#替换为@)

function [] = RemovePlotWhiteArea(gca)
% TightInset的位置
inset_vectior = get(gca, 'TightInset');
inset_x = inset_vectior(1);
inset_y = inset_vectior(2);
inset_w = inset_vectior(3);
inset_h = inset_vectior(4);

% OuterPosition的位置
outer_vector = get(gca, 'OuterPosition');
pos_new_x = outer_vector(1) + inset_x; % 将Position的原点移到到TightInset的原点
pos_new_y = outer_vector(2) + inset_y;
pos_new_w = outer_vector(3) - inset_w - inset_x; % 重设Position的宽
pos_new_h = outer_vector(4) - inset_h - inset_y; % 重设Position的高

% 重设Position
set(gca, 'Position', [pos_new_x, pos_new_y, pos_new_w, pos_new_h]);

2.4 结果

测试代码:

% 去除一张图片周围的空白区域
% ************************************************************************* 
remove_flag = 3; %1,2,3 任选一种查看效果
% -------------------------------------------------------------------------
x = 0:0.1:10;
y = sin(x);

figure('color', [0.8, 0.8, 0.8]); % 为区分边界,将底色改为灰色
set(gcf, 'InvertHardCopy', 'off'); % 让设置的背景色有效
plot(x,y);
title('sinx');
xlabel('x');
ylabel('y');

% 去除空白的第1种方式
if 1 == remove_flag
    set(gca,'LooseInset',get(gca,'TightInset'))
end

% 去除空白的第2种方式
if 2 == remove_flag
    set(gca,'looseInset',[0 0 0 0])
end

% 去除空白的第3种方式
if 3 == remove_flag
    RemovePlotWhiteArea(gca);
end

set(gcf, 'PaperPositionMode', 'auto');
print(gcf, '-djpeg', '-r300', ['respic/', num2str(remove_flag), '.jpg']);

结果图片:

原图:

去除空白的第1种方式:

去除空白的第2种方式:

去除空白的第3种方式

3. subplot画出来的图的空白边缘消除

3.1 code

subplot以子图的形式画多幅图,所以有多少axes需要控制,比起plot要复杂一些。

原理是一样的,先把每个子图的位置和大小定下来,再设置每个子图里面axes的位置和大小,直接给出函数:

% RemoveSubplotWhiteArea: 去除subplot周围的空白部分
% RemoveSubplotWhiteArea(gca, sub_row, sub_col, current_row, current_col)
% 输入
% gca         :axes句柄
% sub_row     :subplot的行数
% sub_col     :subplot的列数
% current_row :当前列数
% current_col :当前行数
%
% 注意:使用如下语句,print保存图片的时候使其按照设置来保存,否则修改无效
% set(gcf, 'PaperPositionMode', 'auto');

% author : TSC
% time   : 2017-01-02
% email  : 292936085#qq.com(将#替换为@)

function [] = RemoveSubplotWhiteArea(gca, sub_row, sub_col, current_row, current_col)
% 设置OuterPosition
sub_axes_x = current_col*1/sub_col - 1/sub_col;
sub_axes_y = 1-current_row*1/sub_row; % y是从上往下的
sub_axes_w = 1/sub_col;
sub_axes_h = 1/sub_row;
set(gca, 'OuterPosition', [sub_axes_x, sub_axes_y, sub_axes_w, sub_axes_h]); % 重设OuterPosition

% TightInset的位置
inset_vectior = get(gca, 'TightInset');
inset_x = inset_vectior(1);
inset_y = inset_vectior(2);
inset_w = inset_vectior(3);
inset_h = inset_vectior(4);

% OuterPosition的位置
outer_vector = get(gca, 'OuterPosition');
pos_new_x = outer_vector(1) + inset_x; % 将Position的原点移到到TightInset的原点
pos_new_y = outer_vector(2) + inset_y;
pos_new_w = outer_vector(3) - inset_w - inset_x; % 重设Position的宽
pos_new_h = outer_vector(4) - inset_h - inset_y; % 重设Position的高

% 重设Position
set(gca, 'Position', [pos_new_x, pos_new_y, pos_new_w, pos_new_h]);

3.2 结果

测试代码

% 去除subplot画出来的图的周围空白部分
x = 0:0.1:10;
y = sin(x);

figure('color', [0.8, 0.8, 0.8], 'position', [100, 100, 800,400]);  % 为区分边界,将底色改为灰色
set(gcf, 'InvertHardCopy', 'off'); % 让设置的背景色有效
sub_row = 4; % 子图行数
sub_col = 4; % 子图列数
for i_row = 1 : sub_row
    for j_col = 1 : sub_col
        order = (i_row-1)*sub_col+j_col; % 子图的顺序
        subplot(sub_row, sub_col, order);
        plot(y);
        title([num2str(i_row), num2str(j_col)]);
        xlabel('x');
        ylabel('y');
        RemoveSubplotWhiteArea(gca, sub_row, sub_col, i_row, j_col); % 去除空白部分
    end
end
set(gcf, 'PaperPositionMode', 'auto'); % 使print出来的与屏幕显示大小相同
print(gcf, '-djpeg', '-r300', ['respic/sub', num2str(sub_row), num2str(sub_col), '.jpg']);

结果图片

1行1列:

2行1列:

1行2列:

2行2列:

3行3列:

4行4列:

可以看到,3行3列和4行4列左边还是有一点点空白,我不能消除了,对axes的原理还是有疑问的,暂时这样吧。

查看评论

Matlab画图技巧之消除空白

写报告或论文时,为了充分利用篇幅和实现紧凑美观,我们常常想要得到空白冗余较小的图,这在Tikz里面十分容易实现。但是在Matlab里需要做很多的工作才能达到目的。Matlab默认的图空白十分大,看起来...
  • He_MM
  • He_MM
  • 2016-07-20 19:57:00
  • 3058

matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域

最近在作图时需要将输出的图片紧密排布,还要去掉坐标轴,同时设置输出图片大小。但是发现matplotlib使用plt.savefig()保存的图片周围有一圈空白。那么如何去掉该空白呢?首先,关闭坐标轴显...
  • jifaley
  • jifaley
  • 2018-03-25 15:37:24
  • 219

Matlab-----给matlab绘图加边框,解决边框缺失

解决如图: 如图,matlab出图没有边框 ,可用box on/off控制。
  • yf210yf
  • yf210yf
  • 2017-03-28 09:47:40
  • 7193

Matlab画图如何去掉图形框右边和上边的刻度

用matlab画图比较方便快捷,但是图形框的邮编和上边容易出现刻度,这往往是不需要的,可通过如下语句将其去掉: box off ax2 = axes('Position',get(gca,'Posi...
  • zqliu133
  • zqliu133
  • 2017-03-08 11:16:58
  • 4625

用python去除图片白色像素

以下代码是把一个文件夹里的所有图片的 白色像素去掉,制作透明png图片 需要python和pil from PIL import Image import os for fil...
  • kanesunny
  • kanesunny
  • 2015-06-04 07:51:41
  • 1353

Matlab画图,去掉周围白边

Matlab画出来的图,四周有一些空格区域,如何去掉这些不必要的周围白边呢? 方法一: 利用截图工具进行截图,保存图片质量非常低,分辨率低,无法保存为矢量图,不推荐使用。 方法二...
  • GarfieldEr007
  • GarfieldEr007
  • 2016-06-10 20:24:41
  • 4304

【Matlab画图】如何去除Matlab图形中的边界

有时候需要将Matlab画的图插到wenzha
  • fallian
  • fallian
  • 2014-08-23 19:46:56
  • 4146

matlab保存figure中的图片去掉白边

输出图片成可直接调入的灰度图,设置输出图片空白边距,以及调整图片大小,纵横比。 一、先显示图片,imshow。如果是plot,或者newplot,直接看“三”。 imshow(strain_i...
  • gxuan
  • gxuan
  • 2013-04-07 15:49:17
  • 38012

Matlab:不包含边界和工具栏的figure(移除保存图片的白边)

当我们使用matlab的imshow命令显示图片时,会有白框和工具栏出现。在保存图片时会出现白色的边框。下面将说明如何去除这些显示。 Matlab启动时运行脚本'script.m',文件位置在...
  • resorcap
  • resorcap
  • 2014-04-15 21:01:27
  • 4614

matlab图形去白边

  • 2017年01月31日 21:49
  • 2KB
  • 下载
    简介
    个人资料
    持之以恒
    等级:
    访问量: 24万+
    积分: 3264
    排名: 1万+
    最新评论