关闭

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

标签: matlab
5064人阅读 评论(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的原理还是有疑问的,暂时这样吧。

2
0
查看评论

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

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

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

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

matlab保存图片不带白边的方法

imshow(strain_image,'border','tight','initialmagnification','fit'); set (gcf,'Position',[0,0,500,500]); 就是上面...
  • jzwong
  • jzwong
  • 2016-11-26 11:21
  • 1715

matlab画图,如何消除图形中多余的空白区域

matlab图形的gca中,主要由position、outerPostion、以及tightInset来决定坐标轴,图形,标注等的位置。举例如下: N = 100; x = 1:N; y = rand(1,N); set(gcf, 'PaperSize', [5 3], '...
  • xuejiren
  • xuejiren
  • 2014-06-17 10:46
  • 11882

subplot上标记、画图

用subplot画图后,如何在每个子图下方添加标题,直接用title,则显示的内容是在默认的图形上方,而不是在图形的下方。若要求在每个图形下方加标题,如一幅图中用subplot画了3个子图,如何在每个子图下方加标题,  该怎么实现呢? 可用xlabel。 ...
  • qing101hua
  • qing101hua
  • 2015-05-07 22:52
  • 587

Matlab的SUBPLOT的图像大小调整

解决方法: (1)subplot的子窗口都是固定的,其设置是内置的默认值,你可以通过axes函数来重新规定子窗口的大小和位置。如: axes('position',[.1  .1  .8  .6]) mesh(pe...
  • u013011415
  • u013011415
  • 2015-04-30 21:08
  • 6332

matlab控制图像的边界(margin),subplot的间距(gap)

使用subplot(row, col, i)创建的子图,matlab会隐式地调整它们的间距以及它们和整个figure的边距,以达到它所认为的美观或者合理的设置,然而如果我们想根据需求设置合理的间距以及边距,该怎么定制呢?这里提供一个函数(是在没必要把时间花费在这种繁琐的格式上):function h...
  • lanchunhui
  • lanchunhui
  • 2015-11-13 17:17
  • 10317

Matlab画图技巧之消除空白

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

如何在去掉空数据及如何在matplotlib中显示数据线性拟合

自己自学机器学习用Python实现,希望志同道合的朋友加入我们一起学习一起进步。
  • u014727529
  • u014727529
  • 2017-10-11 09:04
  • 206

【python】matplotlib在把坐标轴移到中间后如何去掉两个坐标轴上多余的一个0?

问题在【python】matplotlib生成散点矩阵图 中,画出的图把坐标轴移动到中间后,x和y轴的0需要去掉一个。这个如何办到?解决获取坐标轴后,用坐标轴的函数set_yticks或者set_xticks来设置轴显示的标记。 但是,需要注意函数set_yticks或者set_xticks的使用...
  • shanchuan2012
  • shanchuan2012
  • 2016-04-24 09:02
  • 4551
    简介
    个人资料
    • 访问:206100次
    • 积分:2990
    • 等级:
    • 排名:第13915名
    • 原创:112篇
    • 转载:0篇
    • 译文:2篇
    • 评论:23条
    最新评论