MATLAB Language
図
サーチ…
サークル
円を描く最も簡単なオプションは、明らかにrectangle
関数です。
%// radius
r = 2;
%// center
c = [3 3];
pos = [c-r 2*r 2*r];
rectangle('Position',pos,'Curvature',[1 1])
axis equal
矩形の曲率は1に設定する必要があります!
position
ベクトルは矩形を定義し、最初の2つの値x
とy
は矩形の左下隅です。最後の2つの値は、長方形の幅と高さを定義します。
pos = [ [x y] width height ]
円の左下隅 - はい、この円にはコーナーがありますが、想像上の円は中心 c = [3 3]
- 半径 r = 2
で[xy] = [1 1]
です。 幅と高さは円の直径に等しいので、 width = 2*r; height = width;
上記の解の滑らかさが十分でない場合、 三角関数を使って実際の円を描く明白な方法を使用する方法はありません。
%// number of points
n = 1000;
%// running variable
t = linspace(0,2*pi,n);
x = c(1) + r*sin(t);
y = c(2) + r*cos(t);
%// draw line
line(x,y)
%// or draw polygon if you want to fill it with color
%// fill(x,y,[1,1,1])
axis equal
矢印
第1に、 annotation
使用して手作業で正規化された図形単位を処理する必要のない、 quiver
を使用することができます
drawArrow = @(x,y) quiver( x(1),y(1),x(2)-x(1),y(2)-y(1),0 )
x1 = [10 30];
y1 = [10 30];
drawArrow(x1,y1); hold on
x2 = [25 15];
y2 = [15 25];
drawArrow(x2,y2)
重要なのは、 quiver
:0の5番目の引数で、それ以外の場合はデフォルトのスケーリングを無効にします。この関数は通常、ベクトルフィールドのプロットに使用されるためです。 (またはプロパティ値のペア'AutoScale','off'
)
追加機能を追加することもできます。
drawArrow = @(x,y,varargin) quiver( x(1),y(1),x(2)-x(1),y(2)-y(1),0, varargin{:} )
drawArrow(x1,y1); hold on
drawArrow(x2,y2,'linewidth',3,'color','r')
別の矢印が必要な場合は、1が(この回答は役に立ち月で注釈を使用する必要があり、私は震えプロットの矢印ヘッドのスタイルを変更するにはどうすればよいです? )。
矢印の頭のサイズは、 'MaxHeadSize'
プロパティで調整できます。残念ながら一貫していません。その後、軸の限界値を設定する必要があります。
x1 = [10 30];
y1 = [10 30];
drawArrow(x1,y1,{'MaxHeadSize',0.8,'Color','b','LineWidth',3}); hold on
x2 = [25 15];
y2 = [15 25];
drawArrow(x2,y2,{'MaxHeadSize',10,'Color','r','LineWidth',3}); hold on
xlim([1, 100])
ylim([1, 100])
function [ h ] = drawArrow( x,y,xlimits,ylimits,props )
xlim(xlimits)
ylim(ylimits)
h = annotation('arrow');
set(h,'parent', gca, ...
'position', [x(1),y(1),x(2)-x(1),y(2)-y(1)], ...
'HeadLength', 10, 'HeadWidth', 10, 'HeadStyle', 'cback1', ...
props{:} );
end
次のようにスクリプトから呼び出すことができます。
drawArrow(x1,y1,[1, 100],[1, 100],{'Color','b','LineWidth',3}); hold on
drawArrow(x2,y2,[1, 100],[1, 100],{'Color','r','LineWidth',3}); hold on
楕円
楕円をプロットするには、その方程式を使用します 。楕円は、長軸と短軸を持ちます。また、異なる中心点に楕円をプロットできるようにしたいと考えています。したがって、入力と出力が次のような関数を記述します。
Inputs:
r1,r2: major and minor axis respectively
C: center of the ellipse (cx,cy)
Output:
[x,y]: points on the circumference of the ellipse
次の関数を使用して、楕円上の点を取得し、それらの点をプロットすることができます。
function [x,y] = getEllipse(r1,r2,C)
beta = linspace(0,2*pi,100);
x = r1*cos(beta) - r2*sin(beta);
y = r1*cos(beta) + r2*sin(beta);
x = x + C(1,1);
y = y + C(1,2);
end
例:
[x,y] = getEllipse(1,0.3,[2 3]);
plot(x,y);
ポリゴン
頂点のx位置とy位置を保持するベクトルを作成し、 patch
に供給します。
単一多角形
X=rand(1,4); Y=rand(1,4);
h=patch(X,Y,'red');
複数のポリゴン
各ポリゴンの頂点は、 X
、 Y
それぞれの1つの列を占めます。
X=rand(4,3); Y=rand(4,3);
for i=2:3
X(:,i)=X(:,i)+(i-1); % create horizontal offsets for visibility
end
h=patch(X,Y,'red');
疑似4Dプロット
(mxn)
行列を用いて表面によってrepresentesことができるサーフィン 。
サーフェスの色は、 (mxn)
マトリックスの値の関数として自動的に設定されます。 カラーマップが指定されていない場合、デフォルトのものが適用されます。
現在のカラーマップを表示し、データ値のカラーマップへのマッピングを示すために、カラーバーを追加することができます。
次の例では、関数z (mxn)
が生成されます。
z=x.*y.*sin(x).*cos(y);
区間[-pi,pi]
にわたってx
とy
値はmeshgrid関数を使って生成することができ、サーフェスは次のようにレンダリングされます:
% Create a Figure
figure
% Generate the `x` and `y` values in the interval `[-pi,pi]`
[x,y] = meshgrid([-pi:.2:pi],[-pi:.2:pi]);
% Evaluate the function over the selected interval
z=x.*y.*sin(x).*cos(y);
% Use surf to plot the surface
S=surf(x,y,z);
xlabel('X Axis');
ylabel('Y Axis');
zlabel('Z Axis');
grid minor
colormap('hot')
colorbar
図1
今では、追加の情報がz
行列の値にリンクされ、別の(mxn)
行列に格納されている場合があります
サーフェスの色を変更することで、これらの追加情報をプロットに追加することができます。
これにより、 (mxn)
の4Dプロットが可能になります。第1 (mxn)
マトリックスによって生成されたサーフェスの3D表現に対して、第4次元は、第2 (mxn)
マトリックスに含まれるデータによって表されます。
surf
を4入力で呼び出すことで、このようなプロットを作成することは可能です:
surf(x,y,z,C)
ここで、 C
パラメータは第2の行列( z
の同じサイズでなければならない)であり、表面の色を定義するために使用される。
次の例では、 C
行列は関数によって生成されます。
C=10*sin(0.5*(x.^2.+y.^2))*33;
区間[-pi,pi]
C
によって生成される表面は、
図2
今度は4つの入力でsurf
を呼び出すことができます:
figure
surf(x,y,z,C)
% shading interp
xlabel('X Axis');
ylabel('Y Axis');
zlabel('Z Axis');
grid minor
colormap('hot')
colorbar
図3
図1と図3を比較すると、次のことがわかります。
- 表面の形状は、
z
値(第1(mxn)
行列)に対応し、 - サーフェスの色(およびその範囲はカラーバーによって与えられます)は
C
値(最初の(mxn)
行列)に対応し、
図4
もちろん、プロット内のz
とC
を入れ替えて、 C
行列とz
行列で与えられる色の与えられた表面の形状にすることができます:
figure
surf(x,y,C,z)
% shading interp
xlabel('X Axis');
ylabel('Y Axis');
zlabel('Z Axis');
grid minor
colormap('hot')
colorbar
図2と図4を比較する
高速描画
plot(x,y)
、 set(h , 'XData' , y, 'YData' , y)
とanimatedline
3つの主な方法があります。アニメーションを円滑にするには、効率的な描画が必要で、3つの方法が同等ではありません。
% Plot a sin with increasing phase shift in 500 steps
x = linspace(0 , 2*pi , 100);
figure
tic
for thetha = linspace(0 , 10*pi , 500)
y = sin(x + thetha);
plot(x,y)
drawnow
end
toc
私は5.278172 seconds
を得る。プロット関数は、基本的に毎回ラインオブジェクトを削除して再作成します。プロットを更新するより効率的な方法は、 Line
オブジェクトのXData
プロパティとYData
プロパティを使用することです。
tic
h = []; % Handle of line object
for thetha = linspace(0 , 10*pi , 500)
y = sin(x + thetha);
if isempty(h)
% If Line still does not exist, create it
h = plot(x,y);
else
% If Line exists, update it
set(h , 'YData' , y)
end
drawnow
end
toc
今私は2.741996 seconds
、ずっと良いです!
animatedline
は2014bに導入された比較的新しい機能です。それがどのように運賃を見てみましょう:
tic
h = animatedline;
for thetha = linspace(0 , 10*pi , 500)
y = sin(x + thetha);
clearpoints(h)
addpoints(h , x , y)
drawnow
end
toc
3.360569 seconds
、既存のプロットを更新するほど良くはないが、まだplot(x,y)
より優れている。
もちろん、この例のように1行をプロットする必要がある場合、3つのメソッドはほぼ同等で、滑らかなアニメーションが得られます。しかし、より複雑なプロットがある場合は、既存のLine
オブジェクトを更新することで違いが生じます。