• ベストアンサー

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

  • Excelの散布図グラフについて

    閲覧ありがとうございます。 添付してある画像のような散布図グラフのプロットエリアを正方形にしたいのですが、やり方がわかりません。 縦軸と横軸の目盛間隔を一緒にすれば、正方形になると思っていたのですが...。 よろしくお願いいたします。

  • MATLABについての質問です。

    大学の研究していてMATLABでわからないところがあるのでぜひ教えて頂けたらと思っています。 よろしくお願い致します。 現在任意の多角形障害物を設置し,それらを回避する折れ線経路を全部求めるプログラムを作っているのですがどのように作ればいいかわかりません。 今は始点と終点を決めてクリックした所をつないでいくプログラムができたのですが問題文に沿ってできていません。 このプログラム後はダイクストラの方法で最短折れ線経路を求めるので それを含めてよろしくお願い致します。 clear all; close all; clc; init=1; final=1000; figure(1) for loop=init:final [x,y] = ginput A=[x,y] if 0<=x(:,:)&x(:,:)<=1&0<=y(:,:)&y(:,:)<=1 B{loop} =A else break end end figure(2) for C=init:loop-1 B{C} fill(B{C}(:,1),B{C}(:,2),'g');hold on axis([0,1,0,1]); end [x,y] = ginput pb=[x,y] figure(3) for C=init:loop-1 fill(B{C}(:,1),B{C}(:,2),'g');hold on axis([0,1,0,1]); plot(pb(:,1),pb(:,2),'o');hold on end for D=init:final [x,y] = ginput if 0<=x(:,:)&x(:,:)<=1&0<=y(:,:)&y(:,:)<=1 plot([pb(1,1),x',pb(2,1)],[pb(1,2),y',pb(2,2)],'-*');hold on node{D}=[[pb(1,1),x',pb(2,1)],[pb(1,2),y',pb(2,2)]] B{D} = sum(node{D}) else break end end for E=init:D-1 B{E} end

  • MATLABのプログラミング

    MATLAB全くの初心者です。 横軸を時間、縦軸を反応値は0または1に固定したもので、 周期性をもったパルス波形を生成したいのですが、 途中でつまずいてしまいました。 グラフをプロットすると、 ____∧__∧___ このようなグラフになってしまいます。 本当は、 __|____|____ このようなグラフをつくりたいと考えているのですが… 関数zerosを使った記述方法があれば教えていただきたいです。 よろしくお願いいたします。

  • MATLABのfor文の使い方について

    MATLAB(というかプログラム)初心者です 下記を教えてください よろしくお願いいたします 「つくりたいプログラム」 y1=[A B C] y2=[D E F] ・ ・ ・ y200=[AA BB CC] 上記のような200個くらいある行列に同じ操作をしたいです そこでいちばん簡単な構造を考えました ////////////////////// y1=[A B C] y2=[D E F] for i=1:2 Yi=yi*5 end ///////////// 成功イメージは Y1=[5A 5B 5C] Y2=[5D 5E 5F] となってほしいのですが回りません・・・ yiの定義のしかたがわからず困っております 初歩的な質問かもしれませんが教えてくださいよろしくお願いいたします

  • MATLAB初心者;プログラミングのエラーが直せない

    こんにちわ、先週からMATLABを学び始め、これからプログラムを作っていこうと思っているところです。以下のプログラムを作ろうとしているのですが、エラーが出てしまいます。似たようなプログラムがあったのでそれを修正して、自分で解答してみたのですがうまくいきません。 【課題】Quadratic equation x^2+b*x+c = 0 has two roots. They are given by r1 = (-b+sqrt(b^2-4*c))/2 and r2 = (-b-sqrt(b^2-4*c))/2. Fix the value of c at c=1, plot r1 and r2 as functions of b for b in [2,3]. Plot two curves in one figure. Use about 100 points to represent each curve. 【自分の解答例】 % % Plot f1(x) = (-x+sqrt(x^2-4))/2 and f2(x) = (-x-sqrt(x^2-4))/2 for x in [2,3] % clear; clf; % n=81; dx=8/(n-1); x=[-4:dx:4]; f1=(-x+sqrt(x^2-4))/2; f2=(-x-sqrt(x^2-4))/2; % plot(x,f1,'b-','linewidth',2.0) hold on plot(x,f2,'ko') axis([-4.0,4.0,-1.4,3.8]) set(gca,'xtick',[-4:1:4]) set(gca,'ytick',[-1:1:3]) set(gca,'fontsize',14) xlabel('x') ylabel('f(x)') h1=legend('f1(x)=(-x+sqrt(x^2-4))','f2(x)=(-x-sqrt(x^2-4))/2'); set(h1,'fontsize',12) % ??? Error using ==> mpower Matrix must be square. というエラーが出てしまいます。変数はあとでbに直すつもりですが、エラーの意味がわかりません。よろしくお願いします。

  • 図形

    縦の長さが8、横の長さが7の長方形の中に、 5個の合同な正方形が図のように詰め込まれているとき、 正方形の1辺の長さを求めよ。 図のように、正方形の1辺をx 図で左上に直角三角形があるが直角をつくる辺の短い方をa 長い方をbとして、相似を使って式を作っていきました。 3本できましたが、ここからxを求めれません。 よろしくお願いします。 (1)x^2=a^2+b^2 (2)a=14-3b (3)2a^2+6b^2+14a-ab-16b=0 の3本の式から、xを求めるのに挫折しました。

  • EXCELの表で縦横の入れ替え方法

    EXCELの表で 縦軸と横軸を入れ替える方法ってありますか? つまり A B C D E F G H I J K L っていう表を A E I B F J C G K D H L にしたいのです。

  • EXCEL グラフの描き方

    EXCELで、系列Aを横軸に、系列B,Cを縦軸にとって 散布図を描こうとしています。 系列Bと系列Cのデータは単位も桁も違いますが、 一つのグラフに並べて挙動が分かりやすくなるように プロットしようとしたとき、 2種類の軸目盛を別々に設定することはできますか? どなたか、教えていただけるとうれしいです。

  • Excelのグラフの編集で・・・

    Excelのグラフの編集をしているのですが、少しわからない所があるので教えてください。 今私が作っているグラフは横棒グラフなんですが、横軸に(数学で言うところのx軸)に%、縦軸に項目をとっています。 で、今縦軸は項目名付近にちょびっと線が出ているだけなんですが、これを逆の縦軸まで伸ばしたい(ようはグラフのプロットエリア内を碁盤目状にしたい(特に正方形である必要はない))のですが、どうすればいいのでしょうか?

  • 変化量等にありがちなグラフの描き方

    例えば時刻AからBごとに進んだ距離をΔC、またその累計をC、加速度をDとした場合を考えます。 これを表に記すとAの列とCの列は行も一致しますが、BやΔC、Dの列はAx~Ax+1の項の間に 挟まるように行を成すと思います。Cを横軸にとった場合、縦軸がAなら対応する行同士でプロットする 点は自然に決まります。しかし縦軸がDのような場合は、Cx~Cx+1の中間にプロットするべきなのか、 はたまた別の考え方が必要なのか見当がつきません。どなたかご教授お願いします。