ファイル名: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);