スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


Scilabで二次元プロット

Scilabは数値計算をするために適したプログラミング言語です。
より具体的に言うと、Scilab「数値計算をするのに適した命令」と「グラフを描画するのに適した命令」の両方をあらかじめ持っているため、私たち人間がコードを書くために考えなければならない事が少なくてすみます。

「数値計算をするのに適した命令」の解説は、ねがてぃぶろぐのこれまでのエントリの中で色々と紹介してきました。例えば以下のようなものです。
これらの計算は、その都度適した方法でグラフ化をしてきました。
そこで今回は、グラフの描画方法に着目してエントリをまとめなおします。


目次



二次元プロットの基本


Scilabの二次元プロットはExcelで言うところの散布図が基本です。
例えば 0 < x < 1 の範囲で y = sin(2πx) をプロットするのは以下のようなプログラムになります。
X = linspace(0,1);
Y = sin(2 * %pi * X);

plot(X,Y);

001_201312281856542e7.png
Fig.1: 最も基本的な二次元プロット。


これがScilabのグラフ描画の基本です。plotでは青の実線がデフォルトになります。
Scilabには二次元グラフを描く命令としてplotのほかにplot2dというものもありますが、ねがてぃぶろぐではplotをメインに使用しています。


シンボルと線種


plotはオプションの引数を与えることでグラフの色やシンボルを指定することが出来ます。
// *** 正弦波の計算 ***
X = linspace(0,1);
Y1 = sin(2 * %pi * X);
Y2 = sin(3 * %pi * X);
Y3 = sin(4 * %pi * X);

// *** グラフのプロット ***
plot(X,Y1,'.r');
plot(X,Y2,'-*g');
plot(X,Y3,':b');

002_201312281936478ef.png
Fig.2: 色々なシンボル/線種の例


与えるオプションの識別子と描画の関係はScilab 入門: 6 グラフィックスに詳しく書かれています。以下はその引用です。

識別子識別子線種
r赤(Red)-実線
g緑(Green)-- 破線
b青(Blue)-.点破線
cシアン(Cyan):二点破線
m赤紫(Magenta)
y黄色(Yellow)
k黒(Black)
w白(White)
table.1: グラフの色と線種


識別子形状説明
++十字
x×クロス
**アスタリスク
o中抜きの円
.塗りつぶし円
^上向き三角
v下向き三角
>右向き三角
<左向き三角
s四角(Square)
dダイヤ(Diamond)
p星(Pentagram)
table.2: グラフのシンボル


Scilabで繰り返し計算: ロジスティック写像ではグラフを描いた時点でのScilabのバージョンが低かったため上手く行っていませんが、markersizeでマーカーの大きさを変更することが出来ます。
003_201312282216375a3.png
Fig.3: ロジスティック写像の例でマーカーの大きさを小さくしたもの

// *** ロジスティック写像の計算 ***
nmax = 200;
nout = 100;

A = [0:0.001:4];
X = 0.2 * ones(nmax,length(A));

for n = 1: nmax - 1 do
X(n+1,:) = A .* X(n,:) .* (1.0 - X(n,:));
end

// *** グラフのプロット ***
plot(A,X(nout:nmax,:),'.r','markersize',1);
zoom_rect([3,0,4,1]);


更に上記のサンプルではzoom_rect([xmin,ymin,xmax,ymax])でグラフの指定範囲のズームも行っています。


グラフの装飾


グラフの装飾として、グラフのタイトル、軸ラベル、凡例、グリッドの追加をします。以下に示すのがその例です。


004_20131228231755a1e.pngFig.4: グラフの装飾例

// *** 正弦/余弦の計算 ***
X = linspace(0,1);
Y1 = sin(2 * %pi * X);
Y2 = cos(2 * %pi * X);

// *** グラフのプロット ***
plot(X,Y1,'-r');
plot(X,Y2,'-b');

// *** グラフの装飾 ***
// タイトル
title("sin and cos");
// 軸ラベル
xlabel("x axis");
ylabel("y axis");
// 凡例
legend(["sin(x)","cos(x)"],3);
// グリッド
xgrid(color(128,128,128));


グラフのタイトルはtitleでx軸のラベルはxlabelで指定することが出来ます。y軸やz軸のラベルも同様にylabel,zlabelで指定できます。更にこれらのタイトルとラベルを一気に指定するのがxtitleです(が、私は別個に指定するほうが好きなのであまり使いません)。

グラフの凡例はlegendで描画することが出来ます。このlegendは必ずplotより後に書かなければなりません。
サンプルプログラムの最後のパラーメータである 3 は、凡例を配置する位置を指定するパラメータです。右上(1),左上(2),左下(3),右下(4)とマウスでクリックした場所に配置(5)が選べる他、マイナスの数値を指定するとグラフの外に配置することが出来ます。

