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 シンボル 線種 凡例 軸ラベル グラフの分割 差し込みグラフ 片対数グラフ 両対数グラフ 

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

LTspiceAkaiKKRmachikaneyamaScilabKKRPSoCOPアンプCPAPIC強磁性モンテカルロ解析常微分方程式トランジスタode状態密度インターフェースecalj定電流スイッチング回路PDS5022DOS半導体乱数シェルスクリプトレベルシフトHP6632Aブレッドボード分散関係温度解析トランジスタ技術R6452A可変抵抗I2Cセミナー確率論反強磁性非線形方程式ソルバ絶縁偏微分方程式バンド構造熱設計数値積分バンドギャップカオスA/DコンバータフォトカプラシュミットトリガGW近似LEDLM358ISO-I2C三端子レギュレータ数値微分サーボ直流動作点解析カレントミラーマフィンティン半径TL431PC817C発振回路74HC4053USBアナログスイッチbzqltyFFTチョッパアンプ2ちゃんねる補間量子力学開発環境電子負荷標準ロジックパラメトリック解析アセンブラ基本並進ベクトルブラべ格子単振り子BSchLDAイジング模型繰り返しMaximaキュリー温度位相図状態方程式失敗談スピン軌道相互作用六方最密充填構造相対論FET抵抗コバルト不規則合金TLP621ewidthGGAQSGWgfortranランダムウォークラプラス方程式スイッチト・キャパシタcygwin熱伝導SMPスレーターポーリング曲線三角波格子比熱LM555条件分岐TLP552MCUNE555UPSTLP521QNAPマントルテスタFXA-7020ZR過渡解析詰め回路ガイガー管ダイヤモンド自動計測Writer509データロガー固有値問題VESTAスーパーセルOpenMP差し込みグラフ平均場近似起電力awk仮想結晶近似VCAubuntufsolveブラウン運動熱力学第一原理計算井戸型ポテンシャルシュレディンガー方程式面心立方構造fccウィグナーザイツ胞interp12SC1815L10構造非線型方程式ソルバFSMキーボードTeX結晶磁気異方性初期値OPA2277化学反応等高線ジバニャン方程式ヒストグラム確率論三次元フィルタRealforcePGAフェルミ面正規分布固定スピンモーメント全エネルギースワップ領域リジッドバンド模型edeltquantumESPRESSOルチル構造岩塩構造二相共存ZnOウルツ鉱構造BaOフォノンデバイ模型multiplotgnuplotc/aノコギリ波合金クーロン散乱ハーフメタル半金属CapSenseマンデルブロ集合マテリアルデザインSICGimpCK1026MAS830L円周率トランスPIC16F785凡例線種シンボルLMC662ヒストグラム不規則局所モーメント文字列疎行列TS-110TS-112Excel直流解析等価回路モデル入出力トラックボールPC軸ラベルAACircuitP-10フラクタル境界条件連立一次方程式Ubuntuifortパラメータ・モデルspecx.f関数フィッティング最小二乗法Crank-Nicolson法陰解法日本語EAGLEMBEグラフの分割負帰還安定性ナイキスト線図熱拡散方程式HiLAPW両対数グラフ片対数グラフ縮退

最新コメント
リンク

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