找回密码
 注册
关于网站域名变更的通知
查看: 467|回复: 2
打印 上一主题 下一主题

Matlab plotyy画双纵坐标图实例分享

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-4-17 09:36 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 thinkfunny 于 2020-4-17 09:39 编辑 $ |; k* U/ v9 k% {1 f
3 M6 `+ A# Q9 w; ?8 g* T6 V7 ~

Matlab plotyy画双纵坐标图实例

x = 0:0.01:20;
5 u0 i' Z  ?8 }) Y) N* {! L  Q6 `y1 = 200*exp(-0.05*x).*sin(x);: ~$ S9 S9 K- ~9 \
y2 = 0.8*exp(-0.5*x).*sin(10*x);$ j/ e4 S0 B* B- g2 Y& v
[AX,H1,H2] = plotyy(x,y1,x,y2,'plot');

set(AX(1),'XColor','k','YColor','b');
4 l1 {9 @& l% C' P) Q- G) M* Q  |set(AX(2),'XColor','k','YColor','r');

HH1=get(AX(1),'Ylabel');; U: d/ `9 R6 G! x3 E
set(HH1,'String','Left Y-axis');
+ `1 X  u; J8 x$ Q- Kset(HH1,'color','b');

HH2=get(AX(2),'Ylabel');: p& ]2 T$ C( Q+ S3 G+ m1 p
set(HH2,'String','Right Y-axis');
  v2 h2 {2 U8 g5 M- w. A9 Uset(HH2,'color','r');

set(H1,'LineStyle','-');. J3 n- R  V' M  s. |0 o
set(H1,'color','b');
5 i$ J+ z. l; Rset(H2,'LineStyle',':');6 V; F2 @. \/ N$ b& q  j
set(H2,'color','r');

legend([H1,H2],{'y1 = 200*exp(-0.05*x).*sin(x)';'y2 = 0.8*exp(-0.5*x).*sin(10*x)'});  N$ v" V9 T1 ^/ J7 m' z- W' N
xlabel('Zero to 20 musec.');. q* j' |" T7 |# {+ g: L. K
title('Labeling plotyy');

3 E8 K, i8 N8 P1 V, ?& y3 @
4 C' r& n0 Z& p5 E& h

Q:右边用蓝色圈起来的tick能去掉吗?由于用plotyy画图,为了使图尽量地显示出来,用了set(AX(1),'YLimMode','auto'),但这样可能会导致左边AX(1)和右边AX(2)的tick的间距不一样,影响美观。或者说能不能使plotyy画出的图两边的tick间距是一样的,这样在图形右边的tick就会重合在一起.

A:如果只是想让plotyy的图美一些,可以使用其如下形式的调用方式:: p7 E  X5 w/ L. j
[AX,H1,H2] = plotyy(...)
6 H! J  b5 ?8 E$ w* e+ c其中AX(2)就是右边Axes对象的句柄,拿到它以后就可以set或者get来处理了,也可以把其ytick关掉。

A:也可以用line语句来画,就没有左边和上边的线了。

Q:plotyy(X1,Y1,X2,Y2,FUN1,FUN2),FUN1和FUN2应该怎么写?

A:这两个FUN代表plotyy不一定要用两个plot,比如下面的例子,一条曲线用plot,一条用semilogy3 {) C2 v  q8 I" v, h& Z) ]

0 i; Y% C9 g% ~# A$ ]! Ax1=1:0.1:100;
8 F# X) [. @; l* o! u& y; ?x2=x1;, Q, G$ u3 }7 B
y1=x1;; I$ m  O6 F+ U4 u
y2=x2.^3;
0 \# l2 \* d$ V: y0 x# gplotyy(x1,y1,x2,y2,@plot,@semilogy)


) B5 h7 \5 @, Z# _! t$ N" V* B0 U% l5 }0 c* d- `/ i

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

MATLAB画双纵坐标


# G  L0 X/ O6 v- D% O

具有两个纵坐标标度的图形
- k- O' f- M- n6 N: c' D& r* S& Q7 I在MATLAB中,如果需要绘制出具有不同纵坐标标度的两个图形,可以使用plotyy绘图函数。调用格式为:
" [7 u/ T5 g, O' R& dplotyy(x1,y1,x2,y2)3 _9 l: N" m: Q) F- s+ Q2 N8 q3 Z1 ~
其中x1,y1对应一条曲线,x2,y2对应另一条曲线。横坐标的标度相同,纵坐标有两个,左纵坐标用于x1,y1数据对,右纵坐标用于x2,y2数据对。

双y轴坐标可以用plotyy(x,y1,x,y2)来实现
/ u2 X+ k: ?: B3 m- y" S3 G双x坐标可以用
4 f' x( M7 H# h2 w( Q$ iset(gca,'xaxislocation','bottom','xticklabel',{'0','1','2','3','4'}) (假设x轴的标注为1,2,3,4)# n6 A$ {( a7 B- u- p' n6 |8 t
set(gca,'xaxislocation','top','xticklabel',{'0','1','2','3','4'})
2 I* y4 N$ Z. {8 I+ z进行相应的设置

【 * 例 10.7.3 -1 】制作一个双坐标系用来表现高压和低温两个不同量的过渡过程。

tp=(0 :100)/100*5;yp=8+4*(1-exp(-0.8*tp).*cos(3*tp)); % 压力数据

tt=(0 :500)/500*40;yt=120+40*(1-exp(-0.05*tt).*cos(tt)); % 温度数据

% 产生双坐标系图形

clf reset,h_ap=axes('Position',[0.13,0.13,0.7,0.75]); %<4>

set(h_ap,'Xcolor','b','Ycolor','b','Xlim',[0,5],'Ylim',[0,15]);

nx=10;ny=6; %<6>

pxtick=0: ((5-0)/nx):5;pytick=0: ((15-0)/ny):15; %<7>

set(h_ap,'Xtick',pxtick,'Ytick',pytick,'Xgrid','on','Ygrid','on')

h_linet=line(tp,yp,'Color','b'); %<9>

set(get(h_ap,'Xlabel'),'String',' 时间 /rightarrow (分) ')

set(get(h_ap,'Ylabel'),'String',' 压力 /rightarrow(/times10 ^{5} Pa )')

h_at=axes('Position',get(h_ap,'Position')); %<12>

set(h_at,'Color','none','Xcolor','r','Ycolor','r'); %<13>

set(h_at,'Xaxislocation','top') %<14>

set(h_at,'Yaxislocation','right','Ydir','rev') %<15>

set(get(h_at,'Xlabel'),'String','/fontsize{15}/fontname{ 隶书 } 时间 /rightarrow (分) ')

set(get(h_at,'Ylabel'),'String',' ( {/circ}C )/fontsize{15} /leftarrow /fontname{ 隶书 } 零下温度 ')

set(h_at,'Ylim',[0,210]) %<18>

line(tt,yt,'Color','r','Parent',h_at) %<19>

xpm=get(h_at,'Xlim'); %<20>

txtick=xpm(1): ((xpm(2)-xpm(1))/nx):xpm(2); %<21>

tytick=0 : ((210-0)/ny):210; %<22>

set(h_at,'Xtick',txtick,'Ytick',tytick) %<23>


" @7 Z( q* V4 D5 K
  N# I- s: P1 b) S6 f

) U7 O5 T" s) W4 I& s! \

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

实例(已验证):

clc;( A% a2 O' i' w2 X7 t1 _& k
clear all;
# t# b1 h: f1 P4 G6 ^* \5 tclose all;
9 B( |' D' R! Ux=0:0.1:2*pi;
/ m' \4 o* u, X+ U% @% h7 Jy1=sin(x);/ ?3 f: a* N" _
y2=cos(x);
3 ~7 _, D/ C% c+ F: h[AX]=plotyy(x,y1,x,y2);; H$ J; S7 m) o
set(get(gca,'xlabel'),'string','X-axis');+ z" p3 \( }  }, f
set(get(AX(1),'Ylabel'),'string','left Y-axis');
" B/ u" l' \, ~! u4 p; \0 U; Fset(get(AX(2),'Ylabel'),'string','right Y-axis');: @% C# L1 O. h0 n. J: P' e
set(gca,'xTick',[0:0.5:7]);/ F  }: g2 S: Y! w1 _2 B
set(AX(1),'yTick',[-1:0.2:1]);: {4 t" N3 w( Z5 Y- r' _* w
set(AX(2),'yTick',[-1:0.5:1]);

尚存在问题:这种设置方法,对各个轴的最小刻度单位可以设置,但是刻度范围(x取(0~7),y1取(-1~1))不能设置。
. k: G0 J: Q8 H: I# ]* c' f% @/ D2010-12-23修改

2 ~! W8 |. o0 u, a

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

clc/ G8 R: M8 Q; m7 c: Y2 k
clear all3 w. J( e8 Q" n+ S8 V* A+ F
close all: F3 u) c( i2 f2 _9 c# C7 m
runoff=[10700 11400 15800 22900 43100 40700 50500 46000 41800 35000];: A3 x; J- `: o& z9 |+ ~3 X% |# |
sed=[0.105 0.094 0.156 1.264   0.363 0.429 0.731 0.682 0.654 0.290];( H2 _. k; ^$ D: G
m=1:10;
( _+ ~$ }- b3 m7 n( p/ r6 w[ax,h1,h2]=plotyy(m,runoff,m,sed); %h-- line handle
7 g5 z1 ?) E6 Q* ~: F% i" o* j) wset(get(ax(1),'Ylabel'),'string','Runoff (m^3/s))','color','r') %y1
6 \- G2 K' I0 U/ Yset(get(ax(2),'Ylabel'),'string','Sediment concentration (kg/m^3)','color','k') %y2
7 F0 A3 K, ^- ]% Rxlabel('Month')
, A6 e" j4 C9 C. `8 a3 wset(h1,'linestyle','-','color','r');   + }  E, H& M$ K& ]. n: A6 c
set(h2,'linestyle','- -','color','k');' j2 P8 N( d5 F9 @; I
legend([h1 h2],'runoff','sediment concentration') %标注两条线8 @6 n4 ^  H1 H5 Y4 R2 ^# a8 n
legend('boxoff')
, C+ {1 p1 {) i6 c* e% box off
2 T0 \( ^- p/ C# m) \! Mset(ax(: ),'Ycolor','k') %设定两个Y轴的颜色为黑色
7 V; v/ I( `2 m0 ^/ i! W, @set(ax(1),'ytick',[0:10000:100000]); %设置y轴间隔: Z3 }) L4 \# V5 S" y6 r
set(ax(2),'ytick',[0:0.1:1.5]). v" B& _7 K7 h, v+ N
set(ax,'xlim',[1 12]) % 设置x轴范围
$ y* D) w( V" v9 P* G" qhold on: I' j* \+ T$ B3 T' N& E
scatter(ax(1),4,22900,'r*')0 H3 g7 Q- v' S/ @
axes(ax(2));
! F1 K0 n4 J! h9 O3 n6 V2 b3 G  K4 _hold on
4 T* J3 f! A; Yscatter(4,1.264,'ro')


. h& F# O/ l" n( B


0 i4 c! S% ^" u
3 O" Z8 \* r' s- u6 B# K3 s* @/ q" ~1 M8 n0 Y
3 s+ |/ A0 y* R2 V9 [
+ X  q$ Y- Y2 K% r' @/ s- ]% D
3 Y- V; y  ]) E( Z  }: H

9 ~* |- L1 B1 |
7 B" Z3 K, q2 J5 P( u$ x4 v
- Z9 I, ?2 Y" w( T5 S

该用户从未签到

3#
发表于 2020-4-20 13:42 | 只看该作者
Matlab plotyy画双纵坐标图实例分享
  • TA的每日心情
    开心
    2023-5-15 15:14
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-4-17 18:51 | 只看该作者
    lotyy画出的图两边的tick间距是一样的
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-24 15:23 , Processed in 0.187500 second(s), 27 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表