2015年7月8日水曜日

Octave - グラフの例、編集例

Contents
関数
極方程式
片対数・両対数グラフ
散布図 / scatter plot
3次元グラフ
Contour Plot
Vector Field

横軸・縦軸の範囲を変更する
軸にラベルをつける
グラフの凡例を描画する
凡例(legend)の位置を変える
グリッド線を入れる
一つのウィンドウに複数のグラフを重ねる
一つのウィンドウに複数のグラフを表示する
グラフの保存
グラフの編集




関数

$y = x^2 \sin x$
x = linspace(0,3);
y = x.^2.*sin(x);
plot(x,y)

※注
octave:2> x = 1:10
x =
    1    2    3    4    5    6    7    8    9   10
octave:3> x^2
error: for A^b, A must be a square matrix. Use .^ for elementwise power.
octave:3> x.^2 # . を忘れないように! また.と^の間にスペースが入らないように注意。
ans =
     1     4     9    16    25    36    49    64    81   100

参考
MathWorks: LaTeX を使用した数式を含むテキスト


極方程式

$r = 3 \cos \theta$
theta = linspace(0,pi);
r = 3*cos(theta);
polar(theta, r)
axis([0 4 -2 2])
横軸・縦軸の範囲を変更する
Function File: axis ([X_lo X_hi])
Function File: axis ([X_lo X_hi Y_lo Y_hi])
Function File: axis ([X_lo X_hi Y_lo Y_hi Z_lo Z_hi])


片対数・両対数グラフ

$y = e^{2x + 1}$
x = linspace(0,10);
y = exp(2*x+1);
semilogx(x,y)
semilogy(x,y)
loglog(x,y)

semilogx: x軸が片対数
semilogy: y軸が片対数
loglog: 両対数

散布図 / scatter plot
x = rand(20);
y = rand(20);
scatter(x,y);

x, yの間隔を等間隔にすれば格子点になる
x = -5:5;
[X,Y] = meshgrid(x)
scatter(X,Y,"g", '.');



3次元グラフ

t = linspace(0,10*pi);
x = cos(t);
y = sin(t);
plot3(x,y,t)



$z = \sin ^2 x \cos y$
x = linspace(-10,10);
y = linspace(-10,10);
[xx, yy] = meshgrid(x,y);
z = sin(xx).^2.*cos(yy);
mesh(x,y,z)
surf(x,y,z)
mesh


surf

Contour Plot

$z = x^2 + y^2$
x = linspace(-5,5);
y = x;
[X,Y] = meshgrid(x,y);
z = X.^2 + Y.^2;
contour(z), colorbar;
contourf(z), colorbar;
contour3(z), colorbar;
contour
contourf
contour3

Vector Field

$\vec{F} = \frac{\hat{\mathbf{r}}}{r^2}$
[x,y] = meshgrid(-5:5);
quiver(x,y,x./(x.^2+y.^2).^(3/2),y./(x.^2+y.^2).^(3/2))



横軸・縦軸の範囲を変更する
Function File: axis ([X_lo X_hi])
Function File: axis ([X_lo X_hi Y_lo Y_hi])
Function File: axis ([X_lo X_hi Y_lo Y_hi Z_lo Z_hi])

軸にラベルをつける
plot(x,y)
xlabel('x label')
ylabel('y label')
# zlabel('z label')




グラフの凡例を描画する
plot(x,y)
legend('Line')
#legend('boxoff') # 凡例の外枠が消える

複数のlegendをつける
plot(x,y1, 'b')
hold on
plot(x,y2,'r')
legend('Blue', 'Red')
などとすれば良い。プロットした順に凡例をつける。

凡例(legend)の位置を変える
x = linspace(0,10)
y = x.^2
plot(x,y)
legend('hoge', 'location', 'north')
north 中央上
south 中央下
east 中央右
west 中央左
northeast 右上(デフォルト)
northwest 左上
southeast 右下
southwest 左下

GNU Octave: Plot Annotations


グリッド線を入れる
plot(x,y)
grid on
grid minor on



一つのウィンドウに複数のグラフを重ねる
plot(x1,y1)
hold on (or hold all)
plot(x2,y2)
plot(x3,y3)
・・・


一つのウィンドウに複数のグラフを表示する
subplot(3,2,1) # subplot(row,column,index)
plot(x1,y1)
subplot(3,4,2)
plot(x2,y2)
・・・

グラフの保存
PNGで保存
print -dpng hoge.png

PDFで保存
print -dpdf hoge.pdf

figure 3のグラフを保存する場合
print(3,'hoge.pdf','-dpdf')


グラフの編集
作ったグラフをTeXに挿入するなら
Octaveで出力したグラフをTeXに挿入するまでの手順
or
MATLAB/OctaveのグラフをTikZ形式に変換


グラフ中に矢印やらテキストを挿入するなら

とりあえずプロット --> PDFやSVGで保存 --> LibO Draw + TeXMathsで編集
という流れがやりやすい方法なのではないかと

x = linspace(0,3);
y = x.^2.*sin(x);
plot(x,y)
xlabel('x label')
ylabel('y label')
print('sample.pdf', '-dpdf')
% print('sample.svg', '-dsvg')

※PDFで出力すると余白が異常にあるのでpdfcrop等でカットすると良い。でも編集する時には余白があったほうが編集しやすいので、編集後PDFとしてエクスポートしたあとにpdfcropしたほうがいい
SVGよりPDFのほうが編集しやすい

なんかよくわからないけど、この時点でxlabelとかも編集できる(フォント変えたり、フォントの大きさ変えたり、消去したり)

グラフの部分はいくつかの要素からなっているっぽいので細かい編集をする前に、軸ラベルを除いたグラフ全体を選択して
右クリック --> Group
としておいたほうがいいだろう



ちなみにMATLABはさすがに高いだけあって、グラフの編集がとても簡単にできる
矢印やら、TeXフォントで文字を挿入するなど朝飯前。実に憎たらしい。