Matlab图片处理函数小记

本文总结一下自己写论文时候用的图片处理函数和命令。

论文图片处理:

如何将Visio绘制的图保存为300dpi的tif图片

Word 转PDF图片不清晰解决方法

word转换为pdf后图片失真的解决办法

常用命令

坐标轴设置

坐标轴刻度设定
ylim([-1600 1600])
set(gca,'ytick',[-1600:500:1600])

坐标轴标记设定

x=[150 300 450 600 750 900 1050 1200 1350 1500 ];
set(gca,'XTickLabel',x)

坐标轴刻度及标注字体大小

set(gca,'FontSize',12);

坐标轴标注字体大小

set(get(gca,'YLabel'),'Fontsize',12)

坐标轴标注的方向

xlabel('speed','rotation',15);

更改坐标轴朝向

   set(gca,'YDir','reverse')                %逆转y轴 使其顺序为从上到下递增
   set(gca,'XAxisLocation','top')           %将X轴置于顶部

Plot命令总结

MATLAB中提供的线型属性有:

线型

说明

标记符

说明

颜色

说明

-

实线(默认)

+

加号符

r

红色

--

双划线

o

空心圆

g

绿色

:

虚线

*

星号

b

蓝色

:.

点划线

.

实心圆

c

青绿色

x

叉号符

m

洋红色

s

正方形

y

黄色

d

菱形

k

黑色

^

上三角形

w

白色

v

下三角形

>

右三角形

<

左三角形

p

五角星

h

六边形


LineWidth——指定线宽
MarkerEdgeColor——指定标识符的边缘颜色
MarkerFaceColor——指定标识符填充颜色
MarkerSize——指定标识符的大小

Matlab中使用Latex: http://blog.sina.com.cn/s/blog_665f991f0100nubf.html

其他函数

ezplot('sin(x)',[-2,2]) 使用此方法可以指定定义域

Matlab中plot、fplot、ezplot的使用方法和区别

常用函数

紧凑画图

function ha = tight_subplot (Nh, Nw, gap, marg_h, marg_w)
%TIGHT_SUBPLOT suplot子图间距调整,自适应调整间距、空白
% 代码参考: http://blog.csdn.net/lanchunhui/article/details/49820721
% 
% 输入:行数Nh,列数Nw 用法同subplot(row,col)
%        gap     归一化坐标轴间间距 (0...1)
%                or [gap_h gap_w] 垂直、水平 for different gaps in height and width 
%        marg_h  归一化上下边距 (0...1)
%                or [lower upper] for different lower and upper margins 
%        marg_w  归一化左右边距 (0...1)
%                or [left right] for different left and right margins 
% 输出:ha  子图的句柄数组
%                   starting from upper left corner, going row-wise as in
%                   going row-wise as in
%
%  Example: ha = tight_subplot(3,2,[.01 .03],[.1 .01],[.01 .01])
%           for ii = 1:6; axes(ha(ii)); plot(randn(10,ii)); end
%           set(ha(1:4),'XTickLabel',''); set(ha,'YTickLabel','')


if nargin<3; gap = .02; end
if nargin<4 || isempty(marg_h); marg_h = .05; end
if nargin<5; marg_w = .05; end

if numel(gap)==1 
    gap = [gap gap];
end
if numel(marg_w)==1 
    marg_w = [marg_w marg_w];
end
if numel(marg_h)==1 
    marg_h = [marg_h marg_h];
end

axh = (1-sum(marg_h)-(Nh-1)*gap(1))/Nh; 
axw = (1-sum(marg_w)-(Nw-1)*gap(2))/Nw;

py = 1-marg_h(2)-axh; 
k=0;
ha = zeros(Nh*Nw,1);

for ih = 1:Nh
    px = marg_w(1);
    for ix = 1:Nw
        k = k+1;
        ha(k) = axes('Units','normalized','Position',[px py axw axh], ...
            'XTickLabel','', 'YTickLabel','');
        px = px+axw+gap(2);
    end
    py = py-axh-gap(1);
end

由fig仿真/实验图分析电流THD

 
%BYN_FFTBOX Compute Current THD, based on Matlab FFT Analysis Tool, code by Byn 170502
% 该脚本用于计算fig图中的电流THD,仿真、实验图均可,ver 1.0
% 调用Matlab自带的FFT分析函数,会计算分数次谐波,计算结果与Simulink FFT分析的结果完全一致
% 可按照需求枚举基频(通常异步电机需要这个功能),可选从fig名中自动读取基频
% 可选择同时显示转矩、电流、THD在一张图中
% 目前代码中还有些冗余,可继续优化,未来可添加转矩纹波,转矩峰峰值等功能
% 在Matlab R2016b 环境下编写