xgridを使うとグラフ上の数値を読み取りやすくするためにグリッドを表示することが出来ます。引数なしでxgird()とすると黒の破線でグリッドが描かれます。
黒だと少し濃くて読みづらいときは別の色を割り当てます。これにはcolorを使いましょう。引数の3つの数値は色のRGB整数値です。上記のサンプルでは灰色にしてあります。


分割と差し込みグラフ


ひとつの図の中に複数のグラフを描くことが出来ます。
一番簡単な方法はsubplotを使う方法です。

subplot(m,n,p)とすることで、上下にm分割、左右にn分割した後、p番目のパネルにプロットを行います。


005_20131229022716c9a.png
Fig.5: subplotを使ったグラフの分割。下のパネルのx軸ラベルにも"x axis"と書いてあるはずだが切れてしまっている。

// *** 正弦/余弦の計算 ***
X = linspace(0,1);
Y1 = sin(2 * %pi * X);
Y2 = cos(2 * %pi * X);

// *** グラフのプロット ***
// 上部パネル
subplot(2,1,1);
plot(X,Y1,'-r');
// 軸ラベル
xlabel("x axis");
ylabel("y axis");
// 下部パネル
subplot(2,1,2);
plot(X,Y2,'-b');
// 軸ラベル
xlabel("x axis");
ylabel("y axis");


しかしながらsubplotでグラフを分割すると、Fig.5の様に軸ラベルが描画範囲からはみ出してしまうことがあるようです。
そういう場合は少し面倒ですがxsetech(wrect)を使います。
引数は wrect=[x,y,w,h]で x,y はグラフの左上の点の位置で w,h は幅と高さです。


006_20131229025350382.png
Fig.6: xsetechを用いたグラフの分割。subplotよりも細かい設定が可能。

// *** 正弦/余弦の計算 ***
X = linspace(0,1);
Y1 = sin(2 * %pi * X);
Y2 = cos(2 * %pi * X);

// *** グラフのプロット ***
// 上部パネル
//subplot(2,1,1);
xsetech([0,0,1,0.45]);
plot(X,Y1,'-r');
// 軸ラベル
xlabel("x axis");
ylabel("y axis");
// 下部パネル
//subplot(2,1,2);
xsetech([0,0.5,1,0.45]);
plot(X,Y2,'-b');
// 軸ラベル
xlabel("x axis");
ylabel("y axis");


この方法を応用すればScilabで差し込みグラフ:金属の比熱で描いたような差込グラフを作ることも出来ます。


グラフの縦横比


squareまたはisoviewを利用すれば、グラフの縦横比を1:1に固定することが出来ます。


007_20131230052535f40.png
Fig.7: isoviewを用いて縦横比を1:1としたプロット

// *** 円の計算 ***
T = linspace(0,1);
X = sin(2 * %pi * T);
Y = cos(2 * %pi * T);
// 描画範囲の計算
xmin = min(X);
xmax = max(X);
ymin = min(Y);
ymax = max(Y);

// *** グラフのプロット ***
// 円のプロット
plot(X,Y);
// 縦横比を1:1に設定する
//square(xmin,ymin,xmax,ymax);
isoview(xmin,xmax,ymin,ymax);


上記のサンプルはisoviewを用いてプロットしたものです。squareのコメントアウトをはずしてisoviewをコメントアウトすればsquareでの描画のサンプルにもなります。

これら二つの違いはウインドウサイズを変更するかしないかです。
なのですが、ややこしい事にx軸方向の最小値/最大値とy軸方向の最小値/最大値の設定する順番が異なっています。


複数枚のグラフ


subplotxsetechを利用して一枚の図を分割する他に複数枚の図にグラフをプロットする方法もあります。これにはscfを利用します。


008_20131230055603cfa.png
009_20131230055602c14.png
Fig.8-9: scfを使うと複数枚のグラフが描画できる

// *** 正弦/余弦の計算 ***
X = linspace(0,1);
Y1 = sin(2 * %pi * X);
Y2 = cos(2 * %pi * X);

// *** グラフのプロット ***
// 1枚目の図
scf(0);
plot(X,Y1,'-r');
// 軸ラベル
xlabel("x axis");
ylabel("y axis");
// 2枚目の図
scf(1);
plot(X,Y2,'-b');
// 軸ラベル
xlabel("x axis");
ylabel("y axis");



対数グラフなど


plot2dを利用すれば簡単に対数グラフを描くことが出来ます。しかしながらシンボルや線種の指定などの方法がplotと異なってしまいます。
そこでplotで対数グラフを描きたいわけですが、これはここまで紹介してきたほかの方法よりも少しだけややこしいです。

