- ベストアンサー
matlab のfigure について
matlab のfigure について MATLAB初心者です。 figure ウィンドウ内の'OuterPosition'と'Position'から 'Position'のみを表示させる為に、以下のHPを参考にしてプログラムを記述していますが、 どうしてもうまく出来ません。 http://undocumentedmatlab.com/blog/tag/outerposition/ http://nibot-lab.livejournal.com/73290.html お知恵を貸して頂くと助かります。 MATLABは 7.3.0(R2006b)を利用しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
三度Kulesです。 うまくfigure内での表示が出来たとのことで、何よりです。 確かにprint、saveasはpapersizeをいじったり何やかんや設定した割りにきれいな絵が得られませんね。 もっとうまく使えばできるのでしょうが… >hgexport(gcf,'figure1.jpg',hgexport('factorystyle'),'Format','jpeg'); …初めて聞く関数です^^;ちょっとそれの使い方はわからないですね… figureのサイズそのままの画像を出す、ということでいいのであればgetframeとimwriteが便利です。 C=getframe(gcf); とすると、Cは構造体になります。メンバは、CdataとColormap(だったと思う。こっちは重要ではない)です。 Cdataは画像サイズ×3(RGBのtrueカラー(uint8で定義してある))から成る3次元行列です。 …とまあ中身はわかんなくても使えりゃいいですね(笑) 後は、 imwrite(C.Cdata,'filename')とすればその名前で画像ファイルができます(画像のサイズはfigureのサイズに一致します)拡張子も.jpgだろうが.JPEGだろうが.bmpだろうが.pngだろうが大抵のものはOKだったはずです。 以上、参考になれば幸いです。
その他の回答 (2)
- Kules
- ベストアンサー率47% (292/619)
A No.1のKulesです。 補足ありがとうございます。 しかし…う~んまだあんまりわかりません^^;私の読解能力が低いようですね。すみません。 ということで私が補足文から読み取れたことについての回答をしたいと思います。 違っていたらお手数ですが再び補足していただければと… まず、 (1)とにかくaxesを現在のfigureのサイズ(640×480)にみっちり表示させたい のであれば、 set(gca,'Position',get(gca,'OuterPosition')); でできると思います。 http://www.mathworks.co.jp/access/helpdesk_ja_JP/help/techdoc/creating_plots/f1-32495.html を読んでいただくと書いてありますが、Axesが1つのFigureに対してはOuterPositionはFigureの内部になります。 ということは、上のコマンドは、「Axesの位置を、Figureの位置に一致させろ」ということになります。 (2)任意に入力した縦と横の比率をfigureサイズ(JPEGのサイズ)にも反映したい 例えば縦横の比率を入力したらその範囲に相当するグラフが描かれる (縦2、横3と入力すると例えば-3≦x≦3、-2≦y≦2の範囲でグラフが描かれる) というようなものの場合、単に set(gca,'Position',get(gca,'OuterPosition')); とするとx軸の範囲とy軸の範囲がFigureのサイズ(640×480)にあうように縦方向に引き延ばされてしまいます。 このようなことが起きないようにするには、任意で入力した縦横の比率の格納する変数InputRatio(1つ目の要素が横、2つ目の要素が縦を表すベクトル)として、 set(gca,'PlotBoxAspectRatio',[InputRatio(1) InputRatio(2) 1]); とすることでグラフの縦横が思った通りの比になってくれます。 その後で(先でもいいですが) set(gca,'Position',get(gca,'OuterPosition')); とすれば縦と横、どちらかがピッタリ入るようにaxesのサイズが変更されます。 ただこれだと上下または左右に余白ができてしまいます。 (例えば先の例で言えばAxesのサイズは横3:縦2に対し、Figureのサイズは横4:縦3なので、上下に余白ができます) ということでFigureサイズもいじってしまいましょう。 JPEGファイルにする時どちらのサイズを一定にするかにもよりますが、 もし横幅(640)を一定にしたいのであれば Fpos=get(gcf,'Position') として、 set(gcf,'Position',[Fpos([1,2]),Fpos(3)*InputRatio/InputRatio(1)]) とすればFigureの縦横比もAxesの縦横比、つまり任意で入力した縦横比に一致します。 こういうことでしょうか?あまりご要望に沿えている感じではないかも知れません。 「こういうことじゃないんだよ」あるいは「こういうことなんだけど、思った通りの結果にならないんだよ」 というのがありましたらまた補足欄に書いていただければと思います。 長文失礼しました参考になれば幸いです。
補足
うまく上下、左右の余白がカットでき、figure内に表示ができました。 その後、JPEG出力させたのですが、通常の、print命令、saveas命令では、figureの表示内容 通りの画像が出力されませんでした。 そこで、 hgexport(gcf,'figure1.jpg',hgexport('factorystyle'),'Format','jpeg'); を用いて、解決できたのですが、 出力画像の解像度が低く、拡大するとすぐにギザギザが目立ち、利用できませんでした。 何か良い方法ありませんでしょうか。 出力は、プログラム内で記述しようと思っています。
- Kules
- ベストアンサー率47% (292/619)
ん~質問文およびリンク先の話を合わせてもどういうことがしたいのか いまいち読み取れないので補足要求させて下さい。 (1)figureの'position'または'outerposition'の値をコマンドウィンドウ上、またはそれ以外のどこかにテキストとしてに表示させたい (2)figureの'position'または'outerposition'を操作してPCの画面上での表示方法を変えたい(どのように?) (3)axesの'position'または'outerposition'を操作してfigure内での表示の仕方を変えたい(どのように?) (4)上記以外 どのようなことをしたいのでしょうか?
補足
(2)と(3)になります。 任意に入力した、縦と横の比率を読み取って、figure内にグラフを表示させ、その後JPEGデータに出力させています。(元のfigureのサイズは、640×480としています) その際、グラフの表示範囲外も白の余白として、画像データに出力されてしまいます。 この白の余白を全てなくして、グラフ範囲内のみを表示したいと思っています。 グラフ軸の目盛りは削除しています。 方法として、 'position'または'outerposition'を操作して、axesを操作して表示できるのでは、 と思い、試していますがうまくいきません。
お礼
PCの使える環境にいなくてお返事遅くなりました・・ 無事出力もできました。 詳しい内容を細かく教えて頂き、ありがとう御座いました。