%% 参数设置
figname='d50.fig';
ia_id=4; % 电流在fig中的通道号
te_id=2; % 转矩在fig中的通道号
WL_flag=0; % 是否采用枚举法确定基频,0不使用,1使用
first=50; last=51; delta=0.1; % 起始频率,结束频率,枚举步长
cycle=2;  % 计算周期
XLabelStyle=2; %x 1: harmonic order; 2: frequency (Hz)
start=0; % 从波形的什么时刻开始计算
Te_plot=0; % 0:仅绘制电流及THD, 1:同时绘制转矩波形
maxFrequency=20e3;  % 最大绘图显示频率(均计算到Nyquest频率)

% tmp=regexp(figname,'\d*\.?\d*','match'); first=str2double(tmp{1,1}); % 从文件名自动读取基频

%% 读入fig图
clear lh n gcf
open(figname);
lh=findall(gcf,'type','line');
n=numel(lh);
if n==0
    error('获取图片信息失败!检查待处理图片是否在工作目录。');
end
x=get(lh(n-ia_id+1),'xdata')'; % 时间
y=zeros(numel(x),2);
y(:,1)=get(lh(n-te_id+1),'ydata')'; % 转矩
y(:,2)=get(lh(n-ia_id+1),'ydata')'; % 电流

%% 构造示波器结构体
myscope.time=x;
myscope.blockName='UserBuildFromOutData';
myscope.signals.values=y(:,2);
myscope.signals.dimensions=1;
myscope.signals.label=[];
myscope.signals.title=[];
myscope.signals.plotStyle=0;

%% 求取THD 单纯求取 或 枚举最小值后求取
if WL_flag == 0
    FFTDATA=Matlab_FFT (myscope,start,first,maxFrequency,cycle); %仅包含电流的示波器结构体,起始计算时间,基波,最大频率,周期数
else
    freq_fund=1e6; min_thd=1e6;
    for f=first:delta:last
        FFTDATA=Matlab_FFT (myscope,start,f,maxFrequency,cycle);
        if FFTDATA.THD<min_thd
            min_thd=FFTDATA.THD;
            freq_fund=f;
        end
    end
    FFTDATA=Matlab_FFT (myscope,start,freq_fund,20e3,cycle);
    disp(['基频 ',num2str(freq_fund),' Hz THD = ',num2str(min_thd),'%'])
end

%% 绘图
gcf=figure('NumberTitle', 'off', 'Name',[figname(1:end-4),' THD']);
set(gcf,'PaperSize',[680,480],'color','w');

cut=[FFTDATA.startTime FFTDATA.startTime+1.0/FFTDATA.fundamental*FFTDATA.cycles];  %截取区间
tmp=find(x>=cut(1) & x<=cut(2));
x=x(tmp)-cut(1);
y=y(tmp,:);

if Te_plot==1
    ha = tight_subplot(3,1,[.1 .3],[.11 .06],[.1 .03]);
    axes(ha(1)); plot(x,y(:,1), 'k');ylabel('T_e(Nm)');  ylim([-2 2]); grid on
    xlabel('t/s');
    set(ha(1),'XTick',0:1/FFTDATA.fundamental/2:2/FFTDATA.fundamental,'XLim',[0,2/FFTDATA.fundamental])
    myTHDplot(ha(2:3),FFTDATA,x,y(:,2),XLabelStyle)
else
    ha = tight_subplot(2,1,[.15 .3],[.11 .06],[.1 .03]);
    myTHDplot(ha,FFTDATA,x,y(:,2),XLabelStyle)
    axes(ha(1));xlabel('t/s');
end

clear gcf lh ha myscope FFTDATA
clear cut cycle delta figname first freq_fund ha ia_id last
clear n start te_id Te_plot tmp WL_flag x y XLabelStyle maxFrequency


%% 绘制原始波形和THD频谱
function myTHDplot(ha,FFTDATA,x,y,XLabelStyle)
% 输入 坐标轴句柄,FFT结构体,时间坐标,电流数据,x轴标注类型
freq_fund=FFTDATA.fundamental;
freq1=FFTDATA.freq;
mag1=FFTDATA.mag;

v1=FFTDATA.magFundamental;
nb_cycles=FFTDATA.cycles;
% nfmax=FFTDATA.maxFrequency;
order=floor(FFTDATA.freq(end)/FFTDATA.fundamental);

% subplot(211)  %  画原始波形
axes(ha(1));
plot(x,y,'k');ylabel('i_{a}/A');grid on
%xlabel('t/s');
% ylabel('U_{ab}/V')
set(gca,'XTick',0:1/freq_fund/2:nb_cycles/freq_fund,'XLim',[0,nb_cycles/freq_fund])
axis([0 nb_cycles/freq_fund min(y)*1.2 max(y)*1.2])

% subplot(212)  %  画频谱
axes(ha(2));
if XLabelStyle==1  % Harmonic order
    bar(freq1/freq_fund,mag1/v1*100,'k')
    xlabel('Harmonic order'),
    ylabel('H_{n}/H_{1} (%)'),
    axis([0 order 0 max(mag(nb_cycles+2:end))/v1*120])  % 显示范围为幅值最高的谐波
