ファイル名:Kasanegaki0.m
function kasanegaki0(SEL)
% VARIOUS KASANEGAKI PROGRAMS
if nargin ~= 1 % 引数が1つ以外の時
fprintf('次の中から実行したい重ね書きプログラムを選択して下さい。\n');
fprintf('4) 既にプロットされている2つのFigureを重ね合わせる。\n');
fprintf('3) 2つの異なるラインプロットを1つのaxesに納めてそれぞれのY軸のラベルを右と左に振り分ける。\n');
fprintf('2) Y軸の左側の値にある定数倍を掛けた数字とラベルを、Y軸の右側に書き込む。\n');
fprintf('1) デモンストレーション(Matlab5 Using Matlab Graphics p.4-10)\n');
SEL = input('=> ');
end
switch SEL
case 4
% 1番目のplotのTickがY軸の右側に出ない様に'Box','off'にした代わりに、X軸の上側の線が無くなるので、
% 更にもう一個axesを作ってそれのBoxをonにする事によりX軸の上側に線が付く様にしていた。
fprintf('[注意] 1番目のFigueに重ね合わされます。又軸の範囲は、X軸は最初のFigureに合わされるが、\n');
fprintf('Y軸の範囲はプロットされている範囲のまま重ね合わされる。尚subplot等でグラフが1Figure中に沢山\n');
fprintf('あっても最後のグラフ(gca)のみ選択されて、全部を重ね合わせる事は出来ない。\n\n');
fprintf('[1個目] Figureの選択。重ね合わせ時に文字は消えたりしない。\n');
FIG0 = input('Figure番号を入力 Ex. 1 や 2 など=> ');
figure(FIG0);
LEG0 = input('legend名 を入力 Ex. Real Part => ','s');
leg0 = legend(LEG0);
axes0 = gca;
POS = get([axes0;leg0],'Position');
POS{2,1}(1,1) = POS{1,1}(1,1) 0.01;
set(leg0,'Position',POS{2,1}); % 左に軸に対応するlegendは左側に置く
fprintf('[2個目] Figureの選択。重ね合わせの時に消されるのは、xlabelとtitleである。\n');
FIG1 = input('Figure番号を入力 Ex. 1 や 2 など=> ');
figure(FIG1);
xlabel('');
title('');
axes1 = gca;
h1 = get(axes1,'Children'); % プロットされている全ての線のLineStyleを鎖線にする
set(h1(find(strcmp(get(h1,'Type'),'line'))),'LineStyle','-.');
set(axes1,'Position',POS{1,1},'XLim',get(axes0,'XLim')); % グラフの大きさとX軸の範囲がaxes0と同じになるようにする
LEG1 = input('legend名 を入力 Ex. Imag Part => ','s');
leg1 = legend(LEG1);
figure(FIG0);
set(axes0,'Box','off');
set(axes1,'Parent',FIG0,'Position',POS{1,1},'Box','off','Color','none','XLim',get(axes0,'XLim'),'XTick',[],'Yaxislocation','right'); % Figureの位置を元に戻してそれから重ね合わせる
set(leg1,'Parent',FIG0);
axes2 = axes('Position',POS{1,1},'Box','on','Color','none','XTick',[],'YTick',[]); % X軸の上側に線を引く為にもう一個axesを作る
case 3
% 2種類のplotを同一Figure上に表示させて2番目のY軸目盛を左側に置く。但しYTickの場所は右側も左側も同じ場所になる様にした。
clf;
fprintf('[注意] この方法ではY軸のTICKの位置がずれたりする場合ができてしまいます\n');
fprintf('あとこのプログラムではFigureを2つ使い(gcfとgcf 1)、X軸の範囲は1個目のプロット図に合わされます\n\n');
fprintf('[1個目] plot , xlabel , ylabel , title , legendの名前 , 軸範囲を入力します\n');
PLOT0 = input('plotコマンドを入力 Ex. plot(1:10) => ','s'); eval(PLOT0);
XLAB0 = input('xlabel を入力 Ex. Frequency/Hz => ','s'); xlabel(XLAB0);
YLAB0 = input('ylabel を入力 Ex. Amplitude => ','s'); ylabel(YLAB0);
TIT0 = input('title を入力 Ex. Spectrum => ','s'); title(TIT0);
LEG0 = input('legend名 を入力 Ex. Real Part => ','s'); leg0 = legend(LEG0);
axes0 = gca;
POS = get([axes0;leg0],'Position');
POS{2,1}(1,1) = POS{1,1}(1,1) 0.01;
set(leg0,'Position',POS{2,1}); % 左の軸に対応するlegendは左側に置く
fprintf('軸の調整をします。最終的に出力されるプロットのX軸の範囲はこのプロットの範囲に対応します。\n');
while 1
fprintf('現在の軸範囲で良い時はリターンのみを入力\n');
AXIS0 = input('軸の調整 Ex. 1 10 -5 5 => ','s');
if isempty(AXIS0), break; end
axis(str2num(AXIS0));
end
fprintf('[2個目] plot , ylabel , legendの名前 , 軸範囲を入力します\n');
PLOT1 = input('plotコマンドを入力 Ex. plot(1:10) => ','s');
axes1 = axes;
eval(PLOT1);
set(axes1,'Position',POS{1,1},'Color','none','XLim',get(axes0,'XLim'),'XTick',[],'YAxisLocation','right'); % グラフの大きさとX軸の範囲がaxes0と同じになるようにする
h1 = get(axes1,'Children'); % 現在の設定はプロットされている全ての線のLineStyleを鎖線にする
set(h1(find(strcmpi(get(h1,'Type'),'line'))),'LineStyle','-.');
ArrangeYTicks(axes0,axes1);
YLAB1 = input('ylabel を入力 Ex. Amplitude => ','s');
ylabel(YLAB1);
LEG1 = input('legend名 を入力 Ex. Imag Part => ','s');
leg1 = legend(LEG1);
fprintf('2個目のplotの「Y軸範囲のみを」調節します。\n');
while 1
fprintf('現在の軸範囲でいいときはリターンのみを入力\n');
AXIS1 = input('軸の調整 Ex. 1 10 => ','s');
if isempty(AXIS1), break; end
set(axes1,'YLim',str2num(AXIS1));
ArrangeYTicks(axes0,axes1);
end
case 2
% 'Layer','bottom'は軸線とプロット線のどちらを上に書くかを決めるのでimage等使用時には重要になるが、今回は省いてある。
% 'YTickMode','manual'はYTickを直接変えている為無くていい様だ。YTickLabelはModeがautoの為YTickが変わると自動的に変わる。
% plotyyという関数もあるので参考にする事。
fprintf('[注意] この操作後に座標スケールを変えると図形はおかしくなる。\n');
fprintf('[例題] 淡路島800mBoeholeの位相変動では、[18Hz]-0.008841941283倍、[25Hz]-0.006366197724倍\nするとTravel Timeの時間変動に対応した物となる。\n');
TREND = input('_何倍のスケールか? => ');
OFFSET = input('_右側軸で0にしたい所の左側軸の値 => ');
YLABEL = input('_ラベルの名前 => ','s');
h0 = gca;
YLIM = (get(h0,'YLim')-OFFSET)*TREND;
YTICK = (get(h0,'YTick')-OFFSET)*TREND;
h1 = axes('Position',get(gca,'Position'),'Color','none','XLim',get(gca,'XLim'),'XTick',[],'YAxisLocation','right','YLim',YLIM,'YTick',YTICK); % 右側にY軸の数字を入れる
set(get(h1,'YLabel'),'string',YLABEL); % Y軸ラベルを付ける
fprintf('もし今Figureの右側のY軸ラベル等がはみ出ているなら、X軸側のスケールを縮小させる事により\nY軸ラベルをFigureウィンドウ内に入れる事ができる。\n');
REDUCE = input('_縮小倍率(要らない時は1を入力) => ');
POS = get(h0,'Position');
POS(1,3) = POS(1,3)*REDUCE;
set([h0;h1],'Position',POS); % 'XLimMode','manual'は要らないと思ったので外してある
case 1
% KASANEGAKI TEST PROGRAM COPIED FROM THE MATLAB5 USING MATLAB GRAPHICS P.4-10
% 2つのプロットの重ね書きをする。但しこのやり方は右の軸(1つ目のプロット)のTickの数と左の軸(2つ目のプロット)のTickの数
% とが合っていないと左側のTickが1つ目のプロットによりできる左側の軸のTickとずれてTickが沢山できてしまう可能性がある。
% [例題] plot(days,TCE,LineWidth',3) を plot(days,TCE/15,LineWidth',3) などとしてみると分かる。
TCE = [515 420 370 250 135 120 60 20];
temp = [29 23 27 25 20 23 23 27];
days = 0:5:35;
bar(days,temp);
xlabel('Day');
ylabel('Temperature(^{o}C)');
h1 = gca;
h2 = axes('Position',get(h1,'Position'));
plot(days,TCE,'LineWidth',3);
set(h2,'Color','none','XLim',get(h1,'XLim'),'XTick',[],'YAxisLocation','right','Layer','top')
text(11,380,'Concentration','Rotation',-55,'Fontsize',16);
ylabel('TCE Concentration(PPM)');
title('Bioremediation','FontSize',16);
otherwise
error(['Wrong Number => ',num2str(SEL)]);
end
function ArrangeYTicks(axes0,axes1) % for case2
YTickLen0 = length(get(axes0,'YTick'));
YLim1 = get(axes1,'YLim');
YTick1 = YLim1(1,1) (YLim1(1,2)-YLim1(1,1))/9*(0:YTickLen0-1); % 1個目と2個目の図のYTickを無理やり揃える
set(axes1,'YTick',YTick1);