対数グラフに限った話ではないのですがgcaで軸の設定をしている行列を呼び出しaxes_propertiesに従って新しい設定を書き込めば、軸の設定を変更できます。以下は片対数グラフを描くサンプルです。


010_20131230071240a53.png
Fig.10: 片対数グラフ

// *** 常用対数の計算 ***
X = linspace(0.1,10);
Y = log10(X);

// *** グラフのプロット ***
subplot(2,1,1);
plot(X,Y);
xgrid(color(128,128,128));

// *** 片対数グラフのプロット ***
subplot(2,1,2);
a = gca();
a.data_bounds = [0.1,-1;10,1];
a.log_flags = "ln";
plot(X,Y);
xgrid(color(128,128,128));


このテクニックをマスターすれば、かなり色々なことに応用できるはずです。


関連エントリ



参考URL



付録


今回のエントリのサンプルは数が多い反面、ひとつひとつは短いので独立のファイルとしてアップロードすることはしません。各パートからコピー&ペーストしてください。


参考文献/使用機器




フィードバック



にほんブログ村 その他趣味ブログ 電子工作へ

 ↑ 電子工作ブログランキング参加中です。1クリックお願いします。


コメント・トラックバックも歓迎です。 ↓      


 ↓ この記事が面白かった方は「拍手」をお願いします。


tag: Scilab シンボル 線種 凡例 軸ラベル グラフの分割 差し込みグラフ 片対数グラフ 両対数グラフ 

comment

Secret

FC2カウンター
カテゴリ
ユーザータグ

LTspiceAkaiKKRScilabmachikaneyamaKKRPSoCCPAOPアンプPIC強磁性モンテカルロ解析常微分方程式トランジスタodeインターフェース状態密度DOSecalj定電流PDS5022スイッチング回路半導体シェルスクリプト乱数レベルシフトHP6632A温度解析ブレッドボードI2CR6452A分散関係トランジスタ技術可変抵抗確率論数値積分反強磁性セミナー非線形方程式ソルバ絶縁バンドギャップ熱設計偏微分方程式バンド構造GW近似カオス三端子レギュレータLEDフォトカプラシュミットトリガISO-I2CA/DコンバータLM358USBカレントミラーTL431マフィンティン半径PC817C数値微分アナログスイッチ発振回路サーボ直流動作点解析74HC40532ちゃんねる標準ロジックチョッパアンプLDAアセンブラFFTbzqltyイジング模型ブラべ格子開発環境補間量子力学電子負荷BSchパラメトリック解析単振り子基本並進ベクトル熱伝導繰り返しGGAMaximaTLP621ewidthSMP相対論抵抗位相図ランダムウォークスピン軌道相互作用六方最密充填構造不規則合金FETコバルト失敗談QSGWcygwinスレーターポーリング曲線スイッチト・キャパシタラプラス方程式gfortranキュリー温度状態方程式条件分岐格子比熱TLP552LM555TLP521三角波NE555過渡解析FXA-7020ZRWriter509テスタ詰め回路MCUマントルダイヤモンドQNAPデータロガーガイガー管自動計測UPS井戸型ポテンシャルawk第一原理計算仮想結晶近似ブラウン運動差し込みグラフ平均場近似fsolve起電力熱力学OpenMPスーパーセル固有値問題最適化最小値VCAシュレディンガー方程式VESTAubuntu最大値面心立方構造PGAOPA2277L10構造非線型方程式ソルバ2SC1815fccフェルミ面等高線ジバニャン方程式ヒストグラム確率論マテリアルデザイン正規分布結晶磁気異方性interp1フィルタ初期値ウィグナーザイツ胞c/aルチル構造岩塩構造スワップ領域リジッドバンド模型edeltBaOウルツ鉱構造重積分SIC二相共存ZnOquantumESPRESSOCapSensegnuplotmultiplot全エネルギー固定スピンモーメントFSM合金ノコギリ波フォノンデバイ模型ハーフメタル半金属TeXifortTS-110不規則局所モーメントTS-112等価回路モデルパラメータ・モデルヒストグラムExcel円周率GimpトラックボールPC直流解析入出力文字列マンデルブロ集合キーボードフラクタル化学反応三次元Realforce縮退日本語最小二乗法関数フィッティング疎行列シンボル線種ナイキスト線図陰解法負帰還安定性熱拡散方程式EAGLECrank-Nicolson法連立一次方程式P-10クーロン散乱Ubuntu境界条件MBEHiLAPW軸ラベルトランスCK1026MAS830L凡例PIC16F785LMC662AACircuit両対数グラフ片対数グラフグラフの分割specx.f

最新コメント
リンク

にほんブログ村 その他趣味ブログ 電子工作へ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。