else % display frequency (Hz) at xlabel
    bar(freq1,mag1/v1*100,'k')
    xlabel('Frequency (kHz)'),
    ylabel('H_{n}/H_{1} (%)'),
    axis([0 max(freq1) 0 max(mag1(nb_cycles+2:end))/v1*120]) 
    set(ha(2),'XTickLabel',0:max(freq1)/1000/10:max(freq1)/1000); % 将标度由Hz转换为kHz
%     clear gcf
end

q=['Fundamental ( ',num2str(freq_fund),'Hz ) = ',num2str(v1),', THD = ',num2str(FFTDATA.THD),'%'];
% q=['THD = ',num2str(FFTDATA.THD),'%'];
title(q)
disp(q)
end


%% Matlab FFT Analysis Tool
% reference http://cn.mathworks.com/help/physmod/sps/powersys/ref/power_fftscope.html;jsessionid=db0b9a8ee73742bf537d1f0a3291?refresh=true
function FFTDATA=Matlab_FFT (myscope,start,fundamental,maxFrequency,cycle)
% 输入:仅包含电流的示波器结构体,起始计算时间,基波,最大频率,周期数
% 输出 FFT结构体
FFTDATA = power_fftscope(myscope);

FFTDATA.startTime=start;
FFTDATA.cycles=cycle;
FFTDATA.fundamental=fundamental;
FFTDATA.maxFrequency=maxFrequency+1; % 这里+1不会影响计算结果,只是为了画图时横轴坐标更好处理

FFTDATA=power_fftscope(FFTDATA);
% power_fftscope(FFTDATA)

end

function ha = tight_subplot (Nh, Nw, gap, marg_h, marg_w)
%TIGHT_SUBPLOT suplot子图间距调整,自适应调整间距、空白
% code by Byn 161110 ver 1.0
% 代码参考: http://blog.csdn.net/lanchunhui/article/details/49820721
% 
% 输入:行数Nh,列数Nw 用法同subplot(row,col)
%        gap     归一化坐标轴间间距 (0...1)
%                or [gap_h gap_w] 垂直、水平 for different gaps in height and width 
%        marg_h  归一化上下边距 (0...1)
%                or [lower upper] for different lower and upper margins 
%        marg_w  归一化左右边距 (0...1)
%                or [left right] for different left and right margins 
% 输出:ha  子图的句柄数组
%                   starting from upper left corner, going row-wise as in
%                   going row-wise as in
%
%  Example: ha = tight_subplot(3,2,[.01 .03],[.1 .01],[.01 .01])
%           for ii = 1:6; axes(ha(ii)); plot(randn(10,ii)); end
%           set(ha(1:4),'XTickLabel',''); set(ha,'YTickLabel','')


if nargin<3; gap = .02; end
if nargin<4 || isempty(marg_h); marg_h = .05; end
if nargin<5; marg_w = .05; end

if numel(gap)==1 
    gap = [gap gap];
end
if numel(marg_w)==1 
    marg_w = [marg_w marg_w];
end
if numel(marg_h)==1 
    marg_h = [marg_h marg_h];
end

axh = (1-sum(marg_h)-(Nh-1)*gap(1))/Nh; 
axw = (1-sum(marg_w)-(Nw-1)*gap(2))/Nw;

py = 1-marg_h(2)-axh; 
k=0;
ha = zeros(Nh*Nw,1);

for ih = 1:Nh
    px = marg_w(1);
    for ix = 1:Nw
        k = k+1;
        ha(k) = axes('Units','normalized','Position',[px py axw axh], ...
            'XTickLabel','', 'YTickLabel','');
        px = px+axw+gap(2);
    end
    py = py-axh-gap(1);
end
end

波特图

% Buck 黑色实线
L=370e-6;C=100e-6;R=8;
DCR=0; ESR=0; Vin=30; Vpwm=1/28;
a=L*C*(1+ESR/R);
b=L/R+DCR*C*(1+ESR/R)+ESR*C;
c=1+DCR/R;
d=Vpwm*Vin*ESR*C;
e=Vpwm*Vin;
G=tf([d,e],[a,b,c]);  % 传函
bode(G,P,'k')                % 波特图
% margin(G)            % 显示相位裕度

%% PI 蓝色
hold on
kp=7.59;
ki=477;
H=tf([kp,ki],[1,0]);  % PI传函
bode(H,P,'b')

%% 合成 红色
hold on
T=tf([kp*d, kp*e+ki*d, ki*e],[a,b,c,0]);  % 合成
P=bodeoptions;      
P.Grid='on';          % 绘制网格
P.XLim={[1 100000]};% 调整横轴
P.FreqUnits='Hz';     % 横轴以频率为单位
P.XLabel.FontSize=10; % 横轴题注字体大小
P.title.String='';
bode(T,P,'r') 

h = findobj(gcf, 'Type','line'); % 取句柄
set(h,'LineWidth',1.5);
% set(h,'LineWidth',1.5,'Color','[0.72,0.27,1]');
set(gca,'FontSize',12)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值