• ベストアンサー

MATLAB 図形の長さの調整についての質問

MATLABについての質問です。 subplot(3,3,[1:2,4:5]);plot(a,b);axis('square'); (図1) subplot(3,3,[3,6]);plot(c,d);           (図2) subplot(3,3,[7,8]);plot(e,f);            (図3) として、図2の縦軸と図1の縦軸を合わせ、かつ図3の横軸と図1の横軸を合わせようとしたところ、squareが原因でこれらの長さが合いません。 図1を正方形で表したまま、図2と図3を図1に合わせる方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Kules
  • ベストアンサー率47% (292/619)
回答No.2

再びKulesです。 h_ax(1)=subplot(3,3,[1:2,4:5]); は'square'を定義していないのでこの方法を用いると  pos3(1)とpos1(1)(図1と図3の左端の位置)  pos1(2)とpos2(2)(図1と図2の下端の位置)  pos1(3)とpos3(3)(図1と図3の幅)  pos1(4)とpos2(4)(図1と図2の高さ) はもともとが同値であるため、「処理を加えることがない」という問題が残ります。 あれ~そうでしたっけ?axis('square')を使ったら(ax(1)を定義した後でも) get(ax(1),'position')を使えば正方形になった状態での位置が取得出来たような気がしますが。 まあいいか。 そもそもの話、setで軸の位置、幅、高さが設定できるのであればaxis('square')を使う意義がなくなるので。 (figureのサイズなど考えなくていいaxis('square')コマンドは便利ですが、自由に調整できないのが厄介です) 例えばfigureの幅と高さが同じであれば set(h_ax(1),'Position',[0.1,0,4,0.5,0.5]) set(h_ax(2),'Position',[0.7,0,4,0.25,0.5]) set(h_ax(3),'Position',[0.1,0,1,0.5,0.25]) とすれば所望の形になりますね。 で、figureの幅と高さが違えば軸の幅や高さを具体的にどうすればいいかは計算する必要があります。 (例えばfigureの幅が高さの半分であれば、set(h_ax(1),'Position',[0.1,0.4,0.5,0.25])とする必要がありますね) あるいは、set(h_ax,'Unit','Pixels')で軸の位置、幅、高さの指定がピクセル値(絶対値)で出来るようになるので それを使ってもいいかも知れません。 要するに、軸の配置や形状を決めたいのであれば、subplotやaxis('square')やaxis('Tight')などのコマンドを使わず、 自分で直接指定した方がやりやすいよ、ということが言えると思います。 参考になれば幸いです。

s-technology
質問者

お礼

再度質問の回答をしていただき本当にありがとうございます。 今回は例として出したので簡単なプロットでしたが、実際やりたいものはもっと複雑なものだったので縦幅・横幅を合わせるのが大変でした。それでも、少し値は違うかもしれませんが何とか正方形に見せることができました。 しかし、次の問題が出てしまいました。このプログラムを作成したPC以外の大きさの異なったPC上では長方形になってしまうという問題です。 これを防ぐためにこの'Position'を一般化したいと考えているのですが、アドバイスがあったらお願いします。 たびたび申し訳ありません。

その他の回答 (2)

  • Kules
  • ベストアンサー率47% (292/619)
回答No.3

三度Kulesです。 >少し値は違うかもしれませんが何とか正方形に見せることができました。 何とかできたようでよかったです。 実際軸の位置や幅をどんな時でも合わせるってのは難しいので、私はそれ専用の関数を作るようにしています。 >このプログラムを作成したPC以外の大きさの異なったPC上では長方形になってしまうという問題です。 どのモニタでも同じように映す、ということであれば、 figureのunitをpixel、axesのunitをNormalizeにすればよいかと思います。 もし仮に縦と横のDPI値を変えられるモニタがあるとか言われたらお手上げですね… ルートプロパティのScreenPixelsPerInchをいじるとかでしょうか(いじれるのか?) Matlabの設定に依存せず、ということであれば、figureのpositionをfigureを作った段階で自分の好きな値に 設定することでしょうか。 (人によってはfigureのデフォルトの大きさを変えている人がいます。かくいう私もその一人で、wordなどにグラフを貼る時、1ページにある程度余裕をもって貼れるよう幅560×高さ360という値にしています。もし何も設定していない場合、デフォルトのfigureの大きさは560×450だったような気がします) ちょっとPCに依って正方形になったり長方形になったりする原因が特定できないので、上記のようなことしか描けないです。 まずはget(gcf,'Position')とget(gcf,'Unit')、get(gca,'Unit')で設定されているものが同じかを確認するところから始めるのがよいのではないかと思います。 参考になれば幸いです。

s-technology
質問者

お礼

何度も回答していただきありがとうございます。 自分のPCでできただけでも本当に助かりました。 他のPCでできないというのは残念でしたが、パワポなどに張り付けて他のPCに送れば問題もないので今はその方法でいこうと思います。この質問をする前はこの例だけでも3枚張り付けなくてはいけなかったので、それが1枚になって作業効率が1/3になったのが大変助かりました。 この大きさの変更をするのは、また研究をしていきます。もし、できるようになったらこのお礼入力にその方法を書き込みます。 ありがとうございました。

  • Kules
  • ベストアンサー率47% (292/619)
回答No.1

例えば h_ax(1)=subplot(3,3,[1:2,4:5]); h_ax(2)=subplot(3,3,[3,6]); h_ax(3)=subplot(3,3,[7,8]);plot(e,f); として pos=get(h_ax(1),'Position'); とするとposには [左下の位置(x,y),幅,高さ] の値が入ります。x,yはfigureの右下からの位置です。 また、posの値はfigureの幅、高さをそれぞれ1とした時の値が入ります。 (例えば「1/3,1/3,1/2,1/2」であれば、左から1/3、下から1/3の位置に軸の左下の角が来て、そこからfigureの半分の幅と半分の高さということになります) したがって、 pos1=get(h_ax(1),'Position'); pos2=get(h_ax(2),'Position'); pos3=get(h_ax(3),'Position'); として、 pos3(1)とpos1(1)(図1と図3の左端の位置) pos1(2)とpos2(2)(図1と図2の下端の位置) pos1(3)とpos3(3)(図1と図3の幅) pos1(4)とpos2(4)(図1と図2の高さ) を揃えれば所望の動作となりますね。 で、各プロパティを変更するには set(h_ax(1),Position',newpos) のようにすればOKです。 参考になれば幸いです。

s-technology
質問者

お礼

ご回答していただいてありがとうございます。 ただ、  h_ax(1)=subplot(3,3,[1:2,4:5]); は'square'を定義していないのでこの方法を用いると  pos3(1)とpos1(1)(図1と図3の左端の位置)  pos1(2)とpos2(2)(図1と図2の下端の位置)  pos1(3)とpos3(3)(図1と図3の幅)  pos1(4)とpos2(4)(図1と図2の高さ) はもともとが同値であるため、「処理を加えることがない」という問題が残ります。 'square'は画面表示に合わせて処理をしているからだと思います。 この変化に伴い図2、図3を変えていきたいと考えています。 ただし、図2と図3は正方形にはしないという条件が望ましいです。 ご回答をしていただいたのに申し訳ありません。

関連するQ&A