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カウンター
カテゴリ
ユーザータグ

LTspiceAkaiKKRmachikaneyamaScilabKKRPSoC強磁性OPアンプPICCPA常微分方程式モンテカルロ解析ecaljodeトランジスタ状態密度インターフェースDOS定電流スイッチング回路PDS5022半導体シェルスクリプトレベルシフト乱数HP6632AR6452AI2C可変抵抗分散関係トランジスタ技術ブレッドボード温度解析反強磁性確率論バンドギャップセミナー数値積分熱設計非線形方程式ソルババンド構造絶縁偏微分方程式ISO-I2CLM358フォトカプラ三端子レギュレータカオスLEDシュミットトリガGW近似A/Dコンバータ発振回路PC817C直流動作点解析USBマフィンティン半径数値微分アナログスイッチTL43174HC4053カレントミラーサーボ量子力学単振り子チョッパアンプ補間2ちゃんねる開発環境bzqltyFFT電子負荷LDAイジング模型BSch基本並進ベクトルブラべ格子パラメトリック解析標準ロジックアセンブラ繰り返し六方最密充填構造SMPコバルトewidthFET仮想結晶近似QSGW不規則合金VCAMaximaGGA熱伝導cygwinスレーターポーリング曲線キュリー温度スイッチト・キャパシタ失敗談ランダムウォークgfortran抵抗相対論位相図スピン軌道相互作用VESTA状態方程式TLP621ラプラス方程式TLP552条件分岐NE555LM555TLP521マントル詰め回路MCUテスタFXA-7020ZR三角波過渡解析ガイガー管自動計測QNAPUPSWriter509ダイヤモンドデータロガー格子比熱熱力学awkブラウン運動起電力スーパーセル差し込みグラフ第一原理計算フェルミ面fsolveCIFxcrysden最大値最小値ubuntu最適化平均場近似OpenMPシュレディンガー方程式固有値問題井戸型ポテンシャル2SC1815TeX結晶磁気異方性OPA2277非線型方程式ソルバフラクタルFSM固定スピンモーメントc/agnuplotPGA全エネルギーfccマンデルブロ集合縮退正規分布キーボード初期値interp1multiplotフィルタ面心立方構造ウィグナーザイツ胞L10構造半金属二相共存ZnOウルツ鉱構造BaOSIC重積分磁気モーメント電荷密度化学反応クーロン散乱岩塩構造CapSenseノコギリ波デバイ模型ハーフメタルRealforceフォノンquantumESPRESSOルチル構造スワップ領域リジッドバンド模型edelt合金等高線凡例軸ラベル線種シンボルトラックボールグラフの分割MAS830LPIC16F785トランス入出力CK1026PC直流解析パラメータ・モデル等価回路モデル不規則局所モーメント関数フィッティング日本語ヒストグラムTS-112ExcelGimp円周率TS-110LMC662片対数グラフ三次元specx.fifortUbuntu文字列疎行列不純物問題ジバニャン方程式ヒストグラム確率論マテリアルデザインP-10境界条件連立一次方程式AACircuit熱拡散方程式HiLAPW両対数グラフ陰解法MBEナイキスト線図負帰還安定性Crank-Nicolson法EAGLE最小二乗法

最新コメント
リンク

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